自己对面向对象的思考

来源:互联网 发布:最好的php开发工具 编辑:程序博客网 时间:2024/05/16 00:39

以前学习C语言的时候知道有一个词叫“面向过程编程”,之后学习了JAVA又知道了“面向接口编程”和“面向对象编程”。自己也看过一些OOP/OOD方面的书,包括设计模式方面的经典“砖头”,例如《深入浅出设计模式》,《元素模式》,《UML建模与模式应用》,《企业应用架构模式》,也包括测试驱动开发,领域驱动设计,敏捷开发,极限编程等。也在网上看到了很多人说OOP完全不同于面向过程编程。可是有一点却是很少有人提及,就是为什么会出现OOP。最大的原因是由于软件的复杂程度急剧的上升,问题越来越复杂,所以催生新的思考方法,这种思考就是将问题看做对象,以这种思维方式来设计系统,来设计接口,来设计模块。

OOP中一定有“类”的概念,这个学过一门面向对象编程语言的人都知道。类中无非两个东西:属性和方法。这真的是经典之作,他把世间万物抽象成了类,这是一种高度的归纳也是一种高度的抽象,《Thinking in JAVA》中经典名言:“一切皆对象”。计算机学科中核心在于“抽象”,用抽象来简化问题,进而解决问题,这种思想不管是网络、操作系统、数据结构还是其他具体分支中都贯穿其中。在我看来,“对象”这种形式映射到现实生活中就是活物。在用面向对象的思维思考时一定要把所有的物体看做活物,而非真正现实中的简单映射。一旦将所有物体看做有自己生命力的活体,就会明白在一本书里面讲到的“让对象能够自主活动,而非外界对该对象施加操作”,同时这也符合OOP的原则。

面向对象的三大特征:封装、继承和多态。这也是现实中的映射。其实计算机本身就是现实的映射,是一个聚集体,是建立在其他学科上的凝结物。

OOP的六大原则:SRP(单一职责原则)、OCP(开闭原则)、LSP(里氏替换原则)、DIP(依赖倒置原则)、ISP(接口隔离原则)、LKP(迪米特原则)。这些原则作为一种约束力会让程序设计的更加完善,更具有可伸缩性和可扩展性,而非很多人说的无用功。

在面向对象程序设计中,很重要是将变化与不变化的模块分开。这也是为了以后的扩展,也是出于方便。这一点我觉得不是从生活中得出的结论,而是单纯从程序角度出发得出的结论。

在《Effitive JAVA》中倡导多用组合少用继承,二者的使用场景不同,并不能相互替换:类继承强调的是抽象复用(属于同一类)而对象组合强调的是实现复用(借用一下其他对象的行为实现)。绝大部分设计模式都基于继承或者组合实现,甚至有的设计模式比如适配器模式使用继承和组合都是正确的,分别为类适配器和对象适配器模式。而有的设计模式比如桥梁模式则是典型的同时使用了继承和组合,分别负责抽象部分和实现部分的复用。

在设计模式方面,还有另一个容易混淆视听的词就是架构模式,两者是两个层次的思想。设计模式是软件的战术思想,而架构是软件的战略决策。GOF的32种设计模式,其他诸如MVC , MVP , MVVM等位架构模式。本人以前还以为是一个东西。

Jason McC.Smith大作《元素模式》提出了16种元素模式:创建对象、检索、继承、抽象接口、委托、重定向、集聚、递归、归复方法、扩展方法、委托型集聚、重定向型递归、信托型委托、信托型重定向、表亲型委托、表亲型重定向。元素模式和设计模式一样,都是在制定软件系统中共通问题的解决方案。不过,元素模式认为设计模式还是化合物,应该有更基础的元素思想。所有的面向对象的程序设计都可以仅使用四个事物来进行建模,它们分别是对象、方法、字段和类型。其中将方法、字段、和类型作为基本建模素材是很显然的,因为它们分别代表着程序设计的三个基本元素:功能、数据存储和数据描述。而对象又是面向对象程序的核心点和关键点,没有对象就没有面向对象程序设计。

这只是自己对于面向对象的思考和想法,敬请赐教。

1 0