高质量的设计往往有一些共同的特点。如果你能达到这些对象,那么可以认为你的设计也是非常成功的。有些对象是互相矛盾的。但是这是设计的挑战所在,在相互矛盾的对象之间做出合理的折衷。某些高质量设计的特点同时也是高质量程序的特点——可靠性。其余的则是设计所独有的。
以下是设计所独有的一些特点:
智力上的可管理性:对于任何系统来说,智力上的可管理性都是其重要目标之一。它对于整个系统的完整性是非常重要的,并且会影响程序员们开发和维护系统的难易程度。
低复杂性:低复杂性实际上是智力上的可管理性一部分,由于上述同样的原因,这点也很重要。
维护的方便性。维护的方便性意味着设计时要为负责维护的程序员着想。在设计中,要不停地想象维护程序中将会对你的设计提出的问题。应该把维护程序员当作你的听众,同时把系统设计成明白易懂的。
最小的联系性:最小的联系性指的是按照保持子程序之间的联系最少的原则来设计,应该利用强内聚,松散耦合和信息隐蔽等作为指导原则来设计系统,使其内部的联系性尽可能少。最小的联系性可以极大地减小综合、测试和维护阶段的工作量。
可扩充性:可扩充性指的是不必影响系统的内部结构,就可以对系统的功能进行强化,你可以改变系统的某一部分而不影响其余部分,使得最大可能性变动对系统带来的影响最小。
可重复使用性: 可重复使用性指的是把系统设计成其中许多部分是可以被其它系统借用的。
高扇入:高扇入指的是对于一个给定的子程序来说,应该有尽可能多的子程序调用它。高扇入表明一个系统在低层次上充分利用了功能子程序。
低或中等程度扇出:低或中等扇出指的是对一个确定的子程序来说,它所调用的子程序应该尽可能地少。高扇出(大约7个以上)说明一个子程序控制了许多其它子程序,因此可能是很难理解的。而中等扇出则表明一个子程序只把任务交给了数量较少的其它子程序,因此是比较容易理解的。低扇出(少于4个)看起来像是一个子程序没有把足够的任务交给其余的子程序去做,但经验表明并不是这样。一项研究表明有42%只调用一个子程序的子程序是没有错误的,有32%的调用 2~7个子程序是没有错误的,而在调用7个以上子程序的情况中,只有12%是没有错误的。
可移植性:可移植性指的是把系统设计成很容易转到另外的环境下运行。
简练性:简练性指的是把系统设计得没有任何多余部分。
有人说,当一本书不能删掉,而不是不能添补任何内容时,才可以认为它已完成了。在软件中,这也是非常正确的,因为当你对系统进行改进时,你不得不对冗余的代码进行开发、评审、测试和维护等等工作,而且在开发软件的新版本时,新版本也不得不与这些冗余的代码兼容。最有害的观点是“多加入些又不会有害,怕什么呢?”
成层设计:成层设计指的是尽量分解的层次是成层的,这样你可以在每一个单独的层次上观察系统,同时也可以使观察的层次是连续的。也就是说当你在某一层次上观察系统时,不会看到在其它层次上看到的东西。
你会经常遇到某些子程序和软件在几个层次上起作用。这样会使系统很混乱,应尽力避免。
如果在编写一个先进系统时,不得不借用许多旧的、设计得不好的代码,那么你可以在新系统中建立一个层(layer),与那些旧代码相联接。精心设计这个层使它把旧代码的缺点隐含起来,从而使新层表现了一整套连续的功能。然后,让程序的其余部分调用些子程序而不是直接调用旧代码。成层设计的好处是:(l)它可以使你避免与拙劣的旧代码直接打交道;(2)一旦你想废弃那些旧代码中的子程序的话,只要修改一下接口层就可以了。
标准化技求:标准化技术是深受欢迎的。
一个系统使用的奇特的、非标准的技术越多,当别人第一次读它时就会越感到可怕,也越难理解。应该通过采用常用的、标准化的技术使得人们在阅读它时是一种熟悉的感觉。
以下是设计所独有的一些特点:
智力上的可管理性:对于任何系统来说,智力上的可管理性都是其重要目标之一。它对于整个系统的完整性是非常重要的,并且会影响程序员们开发和维护系统的难易程度。
低复杂性:低复杂性实际上是智力上的可管理性一部分,由于上述同样的原因,这点也很重要。
维护的方便性。维护的方便性意味着设计时要为负责维护的程序员着想。在设计中,要不停地想象维护程序中将会对你的设计提出的问题。应该把维护程序员当作你的听众,同时把系统设计成明白易懂的。
最小的联系性:最小的联系性指的是按照保持子程序之间的联系最少的原则来设计,应该利用强内聚,松散耦合和信息隐蔽等作为指导原则来设计系统,使其内部的联系性尽可能少。最小的联系性可以极大地减小综合、测试和维护阶段的工作量。
可扩充性:可扩充性指的是不必影响系统的内部结构,就可以对系统的功能进行强化,你可以改变系统的某一部分而不影响其余部分,使得最大可能性变动对系统带来的影响最小。
可重复使用性: 可重复使用性指的是把系统设计成其中许多部分是可以被其它系统借用的。
高扇入:高扇入指的是对于一个给定的子程序来说,应该有尽可能多的子程序调用它。高扇入表明一个系统在低层次上充分利用了功能子程序。
低或中等程度扇出:低或中等扇出指的是对一个确定的子程序来说,它所调用的子程序应该尽可能地少。高扇出(大约7个以上)说明一个子程序控制了许多其它子程序,因此可能是很难理解的。而中等扇出则表明一个子程序只把任务交给了数量较少的其它子程序,因此是比较容易理解的。低扇出(少于4个)看起来像是一个子程序没有把足够的任务交给其余的子程序去做,但经验表明并不是这样。一项研究表明有42%只调用一个子程序的子程序是没有错误的,有32%的调用 2~7个子程序是没有错误的,而在调用7个以上子程序的情况中,只有12%是没有错误的。
可移植性:可移植性指的是把系统设计成很容易转到另外的环境下运行。
简练性:简练性指的是把系统设计得没有任何多余部分。
有人说,当一本书不能删掉,而不是不能添补任何内容时,才可以认为它已完成了。在软件中,这也是非常正确的,因为当你对系统进行改进时,你不得不对冗余的代码进行开发、评审、测试和维护等等工作,而且在开发软件的新版本时,新版本也不得不与这些冗余的代码兼容。最有害的观点是“多加入些又不会有害,怕什么呢?”
成层设计:成层设计指的是尽量分解的层次是成层的,这样你可以在每一个单独的层次上观察系统,同时也可以使观察的层次是连续的。也就是说当你在某一层次上观察系统时,不会看到在其它层次上看到的东西。
你会经常遇到某些子程序和软件在几个层次上起作用。这样会使系统很混乱,应尽力避免。
如果在编写一个先进系统时,不得不借用许多旧的、设计得不好的代码,那么你可以在新系统中建立一个层(layer),与那些旧代码相联接。精心设计这个层使它把旧代码的缺点隐含起来,从而使新层表现了一整套连续的功能。然后,让程序的其余部分调用些子程序而不是直接调用旧代码。成层设计的好处是:(l)它可以使你避免与拙劣的旧代码直接打交道;(2)一旦你想废弃那些旧代码中的子程序的话,只要修改一下接口层就可以了。
标准化技求:标准化技术是深受欢迎的。
一个系统使用的奇特的、非标准的技术越多,当别人第一次读它时就会越感到可怕,也越难理解。应该通过采用常用的、标准化的技术使得人们在阅读它时是一种熟悉的感觉。