小编典典

OOP的劣势?

java

通常,我不想知道OOP缺点的细节,但是当我在最近参加的一次采访中争论时,感觉有点奇怪。发布给我的问题是告诉我面向对象编程(OOP)的一个缺点。那时,我认为OOP是继过程和功能模型之后最成熟的编程级别。因此,我对他说,我完全看不出任何负面影响。

但是面试官说人数很少,如果他不介意的话,我请他列出一个。他举了一个例子,我消化不好。他说,一种面向对象的模式并没有严格执行继承规则,并列举了卫星/火箭的例子,在火箭发射过程中,身体部位会定期分解以减轻重量,并表示继承不支持这种做法。

他的例子对我来说很奇怪,原因是将继承应用于该例子。

我了解他所举的榜样几乎没有任何意义,但是我有一个疑问-

我们是否可以在理想的面向对象设计中动态地拔出类层次结构(我对Java不太有信心)?


阅读 373

收藏
2020-12-03

共1个答案

小编典典

我没有完全理解他的榜样。

但是,重要的是要了解OOP对于可以自然建模的事物非常有效,而对其他事物(例如,横切关注点或方面)则非常无效。这是OOP的缺点之一。另一个是,由于动态调度,它通常会导致一些运行时成本。

另外,很容易滥用OOP进行不合理的抽象。让火箭从身体继承下来就是一个例子。我的经验是,当其他行为(例如聚合)更合适时,新手开发人员要么不信任并且不使用继承,要么过于渴望并错误地使用了继承。随着时间的流逝,对该机制的经验和了解会不断提高。

我不确定他所说的“
OOP模式没有严格实现继承规则”,因为OOP不是模式。一个潜在的问题是,一个人可以写一个违反Liskov替换原则的子类型,因此覆盖方法不会像覆盖方法那样“至少”表现出来。没有办法自动检查这一点,因此有可能编写违反OOP原则的代码。

关于您的最后一个问题“我们可以在理想的面向对象设计中拔掉类层次结构吗?”,我不确定您在这里的意思。如果您要在运行时更改层次结构,并使其在执行过程中不再存在子类型关系,则可以。某些语言(例如Smalltalk)是可能的。有人会说这是“更多的面向对象”。在smalltalk中,类型支持的“方法”是在方法调用时根据当前层次结构和每个类的当前内容确定的。虽然我喜欢smalltalk,但是这并不是我不为所动的功能,因为我更喜欢编译时检查,而运行时的意外次数更少。

2020-12-03