面向对象编程的四大特征,面向对象编程的兴衰
面向对象编程的四大特征,面向对象编程的兴衰class ToolbarColorMenuButton * inherits from ColorMenuButton * inherits from MenuButton * inherits from Button * inherits from Control * inherits from Component * inherits from EventTarget * inherits from Disposable * inherits from Object 九层的类继承好多。然而,情况还会变得更糟糕。我记得当我还在谷歌工作的时候,有一个 JavaScript 库 goog.ui,它可以用于创建基于 Web 的用户界面。以下是这个库中某个 UI 组件的继承层次结构:以下是我观察到的一些问题。现实世界并不总是能被整齐地划分成具有明确属性定义的类别。例如,假设我们创
在 90 年代时,有很多面向对象编程相关的教科书和计算机科学课程。它就是“流行趋势”,是计算机的下一个浪潮。如果没有以这种风格编程,那么就是一个糟糕的程序员,或者至少落后于潮流。
当时,计算机科学(CS)专业的学生学习 OOP 的方法非常严格和教条。不仅鼓励实践者以对象和类的形式来构建应用程序,甚至还要求他们从对象和类的角度来考虑问题空间,这种实践方法被称为“面向对象的分析和设计”。
然而,随着时间的流逝,人们开始意识到,严格的面向对象方法会带来很多问题。这些问题往往会使代码更复杂、更难以理解且更难以测试。
事实证明,OOP 更适合某些特定的问题领域。例如,OOP 仍然是构建用户界面(窗口和按钮)最自然的方式 。但是,试图将面向对象技术应用于关系数据库一直是一场灾难。
以下是我观察到的一些问题。
“鸭嘴兽”效应现实世界并不总是能被整齐地划分成具有明确属性定义的类别。例如,假设我们创建了一个代表动物王国的类层次结构。该类层次结构中既包含爬行动物(冷血、有鳞片、产卵等等),又包含哺乳动物 (恒温、有毛、生育等等),还包含鸟类、两栖动物、无脊椎动物等等。
然而,对于鸭嘴兽,它似乎不属于我们上述定义的任何类别。我们要做什么呢?我们是创建一个全新的类别,还是重新考虑整个分类方案呢?就工作量和程序复杂性而言,这两种方法都会产生显著的成本。
深层次结构我记得当我还在谷歌工作的时候,有一个 JavaScript 库 goog.ui,它可以用于创建基于 Web 的用户界面。以下是这个库中某个 UI 组件的继承层次结构:
class ToolbarColorMenuButton * inherits from ColorMenuButton * inherits from MenuButton * inherits from Button * inherits from Control * inherits from Component * inherits from EventTarget * inherits from Disposable * inherits from Object
九层的类继承好多。然而,情况还会变得更糟糕。
在这些高层类中,有许多都被只与少数子类相关的方法和属性“污染”了。例如,“Control”类有 90 多个方法。它具有设置状态的方法,即使特定的子类是无状态的;它有添加和删除子元素的方法,即使控件包含子元素也没有任何意义。
造成这种复杂性的一个重要原因是,该库的作者试图通过将组件放到类层次结构的不同位置来组织组件的不同功能 ,例如,组件是按钮还是滑块,或者组件是否有颜色 。
但实际上,这些不同功能的组件彼此之间无关。咖啡杯是红色的,和它是用陶瓷制成的,基本上是独立的属性。将红色咖啡杯归入“红色物品”的类别,并不比将其归入“陶瓷制品”甚至“家居用品”的类别更正确。任何一个都是任意选择的,因为类别是精神和社会的结构。
在谷歌工作的最后几年里,为了替代 goog.ui,我创建了一个名为“Quantum Wiz”的新用户界面工具包。我们采用的规则之一(以典型的谷歌风格,写成方程式)是:
组合 > 继承
简单地说,这句话的意思是:
“更倾向于使用组合......
点击了解更多,查看全文