面向对象程序设计思想(精华)

面向对象语言具有封装,继承,多态的特征。那么在用面象对象语言进行程序设计的时候,我们应该要注意些什么,遵守哪些原则呢。 我们都知道在面向对象世界中拥有5大关系,6大原则,23种设计模式。那么他们是什么关系,到底有什么用呢。
 
我们定义类来封装对象,应该尽量的保证类职责的单一性,从而提高他的灵活性,重用性,扩展性和维护性。如果类职责R因为某种原因(比如说新需求)变成两个职责R1、R2,这时就发生了职责扩散。这个时候如果业务逻辑足够简单,我们可以修改原来的代码来满足新的职责;如果业务复杂但是类结构简单,我们可以新增方法来兼容。但是这时已经违反了单一职责原则,但这却是可以接受的,因为类依然具有一定程度的灵活性。当不满足这两种情况的时候,我们必须要重构设计来满足此原则。(单一职责原则)
 
类可以实现多个接口,类实现接口应该建立在最小的接口上,实现他必须的接口,不实现非必须的接口。在接口本身满足单一职责原则的情况下,各个接口必然是职责单一的。如果实现了非必须的接口,那么就会发生变更扩散。通俗上讲变更扩展是另一种形式的职责扩散。当类实现多个非必须接口往往会引入多个职责从而发生职责扩散。因此我们在设计上应该分散的定义多个接口满足单一职责原则,从而避免变更扩散,提高灵活性和可维护性。(接口隔离原则)
 
在面向对象编程中,继承给我们带来很大的灵活性和扩展性。但是庞大繁琐的继承结构往往会带来更多的复杂度以及难以维护。继承在面向对象编程中代表着 is a 的类的父子关系。子类就是父类,父类出现的地方都可以透明的替换成子类对象。多态是面象对象的另一特征,我们在继承时可以去重载父类的方法,因此他给我们带来了更大的灵活性和扩展性。在同时也给程序带来了巨大的破坏性和不确定性,使程序难以维护。因此在我们进行程序设计时要去维护正确的继承结构体系,从而维护系统架构的稳定性。继承时尽量去重载抽象方法,不去重载非抽象方法。在子类扩展新的方法。重载方法时保证前置条件更加宽松,后置条件更加严格。(里氏替换原则)
 
在程序设计时,我们往往创建多个具有不同职责的类,来提高系统的灵活性和扩展性。但是要实现一个复杂的业务逻辑就需要把这些类组合起来,形成更为复杂庞大的结构,他们间的交互关系错综复杂。UML中有五大关系:泛化(is a),关联(has a),聚合(has a),组合(contains a),依赖(use a)。在面向对象语言中继承和实现接口可以简单归结为泛化关系。 关联,聚合,组合,依赖都是在讲对象间的交互关系;由此可见对象间的关系的组织是多么的重要。 组合是一种强类型的聚合,聚合是单向的,聚合对象可以独立存在。但组合对象是一种整体性结构,不可独立存在,具有相同的生命周期。聚合是一种特殊的关联关系。关联不单是单向的,还可以是双向的叫双向关联,相互之间没有强制的约束关系,存在的形式可能是拥有一个成员变量的引用。当然这3种关系都是类范围内的关系,但是依赖关系却是方法范围内的。依赖体现为方法形参、返回值或静态调用。(五大关系)
 
在类与类之间相互交互时,应该使依赖的别的对象降到最少,因此叫最少知道原则。如果称形参、返回值、成员变量为直接朋友,其他依赖的对象叫间接朋友,那我们应该尽量依赖直接朋友不要去依赖间接朋友,保证只与直接朋友通信。如此一来类之间的耦合势必降到最低,类内达到较高聚合性。从而实现高耦合低内聚。(迪米特原则)
 
在软件设计时,按不同的职责创建大量具有不同职责的类,而将相关职责的类组合到一起形成模块,将相关的模块组合到一起形成子系统,再将子系统组合起来将形成系统。而同时可以使类、模块、子系统达到最大程序的重用。那么在对他们进行重新组合重用时,必须保证结构的稳定性,依赖的高度抽象性。软件设计的过程本质就是将现实世界抽象为计算机模型的过程。而抽象模型与具体模型相比往往更加稳定。因此我们要依赖抽象而不要去依赖具体。不管是类与类之间,还是模块与模块之间,他们不应该相互依赖,他们应该共同依赖抽象(接口),这实质上就是面向接口编程,从而也实现模块与模块间的低耦合,模块内的高内聚。(依赖倒置原则)
 
我们从类的角度理解了单一职责原则,从接口的角度理解了接口隔离原则,从继承角度理解了里氏替换原则,从UML角度理解了迪米特原则,从系统的角度理解了依赖倒置原则。如果将这五大原则联合起来考虑就不难发现他们实现了一个共同的目标就是实现软件的稳定性和扩展性: 对修改关闭,对扩展开放。这就是开闭原则,他是前五种原则的总纲。 (开闭原则)
 
简单总结,单一职责原则要求我们保证类的职责单一,避免职责扩展,提高类的灵活性与重用性。接口隔离原则要求我们分散定义接口,避免变更扩散,提高重用性与稳定性。里氏替换原则要求我们维护继承体系,在拥有软件扩展性的同时兼顾架构的稳定性。迪米特原则要求我们减少对别的对象的依赖,提高类内部的聚合性。依赖倒置原则要求我们面向接口编程,提高软件的扩展性和稳定性。开闭原则是总纲,是其他几个原则要实现的终级目标。

猜你喜欢

转载自yunchow.iteye.com/blog/2154997