设计原则

1         设计原则
软件设计的根本原则:高内聚,低耦合。
1.1       “开闭”原则(OCP
一个软件实体应当对扩展开放,对修改关闭。(Software entities should be open from extension, but closed for modification.)
里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤是抽象化(抽象出对外的行为)。而基类与子类的继承关系就是抽象化的具体体现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
1.2       里氏代换原则(LSP
由Barbara Liskov提出。它的严格表达式如下:
如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得T1定义的所有程序P在所有的对象o1都代换成o2时,程序p的行为没有变化,那么类型T2是类型T1的子类型。
反过来代换则不成立。
这个原则是继承复用的基石。只有当子类可以替换掉基类,软件单位的功能不会受到影响时,基类才能被真正复用。
1.3       依赖倒转原则(DIP
1.3.1       依赖/耦合的种类
两个类之间可以发生三种不同的耦合关系:
² 零耦合(Nil Coupling):两个类之间没有关系。
² 具体耦合(Concrete Coupling):两个具体类(可实例化)之间,一个类对另一个类直接引用。
² 抽象耦合(Abstract Coupling):在一个具体类和一个抽象类之间。
1.3.2       DIP
抽象不应当依赖于细节,细节依赖于抽象。(Abstractions should not depend upon details. Details should depend upon abstracts)
另一种说法是:面向接口编程,不要针对实现编程。(Program to an interface,not an implementation)
1.4       接口隔离原则(ISP
使用多个专门的接口比使用单一的总接口要好。
换言之,从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小的接口上的。
1.4.1       接口定义
第一种指的是Java语言中的有严格定义的Interface结构。此时,接口隔离原则讲的就是为同一个角色提供宽、窄不同的接口,以对付不同的客户端。(定制服务原则)
另一种是一个类型所具有的方法特征的集合,这仅仅是一种逻辑上的抽象。这样的话,接口的划分就直接带来类型的划分。一个接口相当于剧本中的一种角色,一个接口应简单地代表一个角色。(角色隔离原则)
1.4.2       与迪米特法则的关系
迪米特法则要求任何一个软件实体,除非绝对需要,不然不要与外界通信。即使必须进行通信,也应当尽量限制通信的广度和深度。
显然,定制服务原则拒绝向客户端提供不需要的行为,是符合迪米特法则的。
1.5       合成/聚合复用原则(CARP
就是在一个新的对象内使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。
简短描述就是:尽量使用合成/聚合,尽量不要使用继承。
1.5.1       与里氏原则的对立统一
一般来说对违反里氏原则的设计进行重构时,可以采用两个办法:一是加入一个抽象超类;二是将继承关系改写成合成/聚合关系。
统一的根本是要区分“Has-A”和“Is-A”。只有严格遵循里氏原则的才是“Is-A”。
1.6       迪米特法则(LoD
又叫最少知识原则(Least Knowledge Principle-LKP),就是说,一个对象应当对其他对象有尽可能少的了解。1987年秋天由Ian Holland在美国东北大学(Notheastern University)为一个叫做迪米特(Demeter)的项目设计提出的。
1.6.1       狭义的迪米特法则
如果两个类不必直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。即不要和陌生人说话。
只要当前对象引用到的(所能直接看到的对象)都不是陌生人。
缺点:会在系统内造出大量的小方法,散落在系统的各个角落。这些方法仅仅是传递间接引用,而与系统的业务逻辑无关。容易造成不同模块间的通信效率降低,也会使系统的不同模块之间不容易协调。
为了克服狭义的迪米特法则的缺点,可以使用依赖倒转原则,引入一个抽象的类型来引用“抽象陌生人”对象,使“某人”依赖于“抽象陌生人”。换言之,就是将“抽象陌生人”变成朋友。
如Façade模式和Mediator模式。
1.6.2       广义的迪米特法则
广义的迪米特法则主要用意是控制信息的过载。讲的其实就是信息隐藏和信息访问控制,即封装。
 
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页