我正在做一个C#项目。之前的程序员不懂面向对象编程,所以大多数代码都在一个类中,分散在几十个甚至上百个方法中(总代码行数约4-5000行)。对这样的项目进行重构是一项巨大的任务,因此现在我已经半适应了现状。
每当一个代码文件中使用到一个方法时,都会实例化该类,然后在该对象实例上调用该方法。
我想知道这样做是否会有明显的性能损失?我是否应该暂时将所有方法设置为静态方法,并且最重要的是,这样做是否会为应用程序带来好处?
我正在做一个C#项目。之前的程序员不懂面向对象编程,所以大多数代码都在一个类中,分散在几十个甚至上百个方法中(总代码行数约4-5000行)。对这样的项目进行重构是一项巨大的任务,因此现在我已经半适应了现状。
每当一个代码文件中使用到一个方法时,都会实例化该类,然后在该对象实例上调用该方法。
我想知道这样做是否会有明显的性能损失?我是否应该暂时将所有方法设置为静态方法,并且最重要的是,这样做是否会为应用程序带来好处?
从这里得知,静态调用方法比每次调用实例方法都构造一个实例快4到5倍。然而,在每次调用中只涉及数十纳秒时间,因此除非您有真正紧密的循环调用方法数百万次,否则您不太可能注意到任何好处,并且通过在循环之外构造单个实例并重复使用它,您可以获得相同的好处。
由于您必须更改每个调用站点以使用新的静态方法,因此您最好花时间逐步进行重构。
我曾经遇到过类似的问题,我的前任程序员创建了一个控制器类,将所有的BLL函数都倒入其中。
我们现在正在重新设计系统,并根据它们应该控制的内容创建了许多控制器类,例如UserController、GeographyController、ShoppingController等。
在每个控制器类内部,它们都有使用单例模式调用缓存或DAL的静态方法。
这给我们带来了两个主要优点。它稍微快一些(大约快2-3倍,但这只是纳秒级别);另一个是代码更加简洁。
即:
ShoppingController.ListPaymentMethods()
而不是
new ShoppingController().ListPaymentMethods()
我认为如果类没有维护任何状态,使用静态方法或类是有意义的。
这取决于该对象包含的其他内容--如果"对象"只是一堆函数,那么这可能不是世界末日。但如果对象包含许多其他对象,则实例化它将调用所有它们的构造函数(以及在删除时调用它们的析构函数),你可能会遇到内存碎片等问题。
话虽如此,现在看来性能并不是你最大的问题。
ShapeUtils.DrawCircle(stroke, pen, origin, radius);
ShapeUtils.DrawSquare(stroke, pen, x, y, width, length);
VS
ShapeUtils utils = new ShapeUtils(stroke,pen);
util.DrawCircle(origin,radius);
util.DrawSquare(x,y,width,length);
我认为你在提问时已经部分回答了这个问题:你的代码中是否有任何显著的性能惩罚。
如果惩罚并不明显,你不一定需要采取任何行动。(尽管毫无疑问,逐步重构成体面的面向对象模型将会极大地提升代码库的效益)。
我的意思是,只有当你注意到性能问题时,它才是一个问题。