本节书摘来自华章计算机《软件建模与设计: UML、用例、模式和软件体系结构》一书中的第1章,第1.8节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.8 软件建模和设计方法的发展
在20世纪60年代,软件程序经常是在几乎没有进行任何系统化的需求分析和设计的情况下开发出来的。图形化的表示法(主要是流程图)经常在编码之前的详细设计规划中作为文档工具或者设计工具使用。创建子程序的最初目的是通过在程序中不同的部分调用代码块使其能够得到共享。很快,人们意识到子程序可以作为一种构造模块化系统的手段,并将其用作一种项目管理工具。程序可以被划分为多个模块,其中每个模块可以由单个的程序员进行开发并实现为一个子程序或函数。
随着结构化编程在20世纪70年代早期的发展,自顶向下设计以及逐步精化的思想(Dahl 1972)成为主流的程序设计方法,其目的是提供系统化的结构化程序设计方法。Dijkstra在T.H.E.操作系统的设计过程中提出了最早的软件设计方法之一(Dijkstra 1968),该方法使用了层次化的体系结构。这是第一个用于并发系统(即操作系统)设计的设计方法。
在20世纪70年代中晚期,两种不同的软件设计策略占据了主导地位:面向数据流的设计和数据结构化设计。结构化设计中的面向数据流的设计方法(参见Budgen[2003]中的概览)是最早出现的几个完整、全面的设计方法之一。该方法的主要思想是通过考虑数据在系统中的流动可以更好地理解系统的功能。该方法提供了一种开发系统数据流图然后将其映射为结构图的系统化方法。结构化设计引入了耦合和内聚准则来评价设计质量,强调基于模块的功能分解以及模块接口的定义。基于数据流图开发的结构化设计中第一个部分则被细化和扩展成了一种全面的分析方法,即结构化分析(参见Budgen[2003]中的概览)。
另一种软件设计方法是数据结构化设计。该方法的观点是通过考虑数据结构获得对问题结构的充分理解。因此,该方法强调首先设计数据结构然后基于数据结构设计程序结构。使用这种策略的两种主要的设计方法是Jackson结构化方法(Jackson 1983)和Warnier/Orr方法。
在数据库领域中,逻辑数据和物理数据分离的思想是开发数据库管理系统的关键。有很多方法都强调数据库的逻辑设计,包括Chen引入的实体-关系建模。
Parnas(1972)关于信息隐藏的观点对软件设计做出了巨大的贡献。早期系统(甚至是那些已经考虑了模块化设计的系统)的一个主要问题来自于全局数据的广泛使用,这使得这些系统很容易出错且难以修改。信息隐藏为大量减少全局数据的使用提供了一种方法。
20世纪70年代后期MASCOT表示法以及此后的MASCOT设计方法的提出是对并发和实时系统设计的一个重要贡献。MASCOT在数据流方法基础上,对任务之间基于消息通信通道或者数据池(封装了共享数据结构的信息隐藏模块)的通信方式进行了形式化。任务只能通过调用通道或数据池提供的访问程序间接地访问通道或数据池中的数据。访问程序还可以对数据访问进行同步(通常使用信号量),从而使访问数据的任务无需关心任何同步问题。
软件设计方法在20世纪80年代逐渐成熟起来,同时出现了几种新的系统设计方法。Parnas在海军研究实验室(Naval Research Lab,NRL)工作期间探索了信息隐藏方法在大规模软件设计中的使用,由此导致了海军研究实验室软件成本降低方法(Naval Research Lab Software Cost Reduction Method)(Parnas,Clements,and Weiss 1984)。在并发和实时系统上应用结构化分析和结构化设计方法的工作导致了实时结构化分析和设计(Real-Time Structured Analysis and Design,RTSAD)方法(参见Gomaa[1993]概览)以及实时系统设计(Design Approach for Real-Time Systems,DARTS)方法(Gomaa 1984)的产生。
另一种在20世纪80年代早期出现的软件开发方法是Jackson系统设计(Jackson System Development,JSD)方法(Jackson 1983)。JSD方法将软件设计视为对现实世界的模拟,强调使用并发任务对问题域中的实体进行建模。该方法是较早倡导设计应该首先对现实进行建模的方法之一,在这一点上早于面向对象分析方法。系统被视为对现实世界的模拟,并被设计为一个并发任务的网络,其中每个现实世界实体使用并发任务进行建模。JSD方法同时还突破了当时已成为惯性思维的自顶向下的设计思想,对软件设计采用了一种中间向外的行为性建模方法。该方法是对象交互建模的先导,而对象交互建模则是现代面向对象开发的一个重要内容。