5.1设计中的挑战
设计就是把需求分析和编码调试连在一起的活动。
险恶的问题就是那种只有通过解决或部分解决才能被明确的问题。
设计是个了无章法的过程。
设计就是确定取舍和调整顺序的过程。
设计受到诸多限制。
设计是不确定的。
设计是一个启发式过程。
设计是自然而然形成的。
5.2关键的设计概念
好的设计源于对一小批关键设计概念的理解。
软件的首要技术使命:管理复杂度
本质属性。
偶然属性。
软件开发就是不断地去发掘错综复杂,相互连接的整套概念的所有细节。
在软件架构的层次上,可以通过把整个系统分解为多个子系统来降低问题的复杂度。
子系统的相互依赖越少,你就越容易在同一时间里关注问题的一小部分。
精心设计的对象关系使关注点相互分离,从而能每个时刻只专注于一件事。在更高汇聚层次上,包提供了相同的好处。
保持子程序的短小精悍能减少思考的负担。
高代价,低效率的设计源于下面三种根源:
1.用复杂的方法解决简单的问题。
2.用简单但错误的方法解决复杂的问题。
3.用不恰当的复杂方法解决复杂的问题。
管理方法:
1.把任何人在同一时间需要处理的本质复杂度的量减到最小。
2.不要让偶然性的复杂度无谓的快速增长。
理想的设计特征:
1.最小的复杂度。
2.易于维护
3.松散耦合
4.可扩展性
5.可重用性
6.高扇入。
7.低扇出。
8.可移植性。
9.精简性。
10.层次性。
11.标准技术。
设计层次:
1.软件系统
2.分解为子系统或包
常用的子系统:业务规则,用户界面,数据库访问,对系统的依赖性。
3.分解为类。
4.分解为子程序。
5.子程序内部设计。
5.3设计构造块:启发式方法。
找出现实世界中的对象
形成一致的抽象。
封装实现细节。
当继承能简化设计时就继承。
隐藏秘密。
秘密和隐私权。两种秘密:隐藏复杂度,隐藏变化源。信息隐藏的障碍。
找出容易改变的区域。变化区域:业务规则,对硬件的依赖性,输入输出,非标准的语言特性,困难的设计区域和构建区域,状态变量,数据量限制。
保持松散耦合。
耦合标准:
规模,模块之间的连接数。
可见性,两个模块之间的连接的显著程度。
灵活性,模块之间的连接是否容易改动。
耦合的种类:
简单数据参数耦合。
简单对象耦合。
对象参数耦合。
语义上的耦合。
查阅常用的设计模式:
设计模式通过把常见解决方案的细节予以制度化来减少出错。
设计模式通过提供多种设计方案而带来启发性的价值。
设计模式通过把设计对话提升到一个更高的层次上来简化交流。
其他的启发式方法:
高内聚。
构造分层结构。
严格描述类契约。
分配职责。
为测试而设计。
避免失误。
有意识的选择绑定时间。
创建中央控制点。
考虑使用蛮力突破。
画一个图。
保持设计的模块化。
5.4设计实践
迭代。设计是一种迭代过程。
你从高层视角中得出的大范围图景会有助于你把相关的底层细节纳入考虑。你从底层视角中所获得细节也会为你的高层决策奠定基础。这种高低层面之间的互动被认为是一种良性的原动力,它所创建的结构要远远稳定于单纯自上而下或者自下而上创建的结构。
分而治之。
建立试验性原型。
合作设计。
要做多少设计才够:最大的设计问题来自于那些我认为是很简单的,而没有做出任何设计的区域。
记录你的设计成果:把设计文档插入到代码里,用wiki来记录设计讨论和决策。写总结邮件。使用数码相机,保留设计挂图。使用CRC卡片,在适当的细节层创建UML图。