这两天看了《代码大全》的第五章——“软件构建中的设计”,这一章是我目前为止看过页数最多的一章,一共有五十多页,内容也非常丰富,从设计中的挑战、设计概念到设计的具体实践和一些流行设计方法的评论。我准备把这一章分到两篇博文去写,这一篇主要介绍前一部分,设计中的挑战和关键设计概念。
首先先来介绍设计中的挑战。“软件设计”一词以为着器构思、创造发明一套方案,把一份计算机软件的规格说明书要求转变为可实际运行的软件。设计就是把需求分析和编码调试连在一起的活动,好的高层次设计能提供一个可以稳妥容纳多个较低层次设计的结构。好的设计对于小型项目非常有用,对于大型项目就更是不可或缺。
设计中的挑战可以归纳为以下几点:
1、设计是一个险恶的问题。“险恶的”问题就是那种只有通过解决或部分解决才能被明确的问题。这个定义看似矛盾,其实是说你必须把这个问题解决过一遍以便能够明确地定义它,然后再次解决该问题,形成一个可行的方案。
2、设计是个了无章法的过程。软件设计的成果应该是组织良好、干净利落的,然而形成这个设计的过程却并非如此清爽。事实上,犯错正是设计的关键所在——在设计阶段犯错并加以改正,其代价要比在编码后才发现同样的错误并彻底修改要低得多。
3、设计就是取舍和调整顺序的过程。设计者工作的一个关键内容便是去衡量彼此冲突的各项设计特性,并尽力在其中寻求平衡。你经常需要权衡软件快速的反应速度和缩减开发时间之间那个更重要。
4、设计是不确定的。如果你让三个人去设计一套同样的程序,他们很可能会做出三套截然不同的设计,而且每套设计都很不错。上楼可能只有几种方法,当设计计算机程序却通常有数十种方法。
5、设计是一个启发式的过程。设计过程中充满了不确定性,因此设计技术也就区域具有探索性,而不是保证能产生预期结果的可重复的过程。
6、设计是自然而然形成的。设计不是在谁的脑袋中直接跳出来的,它是在不断的设计评估、非正式讨论、写实验代码以及修改实验代码中演化和完善的。
好的设计源于对一小批关键设计概念的理解,作者接下来分别阐述了“复杂度”扮演的角色、设计应具有的特征、以及设计的层次。
当项目由技术原因导致失败时,其原因通常就是失控的复杂度,管理复杂度是软件开发中最为重要的话题。没有谁的大脑能容得下一个现代的大型计算机程序,在软件架构的层次上,可以通过把整个系统分解为多个子系统来降低问题的复杂度。
高质量的设计应当包含以下的基本要素:最小的复杂度、易于维护、松散耦合、可扩展性、可重用性、高扇入(较好地利用底层工具类)、低扇出(一个类里适中地使用其他的类)、可移植性、精简性、层次性。
设计的层次分为:1、整个软件系统。2、分解为子系统和包。3、分解为包中的类。4、分解为类中的数据和子程序。5、子程序内部的设计(具体的数据和算法)。
PS:在“分解为子系统”部分中作者提出了一个较好地实现跨平台的建议,我觉得非常有用:如果你正在开发一个运行于Microsoft Windows操作系统上的程序,可以把所有与Windows相关的系统调用都隔离起来,放到一个Windows接口子系统总,这样一来,如果日后你想把程序移植到Mac OS或Linux操作系统时,只要修改接口子系统就可以了。