软件工程——结构化方法
上世纪60年代,由于计算机计算能力和处理的问题复杂度的急速增长,爆发了众所周知的软件危机。为了应对软件危机带来的危害,解决管理大型复杂软件的难题,学术界与工业界共同研究并提出了许多有效的软件开发方法。而其中影响最为深远的,分支最为庞大的方法就是结构化方法。自1967年起就涌现出了许多软件工程领域有关结构化的相关概念与方法。如结构化程序设计,结构化分析技术,结构化设计。本文将针对它们进行介绍以及其应用。
结构化编程
结构化编程(Structured programming)是上世纪60年代迪杰斯特拉,科拉多·伯姆及朱塞佩·贾可皮尼等计算机科学家所提出的。图灵奖得主迪杰斯特拉(Edsger Wybe Dijkstra)在1968年的一篇名称为《GOTO陈述有害论》的论文写到:
最近我发现为什么使用goto语句具有灾难性的影响,而且我认为goto语句应该从所有的高级语言中废除,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。——Go To Statement Considered Harmful Edsger W. Dijkstra
科拉多·伯姆于1966年5月在《Communications of the ACM》期刊发表论文,说明任何一个有goto指令的程序,可以改为完全不使用goto指令的程序。下面来看一个例子,用于展示goto带来的差可读性。
void foo(){ A: ... if(c==1) goto B; else goto C; B: ... if(c==2) goto A; else goto C; C: ... if(c==3) goto B; else goto A; }
因此为了应对这些弊端,迪杰斯特拉提出了结构化程序设计。首先他证明了任何程序都可以用以下三种流程架构所组成。可分为循序(sequence)、选择(selection)及重复(repetition),循序是指程序正常的运行方式,运行完一个指令后,运行后面的指令。选择是依程序的状态,选择数段程序中的一个来运行,一般会使用if..then..else..endif或switch、case等关系字来识别。重复是指一直运行某一段程序,直到满足特定条件,或是一集合体中的所有元素均已处理过,一般会使用while、repeat、for或do..until等关键字识别。划分出三种结构以后,程序可以变成一个个基本块,每个基本块之间互不影响(有的时候存在跨基本块的变量),使得程序可读性变强。
结构化程序设计一经提出,在当时受到广泛的关注,大多数人赞同该设计方法。一个很显著的影响就是,后期几乎所有的高级程序设计语言都受其影响,强调结构化设计,虽然Java,Python,C++等语句以面向对象为主要设计思想,但其对象内部实现依旧以结构化思想为主。当然也有人提出了一些反对意见,著名计算机科学家高德纳(计算机程序设计艺术作者)也提出了使用goto指令可以使得程序更清楚而有效率,也不会牺牲程序的可读性。高德纳提出了一个较松的结构限制要求:将程序以流程图表示,前进的分支在流程图的左侧,倒退的分支在流程图的右侧,所有分支均不得交叉。
无可争议的是,结构化编程思想统治了上个世纪的软件开发界。
结构化分析技术
结构化分析技术(Structured Analysis,简称SA),80年代起广为使用的软件开发方法。强调面向应用,分解需求。该技术通过将需求分解,使用抽象化机制,建立一个个小Unit,通过数据的流通构建单元之间的输入输出。结构化分析还使用诸如数据流图(DFD),数据字典,系统关系图(System Context Diagram)等建模方式来形象表达系统的功能与设计。
1抽象化机制
结构化分析会利用抽象化机制的层次结构系统。该抽象机制由需求开始进行。机制一开始会先确认整体需求,再反复地将需求分区为更小的需求,保留程序最优化需要的输入、输出、控制及机制。
功能分解的结构化方法单纯描述程序,而不去划定系统的行为,也不决定系统架构。此方法只确认和模块有关的输入及输出。结构化分析受欢迎的一个原因是其本质适合描述一个高级的程序及概念,使得一个大型复杂系统的层次划分切割的十分适合。
2分析方法
结构化分析以数据在不同模块中流动(Flow)的观点来看待一个系统,系统的功能可以用转换数据流的移动来表示。结构化分析巧妙的利用功能拆解(或由上到下设计)的信息隐藏特性,因此可以关注在重要的细节,而不会被无关的细节干扰。而且分析方法可以确定具体的层次,当细节的层级提高时,信息的广度也随之减少。
常见分析方法包括以下几项:
2.1系统关系图
系统关系图(System Context Diagram)用以表示系统的边界,以及系统外实体(使用者)和系统之间的交互关系。从抽象层次来看,它是系统的最高层次视图。
上图是移动蜂窝网络使用的系统关系图,行为者(右侧小人)通过一个蜂窝接口与各个系统模块进行交互。从图中不难看出系统关系图一般是用在项目的初期,它的目的是为了开发初期能够大致确定系统的架构。项目的所有相关人都需查阅系统关系图,因此系统关系图需用通俗易懂的语言书写,利害相关人才能了解其中的内容。
2.2数据流程图
数据流程图(Data Flow Diagram)是由赖瑞·康斯坦丁所提出。它是用图像方式表示信息系统中数据的流动方式。数据流程图和系统流程图不同,主要是表示数据在不同程序之间的流动,而不是程序的控制流程。
一般在绘制数据流程图前,会需要上文所说SCD图,描述系统和外界环境的交互作用。因此来说,它的抽象层次要低于SCD图,是将SCD中的大模块分解成一个个的小模块。
一般在具体实现中,如果系统的规模较大,仅用一个DFD难以描述,会使得系统变得复杂、庞大而又难以理解。为了降低系统的复杂性,一般采取“逐层分解”的方法,绘制分层的DFD。如下图所示是一个学生管理系统的分层DFD图。
可以看到第0层DFD图粗略的描述了行为者与系统和数据库交互的方法,第1层中的模块对应的是软件/系统的主要处理(或功能),箭头对应各处理间的数据流。这样每个模块所代表的处理都执行一个功能,并且该功能可以很容易地被实现。使得实现的过程变得简洁明了。绘制分层DFD的原则一般是:先全局后局部,先整体后细节,先抽象后具体。
2.3数据字典
数据字典是定义数据库基本组织的文件。数据字典包括数据库中所有数据项、数据结构,数据流,数据存储以及处理过程。为了保护数据字典的内容不被破坏,大部分的数据库管理系统不允许用户更改数据字典。数据字典没有数据库中的数据内容,只有一些访问数据库需要的信息。数据库管理系统一定要配合数据字典才能访问数据库的内容。
一个很好的能说明结构化设计流行的实例就是数据库的SQL语言。结构化查询语言(SQL)是一种查询数据库的标准语言。结构化查询语言一开始是用在一个商用数据库系统中,后来成为在迷你电脑及大型计算机运作的数据库管理系统中,最受欢迎的数据库查询语言。结构化查询语言也可在一般个人电脑中的数据库管理系统中使用,并且可配合分布式数据库使用,因此允许许多用户在网络上同时访问同一个数据库的内容。
在软件工程课程的实践过程中,我接触到了数据流程图和数据字典。利用两者可以很好的构建大型系统的具体框架,使用结构化分析的方法,将需求切分成小块从而达到分解的目的。
结构化设计
一开始听到结构化设计这个名词,没有理解它与结构化分析的区别在哪,看了它的定义才明白几分。结构化设计(SD)是有关软件模块的开发,及分析模块之间的“模块层次”(module hierarchy)。两者的区别在哪呢,简单来说,结构化分析是结构化设计的基础。结构化分析对应于系统需求说明书,强调的是通过DFD,DD等建模方法,将系统的整体框架和设计理念搭建好。而结构化设计是在具体实现,也就是系统设计说明书。强调如何将分析结果实现。
结构化设计是一种面向数据流的设计方法,目的在于确定软件的结构。采用自顶向下、逐层分解的方法,建立系统的处理流程。结构化设计的步骤如下:
①评审和细化数据流图;
②确定数据流图的类型;
③把数据流图映射到软件模块结构,设计出模块结构的上层;
④基于数据流图逐步分解高层模块,设计中下层模块;
⑤对模块结构进行优化,得到更为合理的软件结构;
⑥描述模块接口。
在结构化设计中,有以下两个主要的概念:1,内聚力,是指机能相关的程序组合成一模块的程度。2,耦合力,是指模块及模块之间信息或参数流动的程度。当耦合力调整到最佳情形时,会简化模块之间的接口,也会简化程序的复杂度。
通过上述结构化设计的方法流程,将模块打散,使得模块之间的联系越松散越好,而模块内各成分之间的联系越紧凑越好。使程序的结构尽可能反映要解决的问题的结构。在一步步的细化中使整个系统变得清晰,明确,实现更加轻松。
总结
从以上三种结构化方法的简述和分析过程中可以提取出来结构化方法的主要思想如下:
1、强调软件是有组织、有结构的逻辑实体,其结构为自顶向下的形式,软件由程序和数据组成,其结构呈现三层组织形式,即系统、子系统、功能模块/数据体。软件结构中的各部分既独立又关联。
2、特点:抽象性:抽象描述系统的本质内容,结构化、模块化、层次化: 分而治之,由分到合,分析与设计线索: 面向过程(处理) – 过程驱动 面向数据 – 数据驱动
3、总体规划: 为所规划的软件系统作出一个战略的、宏观的、全局的技术方案,构建宏观结构模型,为后期的分析与设计奠定基础 三个工作内容:(1)需求调查(2)结构模型建立 (3)总体规划文档撰写
在计算机行业十分火热的今天,有很多相当复杂庞大的系统需要人们去实现。因此各种开发方法层出不穷,诸如面向对象的开发方法等在当今也变的十分受欢迎。它瞄准的就是结构化方法的缺点,不形象,和现实社会连接不紧密。但是不可否认的是,结构化方法,在如今情形下,在软件工程领域,无论是理论还是实际都发挥着它不可替代的作用。
参考资料:
1,《GOTO 有害论》迪杰斯特拉http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html
2,维基百科:结构化分析https://en.wikipedia.org/wiki/Structured_analysis
3,维基百科:结构化编程https://en.wikipedia.org/wiki/Structured_programming
4,《系统工程原理与实践》 亚历山大·柯萨科夫
5,,《结构化设计》賴瑞·康斯坦丁
6,《深入浅出设计模式》弗里曼