为什么静态方法不被认为是好的OO实践?[已关闭]
我正在阅读Scing Scala。在第4章的开头,作者评论说Java支持静态方法,这是“不那么纯粹的OO概念”。为什么会这样?
我正在阅读Scing Scala。在第4章的开头,作者评论说Java支持静态方法,这是“不那么纯粹的OO概念”。为什么会这样?
面向对象是关于三件事:
在这三者中,最重要的是消息传递。
静态方法至少违反消息传递和后期绑定。
消息传递的概念意味着在OO中,计算由相互发送消息的独立对象网络执行。发送消息是通信/计算的唯一方式。
静态方法不会这样做。它们不与任何对象关联。根据通常的定义,它们根本不是方法。它们实际上只是程序。Java静态方法和BASIC子例程之间几乎没有区别。Foo.bar
FOO_BAR
至于后期绑定:一个更现代的名称是动态调度。静态方法也违反了这一点,事实上,它甚至以其名称命名:静态方法。
静态方法破坏了面向对象的一些非常好的属性。例如,面向对象的系统自动对功能安全,对象充当功能。静态方法(或者实际上是任何静态方法,无论是静态状态还是静态方法)都会破坏该属性。
您还可以在自己的进程中并行执行每个对象,因为它们仅通过消息传递进行通信,从而提供一些微不足道的并发性。(基本上,就像Actors一样,这应该不太令人惊讶,因为Carl Hewitt创建了基于Smalltalk-71的Actor模型,而Alan Kay创建了部分基于PLANNER的Smalltalk-71,而PLANNER又是由Carl Hewitt创建的。演员和物体之间的密切关系远非巧合,事实上,它们本质上是同一个。同样,静态(包括静态方法,尤其是静态状态)会破坏这个不错的属性。
不要将“不那么纯粹的OO概念”与“不良实践”混淆。“纯粹的OO”并不是你应该尝试实现的灵丹妙药。仅仅因为静态方法不将实例变量作为参数并不意味着它们没有用处。有些东西只是不适合对象,它们不应该仅仅为了“纯洁”而被迫进入那个模式。
有些人认为事情应该是“纯洁的”,因此任何“不纯洁”的东西都是不好的做法。实际上,不良做法只是做一些令人困惑,难以维护,难以使用等的事情。创建采用实例的静态方法是不好的做法,因为任何采用实例的方法都应该是实例方法。另一方面,像实用程序和工厂函数这样的东西通常不采用实例,因此它们应该是静态的。
如果您想知道为什么它们不是“纯OO”,那是因为它们不是实例方法。“纯”OO语言将所有内容都作为对象,并且所有函数都是实例方法。当然,这并不是一直非常有用。例如,考虑方法。它需要两个数字,不需要任何状态。你甚至可以把它变成一种方法吗?在“纯”OO语言中,它本身可能是一个对象(可能是单例),并且将是一个实例方法,但由于该函数实际上并不在对象中使用任何状态,因此它也不是“纯OO”概念。Math.atan2
Math
atan2
Math