5.1 设计中的挑战
软件设计就是把需求分析转化为编码调试的过程,一个好的高层次的设计能提供一个可以稳妥容纳多个低层次设计的结构。
设计的特点:
设计是个险恶的问题。
ps:险恶的问题就是那种只有通过解决或部分解决才能被明确的问题,也就是在解决过程中出现或确定的问题。
学校里的程序所解决的设计问题很少是险恶的。
设计是个了无章法的过程
设计就是确定取舍和调整顺序的过程
设计受到诸多限制
设计是不确定的
设计是一个启发式过程
设计是自然而然形成的
5.2 关键的设计概念
软件的首要技术使命:管理复杂度
偶然的难题和本质的难题
本质的属性是一件事物必须具备、如果不具备就不再是该事物的属性。偶然的属性是指一件事物碰巧具有的属性有没有这些属性都并不影响这件事本身。
所有这些本质行困难的根源都在于复杂性。
管理复杂度的重要性
当项目确由技术因素导致失败时,其原因通常就是失控的复杂度。
在软件架构的层次上,可以通过把整个系统分解为多个子系统来降低问题的复杂度。软件设计的技术目标也是把复杂的问题变成简单的问题。
管理复杂度的两种方法:
1. 把任何人在同一时间需要处理的本质复杂度的量减少到最小。
2. 不要让偶然性的复杂度无谓的快速增长。
理想设计的特征:
1. 最小的复杂度
如果设计方案不能让程序员在专注于程序的一部分时安心的忽视其他部分的话,这一设计就没什么作用了。
2. 易于维护
3. 松散耦合(程序各组成部分间的关联性最小)
4. 可扩展性(增强功能无需破坏底层结构)
5. 可重用性
6. 高扇入(大量的类使用某个给点的类)
7. 低扇出(一个类中进来少使用其他的类)
8. 可移植性
9. 精简性
10. 层次性
11. 标准技术(尽量标准化常用的方法)
设计的层次
第1层软件系统
第2层分解为子系统或包
为了让子系统之间的连接简单易懂且易于维护,就要尽量简化子系统之间的交互关系。程序中不应该有任何形式的环状关系。
常用子系统分类:
1. 业务规则
2. 用户界面
3. 数据库访问
4. 对系统的依赖性
第3层分解为类
当定义子系统中的类时,也就同时定义了这些类与系统的其余部分打交道的细节。
第4层分解为子程序(程序开发人员完成)
第5层子程序内部的设计(程序开发人员完成)