面向对象的编程方法为什么使用起来不理想?
容我黑一波Java!Java简直就是对OOP概念滥用的极致。
其他语言里,OOP是为程序员服务;Java里,OOP是为程序员添堵。
对于程序员来说,最苦恼的事情就是数据和程序如何和谐共处的问题,这两者是密切相关的,数据的定义改了程序就要修改;反过来,程序的功能变了,数据也要修改。
但是数据和程序的定义方法是两种不一样的语法,如果分开来写,谁也不知道哪段程序和哪段数据是相关的了。
C程序员表示脑容量足够,分开写就分开写C++程序员把数据和程序合在一起写了一个class。
做不到的时候他们还是用C程序员的办法。
Java程序员要更加高瞻远瞩一些,他们是这么看这个问题的:数据和程序应该享有相同的权利。
Java程序员把数据加了一大堆getter和setter,然后把程序写进了一个static class,于是他有了两个类。
他对此感到很满意。
在Java的世界里,数据和程序都是class,这代表了公平和民主。
后来Java程序员对有main函数的class非常不满,觉得这侵犯了其他class的平等权,于是他们发明了JavaBean。
从此以后他们再也不知道自己的程序究竟有多少个入口了。
Java程序员对没有implements的class感到恐惧,这代表它不能充分的实现多态性,调用这个类的代码不能正确调用其他有相同功能、相同接口的类。
于是他给每个class创建了一个接口一模一样的interface。
实际上这个interface从此以后再也没有其他class实现过。
每次修改接口的时候,还要两个文件一起修改。
Java程序员极端排斥使用Object类型的指针,这代表自己对这个类型一无所知,甚至无法区分这个类型是自己定义的class还是别人定义的class。
后来他定义了一个叫做MyObject的interface,再让所有的interface继承这个interface,再让所有的class实现那些继承自MyObject的interface,确保所有的类的实例都可以转换成MyObject类型。
他感觉好多了。
Java程序员想用一个接口抽象出自己所有类的生命周期特性,来实现究极的多态。
这个接口有start和stop两个方法,文档规定返回true表示成功,返回false或者抛出异常表示失败。
最后99%的类的实现中,这两个方法的实现都是:return true;Java程序员对单个方法的实现超过10行感到非常不安,这代表自己的代码可重用性很差。
于是他把一个3个参数的长方法拆成了4个子过程,每个子过程有10个以上的参数。
后来他觉得这样很不OOP,于是他又创建了4个interface和4个class。
Java程序员喜欢思考哲学问题。
他之前思考一个问题思考了一个星期,这个问题是:创建服务究竟应该是Server类的方法还是ServerManager类的方法。
后来他决定,创建服务完整的流程应该是ServerManager的方法,但其中把服务注册到Server的过程应该是Server的方法。
之后的一个星期他在考虑这个方法究竟应该是私有方法还是公有方法。
Java程序员发明了很多设计模式,用来把不OOP的问题转换成OOP的形式,只需要多写两倍的代码。
欢迎一起黑!