Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 避免静态方法过度使用的提示_Language Agnostic_Static Methods - Fatal编程技术网

Language agnostic 避免静态方法过度使用的提示

Language agnostic 避免静态方法过度使用的提示,language-agnostic,static-methods,Language Agnostic,Static Methods,我正在重构一些代码,我正在研究一个名为HFile的类。HFile具有所有私有构造函数,因此您无法实际创建它的实例。而不是按如下方式创建HFiles实例: var file = new HFile('filename') file.Save() 所有HFile交互都是通过静态方法处理的。因此,如果我想保存一个文件,我会调用: HFile.save('filename') 然后在内部创建并保存一个HFile实例。显然,在不了解整个故事的情况下,任何读者都必须保留判断,但在我的工作场所,使用静态方

我正在重构一些代码,我正在研究一个名为HFile的类。HFile具有所有私有构造函数,因此您无法实际创建它的实例。而不是按如下方式创建HFiles实例:

var file = new HFile('filename')
file.Save()
所有HFile交互都是通过静态方法处理的。因此,如果我想保存一个文件,我会调用:

HFile.save('filename')

然后在内部创建并保存一个HFile实例。显然,在不了解整个故事的情况下,任何读者都必须保留判断,但在我的工作场所,使用静态方法似乎已经变得非常流行。所以我想知道,对于静态方法的使用,是否有一些好的原则/最佳实践可以帮助一群人坐下来检查静态方法的使用。

一般来说,如果您的情况需要封装状态或组织结构,那么您将使用类

另一方面,如果您有一些横切关注点,并且可以广泛地应用于应用程序中,则可以考虑静态实用程序类中的方法。NET框架(和Java)中的code>System.Math就是一个例子


在您的示例中,HFile可能是一个状态为的对象,因此我通常不会使用静态方法来保存它。只需对特定的HFile对象进行方法调用,而不必将整个对象传递给静态方法进行保存,这样更简单。这在您的特定应用程序中是否有意义取决于您的应用程序的范例是否将HFile对象视为要传递并由外部方法处理的对象,或者视为能够保存自身的独立对象。

静态方法很难测试,因为您无法模拟它们。出于这个原因,我们倾向于在我工作的地方避开它们。虽然我们确实将它们用于工厂方法。

这不是非常面向对象的,是吗。现在也许你的地方不太喜欢OO代码,这很好。但是,如果您想封装数据和方法,那么您需要实例方法来处理该数据

大量的静态方法可能与许多全局变量有关。如果要调用静态HFile.save('filename'),则试图保存到文件名中的信息必须是全局的。一般来说,我们会尽量减少全局变量,以使事情更易于管理


但是如果你想写过程代码,那没关系。

大量的静态方法/静态类是过程性的一个症状——用面向对象的语言写过程代码。我所知道的消除这种思维的最好方法是彻底理解面向对象的原则和实践。使用测试驱动开发并强制代码可测试将有所帮助,因为为静态类编写测试要困难得多。最终,如果您使用TDD,您自然会倾向于更解耦的OO体系结构,即使只是为了减轻测试的痛苦。

IMO静态方法对于您所描述的目的没有用处,这在您的工作场所很常见。 此方法的缺点:
-创建一个表示文件的对象的目的是为了在其上调用一个方法,这有什么意义
-无法使用基于接口的多态性

为了回答您的问题,以下是一些我将使用静态方法的案例:
-一种实用方法,它执行与类的功能相关的操作,但不与任何一个对象相关。也许它需要一组对象并对它们进行比较。也许它会进行一些通用的数据操作(转换等)。
-您需要使用类变量执行与类相关的操作

-在您想要实现单例设计模式的地方,我不会像担心这些方法在做什么那样担心静态方法的数量。返回值或修改作为参数传递的对象的静态方法?没什么大不了的。修改私有静态字段的静态方法?我担心。修改属于其他类的公共静态字段的静态方法?我需要躺在黑暗的房间里,额头上抹一块湿毛巾。

静态方法可以制造出很好的装载机(一种工厂方法)。我还发现,在资源锁周围使用它们以避免阻塞其他进程是非常有成效的。将语言或平台放入标记中将是一个好主意。我同意。我个人从来不需要使用静态方法来修改私有静态变量,或者更糟糕的是,从另一个类中修改静态变量!静态方法的测试是最容易编写的测试,前提是您不持有任何静态。@RobertHarvey如果它是一个纯函数,没有副作用,没有依赖项(或者如果所有依赖项都作为参数给出),那么这是正确的。老实说,我没见过很多这样的课程。另外,如果需要消除对它们使用的依赖性,那么在其他类中使用它们可能会非常困难——这可能是我没有看到太多它们的原因,因为我强调可测试性。这些是我编写的唯一一种静态方法。请看.NET framework中的数学课,看一个有代表性的例子。@RobertHarvey当然,我也写了一些类似的例子,但它们并不是我工作的很大一部分。这是我唯一的观点。通常,可测试性问题会阻止我编写此类代码。我想补充一点,在实例化所有依赖项的类中可以使用静态工厂方法(例如Guice@Provides方法),但在常规代码中使用静态工厂方法会损害可测性,因为与使用普通静态方法一样,它们将您的代码锁定为使用特定的实现,并防止您模仿依赖关系。