设计的普遍规律,不只单讲如何设计类,向上到整个组件的设计,向下到类中单个方法的设计
单一职责原则——SRP
就一个类而言,应该仅有一个引起它的变化的原因
原则
最简单,最单纯的事情最容易控制,最有效
类的职责简单而且集中,避免相同的职责分散到不同的类之中,避免一个类承担过多的职责
减少类之间的耦合
当需求变化时,只修改一个地方
组件
每个组件集中做好一件事情
组件的颗粒度
发布的成本
可重用的成本
方法
避免写臃肿的方法
Extract Method
重构
Move Field/Move Class
Extract Method/Extract Class
最简单的,也是最难以掌握的原则
实例分析
Olite
开放封闭原则——OCP
软件实体(类,模块,函数)应该是可以扩展的,但是不可修改的
原则
对扩展是开放的,当需求改变时我们可以对模块进行扩展,使其具有新的功能
对更改是封闭的,对模块扩展时,不需要改动原来的代码
面对抽象而不是面对细节,抽象比细节活的更长
僵化的设计——如果程序中一处改动产生连锁反应。
对更改是封闭的,对模块扩展时,不需要改动原来的代码
面对抽象而不是面对细节,抽象比细节活的更长
僵化的设计——如果程序中一处改动产生连锁反应。
方法
条件case if/else 语句
重构
Replace Type Code With Class
Replace Type Code With State/Strategy
Replace Conditional with polymorphism
实例
插件
数据驱动的OrderCycle
Liskov替换原则 LSP
子类型必须能够替换它的基类型
原则
主要针对继承的设计原则
所有派生类的行为功能必须和客户程序对其基类所期望的保持一致。
派生类必须满足基类和客户程序的约定
IS-A是关于行为方式的,依赖客户程序的调用方式
重构
Extract Supper Class
实例
长方形和正方形
依赖倒置原则DIP
a:高层模块不应依赖于底层模块,两者都应该依赖于抽象
b:抽象不应该依赖于细节,细节应该依赖于抽象
原则
如何解释倒置
高层依赖底层,重用变得困难,而最经常重用的就是framework和各个独立的功能组件
高层依赖底层,底层的改动直接反馈到高层,形成依赖的传递
面向接口的编程
实例
Ioc模式
DomainObject / DomianObjectDataService
参考
《敏捷软件开发 原则、模式与实践》
打印 | 张贴于 2004-11-30 19:38:00 | Tag:拥抱变化

留言反馈
我搜集了原则方面的文章,有空去看看吧
http://www.objecttutor.com/search.php?key=原则
希望能到【面向对象辅导员】交流
“我的原则是面向需求,面向问题.设计开发首先是解决需求和问题的.
其实模式问题只要继承.接口这些真正弄明白了,设计时自然就有自己合适的模式. ”
其实模式问题只要继承.接口这些真正弄明白了,设计时自然就有自己合适的模式.
我们所做的一切都是为了一个目标,使软件开发更简单。编写简单,维护简单,修改简单。
围绕着这个目标,我们在不断的实践,实现这个目标,有几个方向,减少耦合,面向抽象,动态生成,数据驱动等等
从面向过程演化到面向对象,虽然最低层的机制是类似的,都是找到地址调用代码段,但是怎么样找到真正需要执行的代码段这是机器要做的事情,程序员可以在抽象的层面考虑问题,可以自顶向下的进行开发,可以在更广的范围考虑代码重用,表达抽象可以用继承、接口或者其他的手段,怎么样更好的利用抽象这一工具也总结出很多设计模式,随着人们的实践,工具的发展,一些新的模式出来,一些旧的模式消亡,接口的用处越来越广泛,传统的面向对象思想在发展,要泛型,要AOP,代码动态生成等等,配置文件越来越复杂,成为与源代码的一部分。
另外,在建模的方面,从代码生成以及双向工程,到集成现成模式到模型中,现在有的工具厂家尝试不用写代码就可以检查建模的正确性,还有的人在推可执行的uml。
总之,让机器越来越聪明,让人做的事情越来越简单。
Indeed, it is this inversion of dependencies that is the hallmark of good object-oriented design. It doesn't matter what language a program is written in. If its dependencies are inverted, it has an OO design. If its dependencies are not inverted, it has a procedural design.
也就是说,是否满足DIP原则是区分传统面向过程的设计和正经面向对象设计的关键所在——这是很多所谓面向对象设计者的重要误区,好像用了C++/Java/C#就面向对象了,其实根本就不是这样的。
当然,并不是说其他原则就不重要了,SRP/OCP/LSP等等其实都是用于验证一个设计是否从面向对象设计技术得到实际好处的基本原则。毕竟我们不是为了面向对象而面向对象,我们根本还是要通过利用面向对象技术在软件设计、开发与维护方面实实在在的得到好处,对吧!:)
俺最强调的是开放封闭原则,不管开发人员用什么方法,只要能做到对扩展开放,对修改封闭,不是什么方法,都是好方法 :)
当然OCP可能没有DIP那么好的直接指导实践。
are you talking to the book,<Agile Software Development Principles,Patterns,and Practices>,it is very diffrent what i have read.