我已阅读下面的讨论:
如果私有helper方法是静态的,如果他们可以是静态的 ,并
如果所有的方法是静态的,如果他们班有没有成员变量
似乎一般人能接受的静态方法,但都有点怀疑它,有以下两个原因:
- 他们是很难测试。
- 他们违反了OO原则。 (他们是功能,而不是方法,说的人。)
而最能接受的静态方法是私有静态的。 既然这样,为什么静态方法都存在,在什么情况下,他们将要采取的首要任务?
我已阅读下面的讨论:
如果私有helper方法是静态的,如果他们可以是静态的 ,并
如果所有的方法是静态的,如果他们班有没有成员变量
似乎一般人能接受的静态方法,但都有点怀疑它,有以下两个原因:
而最能接受的静态方法是私有静态的。 既然这样,为什么静态方法都存在,在什么情况下,他们将要采取的首要任务?
静态方法是不是很难在自己的和测试。 问题是,其他代码调用静态方法是难以测试的,因为你不能取代静态方法。
我认为静态的方法都很好既可以当它们是私有的, 或者当他们是“实用”的方法-例如,做串逃跑。 当您使用要能够模拟出或测试中以其他方式代替事物的静态方法的问题就来了。 工厂方法可能是太有用,虽然依赖注入通常是一个更好的方法-再次,它部分取决于你是否希望能够在测试中,以取代功能。
至于没被“OO” - 不是你在一般OO语言写的一切必须是“纯” OO。 有时,非面向对象的路线简直是更加务实,并导致简单的代码。 埃里克利珀有一个伟大的博客帖子关于这个,不幸的是我现在无法找到。 然而,有一个评论这个职位是相关的。 它谈论的扩展方法,而不是静态方法,但原理是一样的。
扩展方法经常被批评为“不OOP不够。” 在我看来这是本末倒置的马前。 OOP的目的是为通过的谁也不需要知道彼此的工作的内部细节,以富有成效的人的团队编写的大型软件项目的结构指导。 C#的目的是要成为一个有用的编程语言,使我们的客户对我们平台上生产。 显然OOP既是有益的,流行的,因此,我们一直试图可以很容易地在C#中的面向对象语言程序。 但是C#的目的不是“是一个面向对象的语言”。 我们评估基于功能无论他们是为我们的客户,而不是基于他们是否严格遵守的是什么造就了语言的面向对象的一些抽象的学术理想有用的。 我们将乐意接受来自OO,功能性,程序性的,必要的,陈述性的想法,不管,只要我们能做出有利于我们的客户提供一致的,有用的产品。
我想说的是静态方法是绝对OK时,他们的功能 ,即他们没有做任何IO,没有任何的内部状态,只有用自己的参数来计算他们的返回值。
我也想这个延伸到改变其参数的状态,但如果这种过度进行,静态方法应该是正确的,它主要经营的参数类的实例方法的方法。
想想这一刻。 在面向对象的编码,每一个函数调用实际上是这样的:
method(object this, object arg1, object arg2)
在那里,这是您呼叫的对象。 所有这真的是是语法糖这一点。 此外,它可以让因为你有对象变量等你来明确界定的变量的作用域
静态方法根本就没有“这个”参数。 即你传递变量,可能得到的结果退了出来。 1)是主要的原因是人们避开他们,你不能创建一个静态方法(还)的接口,所以你不能模拟出的静态方法来测试它。
其次是面向对象程序功能等静态方法作出了很大的意义在某些情况下,但他们总是可以做成一个对象的方法。
你要知道,你不能没有一个黑客删除此:
static void Main(string[] args)
{
}
启动您的应用程序代码必须调用但没有一个对象的引用。 所以,他们给你的灵活性,无论你选择使用他们在您的场景将通过您的要求为前提。
静态方法是在单件模式提供了太多的灵活性,大多数情况下的罚款。
例如,拿一个简单的工具,如提高原始的力量 - 很明显,你永远需要有任何的多态性。 原始值是静态类型和数学运算的明确界定,并不会改变。 它不象你一生有两个情况不同 的实现一个无无需重写所有的客户端代码,它们之间的切换方式。
(讽刺关闭)
现代JVM是在如果只有一个实现接口的加载内嵌小型调用不错。 除非你有异形你的代码,并知道你的调度公用事业的接口是一个开销,你没有理由不使你的实用方法,为界面 ,可如果需要变化。
静态方法的另一个很好的方案是的实现工厂模式 ,你在哪里,允许类的实例以特定的方式来构造。
考虑Calendar
类,它具有一组静态getInstance
方法,每个方法返回实例引发与所需TimeZone
和/或Locale
或默认值。
我觉得对于静态方法明确的情况是,当你不能让他们动态的,因为你不能修改这个类 。
这是典型的JDK对象,也从外部库未来的所有对象,也基本类型 。
我经常用静态工厂方法代替或者与公共构造相结合。
我这样做,当我需要一个构造函数,做一些事情,你不会指望一个构造做。 从文件或数据库即负载设置。
这种方法还提供冠名“构造”,根据他们所做的事情的可能性。 这是特别有用,当参数本身不足以找出在构造函数中会发生什么。
太阳在使用这种方法
Class.forName("java.lang.Integer");
和
Boolean.valueOf("true");
首先,你不能排除静态的方法是有原因的人还在使用它。
一些设计模式是基于静态方法,单例,例如:
Config.GetInstance();
辅助功能,可以说你有一个字节流,你想一个函数将其转换为十六进制数字的字符串。
有静态的方法很多用途,他说,这并不意味着,有些人滥用它太多(代码审查是最好的选择,当人们滥用代码)。
UTIL类可确定是静态的。 正如上面有人别人的例子,加上漏出的字符串。 问题在于,当这些utils的类执行,我们将需要模拟功能。 例如,在Apache的百科全书fileutils中的类 - 它往往是我要嘲笑的文件的交互,而无需与真正的文件播放的情况。 如果这是一个实例类,它会很容易。
这是很容易重构是静态方法。 它鼓励外地成员,使耦合紧不必要的引用。 它也更容易理解调用代码,因为它明确地传递与之交互的任何对象。
一般来说,我避免静态方法当一个实例将正常工作。 这单个实例可以实现一个接口,可以很容易被嘲笑。 我从来没有说,但我很少用静态。 我告诉我的团队,如果他们想用一个静态的,应该被球队清除。 几乎从来没有为我的答案。