【阅读】我们还需要OOP吗?

2019/06/25 ARTS OO编程

原文

Goodbye, Object Oriented Programming

概述

  1. OOP三大基石:继承,封装&&多态。但是这三块基石并没有想象中那么好。
  2. 继承,乍看之下,OO范式之精髓。可重用性是开发中的重要性怎么吹都不过分,而继承简直就是福音啊有没有……不过,等等:
    1. 香蕉-猴子-丛林问题:要开发一个类,发现之前已经有一个相对基(niu)础(bi)的类可以用,可重用性啊!来,继承一下,完美…嗯,等等这个基类还有依赖其他类呢,还要包含进来。哦,等等,还有父父类…Erlang作者说了:OO语言的问题是他们隐式地包含了一大堆东西进来。你其实只是要一根香蕉,但是你发现你得到了一只猩猩拿着一根香蕉以及整片丛林。怎么解决咧?层级不能嵌套太深,可重用性还有其他方法嘛,还有contain(包含?)以及delegate(委托?)可以用。
    2. 钻石(菱形)问题:这个问题大家都知道了,已经有好些OO语言不支持这么使用了。即使可以这么用的语言(我没说是C++),可以通过contain&&delegate解决。
    3. 脆弱基类问题:一般情况下,我不需要关系基类函数的内部实现,我们只需要知道他提供的功能就行了,所谓的“黑盒编程”。文中提到了一种情况,基类的内部实现改变,导致子类行为出错。这种情况子类是防不胜防的,这可能设计到一大堆子类行为的改变。这种情况没有很好的解决方案,只能把基类打开来看了,即从“黑盒编程”转为“白盒编程”。很烦啊有没有。
    4. 层级问题:一般使用继承时,基类一般都是较为抽象,或是具有一般性,子类在此基础上更为具体。这样的组织方式构成分类等级。但是现实并不总是这样组织,你遇到的情况往往是多个事物并没有明显的层级关系,比如文档与公司,往往是你会给事物打上各种不同的标签(Tags),比如你会给硬盘上的一份文件打上不同的标签;或者事物间是包含关系,比如房间里有把椅子。这样看好像没层级什么事啊,说好的继承映射世间万物呢。
  3. 封装。看上去完美啊,不该你看到的你就看不到,也不能乱来。不过真的是这样吗?不要忘记了,我们有引用,有指针啊。知道我要讲什么了吧。加入某个类A初始化传入某个其他类B指针or引用,A中某个私有成员指向or引用了这个B。那么这个B类的操作其实间接影响了A的私有成员。说好的封装呢。也许你能通过深拷贝来解决,不过性能呢?醒醒吧。
  4. 多态。这货没什么不好,但是我们不需要使用面向对象的多态呀,使用基于接口的多态就不需要担心面向对象带来的某些负担。也更容易有没有。
  5. 综上,是不是可以跟面向对象say goodbye了。
  6. 是不是推崇一波函数式编程了……

点评

没有银弹,没有什么编程范式可以一统江湖。去其糟粕,取其精华。多学多用。避开前人踩过的坑。俺还没有被OOP蹂躏过不足以谈弃坑啊。

Search

    Table of Contents