面向对象的设计

对象是什么?
概念层面:对象是拥有某种责任的抽象
规格层面:对象是一系列可被其它对象使用的公共接口
实现层面:对象封装了代码和数据

 

 

 

-----------------------------------------

类设计指导性原则:

-----------------------------------------

1. 针对接口编写,而不是针对实现编程 

 

 客户无需知道所使用对象的特定类型,只需要知道客户所期望的接口

2. 优先使用对象组合,而不是类继承 

 

 类继承通常为“白箱复用”,对象组合为“黑箱复用”。继承在某种意义上破坏了封装性,子类与父类的耦合度相当高;而对象组合只要求被组合对象具有良好定义的接口,耦合度低

 

 

 

 

3. 封装变化点 

 

 使用封装来创建对象间的分界层,使设计者可以在分界层的一侧对代码进行修改,而不会对另一层产生不良的影响

 

 

 

4. 使用重构得到模式

  

 设计不应该先入为主,一上来就使用模式是对模式最大的误用

 Refactoring to patterns

 

 

 

-----------------------------------------

类设计具体原则:

-----------------------------------------

1. 单一职责原则(Single-Resposibility Principle)


一个类应仅有一个引起它变化的原因


软件设计真正要做,就是发现职责并把那些职责相互分离
单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责,通常意味着单一的功能,因此不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因

 

建议
a. 一个类只有一个引起它变化的原因,否则就应当考虑重构。
b. SRP由引起变化的原因决定,而不由功能职责决定。虽然职责常常是引起变化的轴线,但是有时却未必,应该审时度势。
c. 测试驱动开发,有助于实现合理分离功能的设计。
d. 可以通过Facade模式或Proxy模式进行职责分离。

 

 


2. 开放-封闭原则(Open-Closed Principle)


软件实体(类,模块,函数等等)应该是可以扩展的,但是不可修改的
Open for extension, Close for modification


绝对的封闭是不可能的,必须对所设计的模块应对哪种变化封闭做出选择,猜测出最有可能发生变化的种类,然后构造抽象来隔离那么变化
猜测是很困难的,除了很明显可能发生变化的种类外,一般的情况是等到变化发生时,立即采取行动,创建抽象来隔离变化,从而应对以后类似的变化
遵循该原则,可带来面向对象技术所声称的巨大好处:可维护、可扩展、可复用、灵活性好


建议
a. 开放封闭原则,是最为重要的设计原则,Liskov替换原则和合成/聚合复用原则为开放封闭原则的实现提供保证。
b. 可以通过Template Method模式和Strategy模式进行重构,实现对修改封闭、对扩展开放的设计思路。
c. 封装变化,是实现开放封闭原则的重要手段,对于经常发生变化的状态一般将其封装为一个抽象,例如银行业务中的IBankProcess接口。
d. 拒绝滥用抽象,只将经常变化的部分进行抽象,这种经验可以从设计模式的学习与应用中获得。

 

 


3. 里氏替换原则(Liskov Substitution Principle)

子类必须能够替换掉他们的父类型

 

 

 


4. 依赖倒置原则(dependence inversion principle)


1) 高层模块不依赖底层模块,两者都依赖抽象
2) 抽象不应该依赖于细节,细节应该依赖于抽象

 

简而言之:针对接口编程,不用对实现编程

 

 


5. 接口隔离原则(Interface-Segregation Principle)


多个专用接口优于一个单一的通用接口


一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染

 

本原则是单一职责原则用于接口设计的自然结果。一个接口应该保证,实现该接口的实例对象可以只呈现为单一的角色;这样,当某个客户程序的要求发生变化,而迫使接口发生改变时,影响到其他客户程序的可能生性小

 

 


6. 迪米特法则(Law of Demeter) 又叫最少知识原则


talk only to your immediate friends


如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用

 

 

 

 7. 合成/聚合复用原则


尽量使用合成/聚合,尽量不要使用类继承


继承从某种意义上说是一种强耦合,即子类与父类的耦合度相当的高,而聚合则是一种接口式的复用,具有较弱的耦合度

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值