常见要隐藏的信息
容易改动的区域
对硬件有依赖的地方
输入和输出
非标准语言特征
难于设计和实现的域
状态变量
数据规模限制
商业规则
复杂的数据
复杂的逻辑
面向对象设计的步骤是:
· 识别对象及其属性,它往往是数据。
· 确定对每个对象可以做些什么。
· 确定每一个对象可以对其它对象做些什么。
· 确定每个对象对其它对象来说是可见的部分——哪一部分是开放的,哪一部分是专用
的。
· 确定每个对象的公共接口。
当你编写程序快结束时,你非常希望能有机会再重新编写一次,因为在编写过程中你对问题又有了更深的理解。这对设计也是同样适用的,只不过在设计中这个循环的周期更短,带来的好处也更大,因此,你完全可以在设计过程中进行几次往返。
定义成只有通过解决它或者部分解决它,才能给出明确定义的问题。这个似是而非的定义事实上暗示着你不得不首先“解决”这个问题,对其有一个清楚的定义和理解,然后再重新解决一遍,以获得正确的解决办法。(关于险恶问题的一个富于戏剧性的例子便是托卡马大桥的设计。在修建大桥时,主要考虑的便是它应该能承受设计载荷并能抗12 级大风。然而,没人想到风在吹过桥时会产生“卡门旋涡”——一种特殊的空气动力学现象,从而使桥产生横向简谐振动。结果,在1940 年的一天,只在7 级风的作用下,桥便因振动而坍塌了。 )
一种很有效的启发工具就是硬算(暴力穷举)。不要低估它。一个有效的硬算解决方案总比优雅却不能解决问题的方案要好。
受迎的设计特点
以下是设计所独有的一些特点:
智力上的可管理性。对于任何系统来说,智力上的可管理性都是其重要目标之一。它对于整个系统的完整性是非常重要的,并且会影响程序员们开发和维护系统的难易程度。
低复杂性。低复杂性实际上是智力上的可管理性一部分,由于上述同样的原因,这点也很重要。
维护的方便性。维护的方便性意味着设计时要为负责维护的程序员着想。在设计中,要不停地想象维护程序中将会对你的设计提出的问题。应该把维护程序员当作你的听众,同时把系统设计成明白易懂的。
最小的联系性。最小的联系性指的是按照保持子程序之间的联系最少的原则来设计,应该利用强内聚,松散耦合和信息隐蔽等作为指导原则来设计系统,使其内部的联系性尽可能少。最小的联系性可以极大地减小综合、测试和维护阶段的工作量。
可扩充性。可扩充性指的是不必影响系统的内部结构,就可以对系统的功能进行强化,你可以改变系统的某一部分而不影响其余部分,使得最大可能性变动对系统带来的影响最小。
高扇入。高扇入指的是对于一个给定的子程序来说,应该有尽可能多的子程序调用它。高扇入表明一个系统在低层次上充分利用了功能子程序。 低或中等程度扇出。低或中等扇出指的是对一个确定的子程序来说,它所调用的子程序应该尽可能地少。
简练性。简练性指的是把系统设计得没有任何多余部分。Vol ta i re 曾说过,当一本书不能删掉,而不是不能添补任何内容时,才可以认为它已完成了。在软件中,这也是非常正确的,因为当你对系统进行改进时,你不得不对冗余的代码进行开发、评审、测试和维护等等工作,而且在开发软件的新版本时,新版本也不得不与这些冗余的代码兼容。最有害的观点是“多加入些又不会有害,怕什么呢?”
成层设计。成层设计指的是尽量分解的层次是成层的,这样你可以在每一个单独的层次上观察系统,同时也可以使观察的层次是连续的。也就是说当你在某一层次上观察系统时,不会看到在其它层次上看到的东西。你会经常遇到某些子程序和软件在几个层次上起作用。这样会使系统很混乱,应尽力避免。
标准化技求。标准化技术是深受欢迎的。一个系统使用的奇特的、非标准的技术越多,当别人第一次读它时就会越感到可怕,也越难理解。应该通过采用常用的、标准化的技术使得人们在阅读它时是一种熟悉的感觉。