当前位置: 首页 > 面试题库 >

OOP的劣势?

丌官向荣
2023-03-14
问题内容

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

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

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

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

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


问题答案:

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

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

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

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

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



 类似资料:
  • 我对面向对象编程有这种困惑。对于我编写的一些代码,我必须回答一些问题: 此代码中使用的OOP原则是什么 它们是如何应用的 解释此代码中使用的OOP概念 在这里,我不理解这两个词“原则”和“概念”之间的区别。它们是一样的吗?还是不同? 我知道有4个面向对象的原则。 继承权 在我的代码中,我有setter方法、getter方法、抽象类、类之间的继承。所以我的回答是: > 继承,抽象,封装,多态性。 我

  • 本文向大家介绍Sigmoid 与tanh的区别优劣?相关面试题,主要包含被问及Sigmoid 与tanh的区别优劣?时的应答技巧和注意事项,需要的朋友参考一下 sigmoid对于前向传播比较友好,将值映射到0,1之间,但是反向传播容易出现梯度消失的情况,并且进行幂计算比较耗时,产生的信号为非0均值信号,会对反向传播造成影响,而tanh将其映射到-1,1之间,数据分布均值为0

  • OOP 的思想, 无疑是非常实用有效的. 事实是, 无论语言是否直接支持面向对象的编程. 程序员在写代码的时候常常会应用 OOP 的思想. 但是 Go 语言下没有类(Class), 没有 this 指针, 没有多态, 只有复合. 应用 OOP 的思想, WEB 应用下控制器常见形式祖先类型的写法(示意代码). type Controller struct { Data interface{

  • 1.【强制】 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用类名来访问即可。 2.【强制】 所有的覆写方法,必须加@Override 注解。 说明: getObject()与 get0bject()的问题。一个是字母的 O,一个是数字的 0,加@Override 可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。 3.

  • 1.【强制】 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。 2.【强制】 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。 3.【推荐】 类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter / setter方法。 说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好 ; 保护方法虽

  • 问题内容: Smalltalk OOP和Simula OOP之间在哲学上有区别吗? 这是一个与Java&C#与C 间接相关的问题。据我了解,C 基于Simula,但是Java和C#或多或少地来自Smalltalk系列。 问题答案: 在更广泛的OOP标语中有几个“风格”上的关键“差异”。 在所有情况下,关于 静态 或 动态 类型系统的声明主要意味着一个或另一个,这个问题远非明确或明确定义的。同样,许