SOLID Is OOP for Dummies

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

你肯定知道SOLID这个首字母缩略词。它代表了面向对象编程的五个原则,如果遵循这些原则,你的代码应该能够变得易读和可扩展。这些原则在近30年前被引入,但是它们真的让我们成为更好的程序员吗?我们真的因为它们而更好地理解面向对象编程吗?我们写出更多“易读和可扩展”的代码吗?我不这么认为。

让我们逐个原则来看看它们是如何“帮助”的。

“S”代表单一职责原则,根据《Clean Code》(http://amzn.to/2m7LmaA)作者Robert Martin的说法,这意味着”一个类应该只有一个改变的理由”。

这个说法对我来说听起来非常模糊,但是书中对此进行了解释,指出对象必须以问题为中心,负责”一件事”。当然,我们需要决定这个”一件事”是什么。

这就是我们所了解的”高内聚性“,自从1974年拉里·康斯坦丁在IBM系统杂志上写过相关内容以来。为什么需要在15年后创造一个名字模糊且定义非常可疑的新原则呢?

这封信是关于开放/封闭原则,它由Bertrand Meyer在1988年的《面向对象软件构造》一书中引入。简单来说,这意味着对象不应该是可修改的。对于这一点,我完全同意。

但随后它又说它应该是可扩展的,字面上通过实现继承来实现,这被认为是一种反面的面向对象编程技术。因此,这个原则对于对象和面向对象编程并不真正适用。它可能适用于模块和服务,但不适用于对象。

第三个字母是关于Liskov替换原则,由Barbara Liskov于1987年引入。这是SOLID五原则中最无害的一部分。简单来说,它指出如果你的方法期望一个Collection,那么一个ArrayList也可以工作。

它也被称为子类型化,是任何面向对象语言的基础组成部分。为什么我们需要将其称为原则并”遵循”它?有可能在没有子类型化的情况下创建任何面向对象软件吗?如果这是一个原则,那么我们也应该在这里加上”变量”和”方法调用”。

老实说,我怀疑这个原则主要是为了填补”S”和”I”之间的差距而被添加到SOLID中的。

我猜他们两个都是由罗伯特·马丁(Robert Martin)在他在施乐公司工作时引入的。

“接口隔离原则”(Interface Segregation Principle)指出,如果你只需要“Collection x”甚至“Iterable x”,就不要声明“List x”。我非常赞同。我们来看下一个。

“依赖倒置原则”(Dependency Inversion Principle)意味着,你应该声明“List x”而不是“ArrayList x”,并让对象的提供者决定它是“ArrayList”还是“LinkedList”。我也觉得这个原则很合理。

然而,这一切与康斯坦丁在1974年一同引入的老式“松耦合”有什么不同呢?我们真的需要为了更好地学习而简化和模糊吗?不,不是为了更好地学习,而是为了更好地销售。这就是我的观点。

这些原则本质上只是对“内聚性和耦合性”进行了一个非常初级、模糊和可销售的解释。小白会购买书籍、研讨会和培训,但实际上无法真正理解其背后的逻辑。他们真的需要吗?他们只是编码人员,对吧?

“但一个对象必须负责一件事!”这是我在会议上经常听到的。人们学习到这个口号,甚至不知道内聚是什么,也不理解他们所祈祷的这个“一件事”究竟是什么。其实并不存在所谓的“一件事”,朋友们!内聚有不同的层次。

谁有罪?鲍勃大叔和他的伙伴们。

他们不比雷德利·斯科特和其他好莱坞赚钱大师们更好,他们只是为了牟利而拍摄简单易懂、容易流泪的电影。人们看电影变得更愚蠢了,但这并不是他们关心的事。面向对象编程的魔法原则也是如此,程序员依赖它们,认为真理就在那里,而实际上连这个“魔法”的创造者都没有真正理解其真相。

SOLID是一个赚钱的工具,而不是改善代码的工具。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 16:33

sixnines availability badge   GitHub stars