面向对象编程的弊端是什么?
如果一个模块根本没有扩展的需求,没有多人协作的需求,花时间达成OCP又有什么意义呢?设计类关系的时候忘记了OOP的初心,可能就会写出很多没有帮助的类,白白浪费人力和运行效率。所以,假如所有代码都是你一个人维护,没有什么扩展的需求,那么多用一些switch也未尝不可;假如你的代码是要被别人使用或者使用了别人的代码,OOP很可能就是你需要用到的工具。除了OOP,Type class和Duck Typing都是可以帮助你达成OCP原则的工具。当然,如果你使用的语言是Java,这两种工具都不用想了。
封装性,继承性,多态性,这些特性在敏捷开发的情况下还那么重要吗?
封装性:在所有代码都公开,随时可能被修改被重构的情况下,封装性意义没有想象的那么大,虽然它仍然有价值。它的价值在于使程序行为更可预期。
继承性:继承的本目的是在不修改代码的情况下扩展代码的功能,但如果我们能够自由修改代码,那继承在绝大多数时候并不是最佳选择。事实上,巨大的类设计开销往往都是继承性带来的。继承性在今天不但没有太大的价值,反而常常有害。(这里所说的继承性指的是 invalid s 所说的第一种情况,对他说的第二种情况,我不认为那算作继承性,而应该被算作多态性。)
多态性:多态性要求一个函数在接受不同的类型对象作为参数时自动表现出不同的行为。或者说要求不同类型的对象都可以调用相同名字的方法,并且自己处理应该有的不同行为。——这个特性在今天依然重要,而且是最重要的特性,它的存在意味着 OOP 的价值仍然存在——即便对于非 OOP 的程序设计语言。只要应用了多态性思想,那么其实它就是 OOP 的。考虑一下 Linux 中的「一切皆文件」的概念,其实换句话说就是对一切对象皆可调用用于文件的那些方法,这妥妥的是「多态性」。图形界面的编程 API 中,一切对象皆可 Paint(),一切对象皆可 toString(),这妥妥的也是「多态性」。