面向对象设计随感
面向对象不一定要有类,类只不过是一种组织数据的方式罢了。
因为软件的本质是用代码对现实世界问题域的建模,是问题域到代码的映射,所以只要能做到结构保持,形式倒不那么重要。其实也就是一个抽象的过程。
类其实是一种设计模式。个人感觉类是为了解决软件开发中日益增长的复杂性,而发明出来的更大粒度的代码抽象。因为在大型项目中,如果采用过程化的设计(这里的定义可能有点狭隘,这里单指那种结构化的低层设计,指的并不是那种整体的架构风格),函数作为最大粒度的抽象单元未免有点不足,全局变量+函数显然是不能很好地把数据和行为组织起来的;至于耦合度与正确性之类的问题就更不必说,如果连抽象都吃力,更高的要求也就无从谈起了。
所以,面向对象应运而生。“对象”这种更大粒度的抽象相对来说可以降低开发的复杂度,因为语言的抽象能力提升了。而类只是为了实现面向对象思想而弄出来的一种数据结构(一年前我就在思考结构体与类的异同,但好像一直没弄明白)。语言的发展,其实就是语言抽象能力和语言维度的不断提升。比如,Reflect(叫自省还是反射倒无所谓)和metadata(元数据)给语言以自解释能力,OOP与AOP的结合,切面的引入直接让语言进入了更高维度。
看到一种有趣的说法,‘Classes mean copies.’ ,类的本质是复制。
When traditional classes are instantiated, a copy of behavior from class to instance occurs. When classes are inherited, a copy of behavior from parent to child also occurs.
Polymorphism (having different functions at multiple levels of an inheritance chain with the same name) may seem like it implies a referential relative link from child back to parent, but it’s still just a result of copy behavior.
也就是说,无论是实例化、继承还是多态,乃至别的一些什么,这些面向对象的根基,都是基于一种复制的行为。实例化是把一个类(抽象概念)所具有的数据和行为复制到实例中,继承是子类复制了父类的行为,多态也是如此。所以才有了面向对象(Object Oriented)和基于对象(Object-Based)的区别吧。没有了“继承”和“多态”的对象,就不能协作,不能完成对现实世界的抽象吗?未见得。
我之前认为,“程序=状态+函数”,并且觉得自己与前人的观点不同,以此欣然自喜。现在想来,还是没有跳出“程序=数据结构+算法”这个著名的论断啊。
引用这句著名的话来结尾吧:
Algorithms + Data Structures = Programs.
向Niklaus Wirth致敬。