在软件设计的分层上,需要特别提及以下几点:
1)分层是为了控制复杂度。分层的程度取决于产品的复杂程度。如果产品简单,也许不需要开发人员完全执行从系统需求分析到编码的各个层次。如果产品极其复杂,那么可能会增加新的层次或者将现在的某一层分解为更多细节层次。
2)层次间的地位是不平等的。开展工作越早的层次地位越重要、越高级。只有早期(高)层次质量优秀,才可能将后期(低)层次也设计得同样优秀。如果早期(高)层次有质量问题,后期(低)层次也无法弥补。
3)不要等待高层次完全设计完成后再开始低层次设计。各层次只是相对的工作划分,不是绝对的先后顺序。对于同一个功能A来说,必须要先完成高层设计,然后才能进行低层设计。但是对于两个独立功能A和功能B来说,一旦A的高层设计完成,不需要等待B的高层设计结果,就可以开始A的低层设计工作。软件产品会包含很多相对独立的功能,没必要等到所有功能的高层设计完成再进行低层设计。
4)只有编码完成之后才能真正验证设计的有效性,所以要尽早开始编程工作。不论层次高低,只要编码未完成,产品不能运行,就不能算是真正地验证了设计的有效性。所以要保证设计质量,只能尽早开始编程,尽早进行验证,尽早发现并修正问题,尽早达到设计质量。当然,“早”也是相对的,还是需要逐层设计完成才能进入编码工作。
5)综合第3点和第4点可以发现,最适合于层次式设计分工的开发方式是迭代:为每个相对独立的功能安排迭代,为不同功能安排不同的迭代,既符合逐层设计要求又能尽早验证有效性;尽早建立一个可运行的代码原型,既可以作为后期需求迭代的基础,又可以作为早期需求验证的基础。
我们还可以额外延伸一点:从第4点来说,在学习很多软件设计知识(例如体系结构风格、设计模式、OO原则等)时必须经过代码的检验才算掌握;不论各种图模型记忆得多么准确、各种关键解释如何清晰,只要没有把这些知识融入代码,就不能算是真正掌握了这些知识。