结构化方法
结构化方法(SD方法)是一种传统的软件开发方法,它是由结构化程序设计、结构化分析和结构化设计三部分有机组合而成的。它的基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内。本篇博文将逐一介绍结构和编程、结构化分析和结构化设计。
结构化编程
结构化编程是一种编程范式,这种范式规定了我们在写程序时候的一些要求,其目的是使我们能够编出来的程序可读性、可维护性、可扩展性更佳,避免写出面条式的代码(面条式代码是一种对结构化不好的代码的形象比喻,代码直接相互交迭、相互跳转,所有代码都揉在一起,就如面条一样)。结构化编程对我们如今的编程产生着深远的影响。就我自己的编程经验而讲,虽然我们现在写的程序并非“纯粹”的结构化(下面我也会提到什么是“纯粹”的结构化以及为何会有非“纯粹”的结构化),但是我们写的程序大都还是遵循着结构化编程的思想。
结构化程式设计在1960年代开始发展,科拉多·伯姆及朱塞佩·贾可皮尼伯姆于1966年5月在《Communications of the ACM》期刊发表论文,说明任何一个有goto指令的程式,可以改为完全不使用goto指令的程式。1968年,图灵奖得主迪杰斯特拉(Edsger Wybe Dijkstra)发表了《GOTO陈述有害论》(Go To Statement Considered Harmful),这也是被认为结构化编程被真正提出。
在《GOTO陈述有害论》中,迪杰斯特拉提到:“goto语句具有灾难性的影响,而且我认为goto语句应该从所有的高级语言中废除,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。”并认为,结构化的程序应由四种控制结构构成:顺序、选择(if语句)、循环(while语句)和递归(迪杰斯特拉在论文中也提到循环其实可以由递归代替,但他认为循环一方面是容易实现、另一方面也是符合人们常规的思想因此保留了循环)。顺序、选择和循环的NS图和控制流图如下所示。
除了控制结构以外,结构化编程里面还有两个重要的概念:子过程(Subroutine)和块(Block)。子过程就是可调用的单元,在现在我们常用的C语言里面的函数。块就是一系列的语句,在C语言里面就是if或while里面的语句列。在一个严格纯粹的结构化程序里面,一个块只允许有一处入口以及一处出口。
结构化编程确实可以使得程序变得更清晰可读,但严格的限制也使得了有些时候编程会变得很不方便,因此也有人提出了反对的意见。如著名计算机科学家高德纳便提出了使用goto指令可以使得程序更清楚而有效率,也不会牺牲程序的可读性。在我们如今许多的程序设计里面,最常见的几个非结构化但又是相当有用的程序设计思路有如下两个。
程序多出口,即一个过程或函数里面有多个return,或循环里面的continue或者break。这样的设计允许了我们能在多重的嵌套中直接退出,或者提早退出循环。虽然这些违反了结构化设计的原则,并且可以使用纯粹的结构化设计实现,但是比起纯粹的结构化设计会节省许多的代码,并且不会非常影响程序的可读性。
错误处理,即像java里面的try-catch语句。因为没一条语句都有可能产生错误,因此在try-catch里面每一条语句都有可能是出口,相当于多出口,但只是错误处理里面出口并不是显式定义。错误处理在编程里面是非常必要的,因此错误处理也是一个合理的例外。
虽然结构化编程有受到非议,如今大多数程序或者程序设计语言也并非完全遵守结构化编程,但可以确定的是,大多数程序或者程序设计语言都受到了结构化编程思想的影响且很大程度上地遵守着结构化编程的规则。
结构化分析
结构化分析方法给出一组帮助系统分析人员产生功能规约的原理与技术。它一般利用图形表达用户需求,使用的手段主要有数据流图、数据字典、结构化语言、判定表以及判定树等。
结构化分析的步骤如下:1、分析当前的情况,做出反映当前物理模型的DFD;2、推导出等价的逻辑模型的DFD;3、设计新的逻辑系统,生成数据字典和基元描述;4、建立人机接口,提出可供选择的目标系统物理模型的DFD;5、确定各种方案的成本和风险等级,据此对各种方案进行分析;6、选择一种方案;7、建立完整的需求规约。
下面列举一些结构化分析常用的分析工具。
系统关系图
系统关系图(System Context Diagram)是表示系统和外界环境之间的作用,系统关系图可以表示一个系统和外界相关系统的输入及输出。Kossiakoff将系统关系图定义为“系统关系图将系统放在整个图的中心,不描述其内部结构,周围则是和其有关的系统、活动及环境,环境图的目的是专注在哪些会影响系统需求及限制的外部因素及事件。”系统关系图和数据流程图有关,有助于了解系统和其他相关系统或事件之间的关系。
数据字典
数据字典或是数据库字典是定义数据库基本组织的文件。数据字典包括数据库中所有的文件、每一个文件的字段个数、字段名称及型态。为了保护数据字典的内容不被破坏,大部份的数据库管理系统 不允许用户更改数据字典。数据字典没有数据库中的数据内容,只有一些访问数据库需要的信息。数据库管理系统一定要配合数据字典才能访问数据库的内容。
数据流程图
数据流程图(DFD)是用图像方式表示信息系统中数据的移动方式。数据流程图和系统流程图不同,主要是表示数据在不同程序之间的移动,而不是程序的控制流程。
DFD是自顶向下分析方法中常用的一个分析工具。第0层DFD描述了系统最顶层的结构、各个结构间数据的流向、以及系统和外界环境的数据交互(个人觉得这里也可以把系统关系图看作是第0层的DFD);第1层的DFD描述的是第0层DFD中各个模块的细分,即第1层DFD描述了第0层DFD各个模块的结构、内部各个结构间数据的流向、以及这个结构的输入输出数据。第2层DFD又是第1层DFD中各个模块的细分,以此类推。
结构图
结构图(SC)是一个将系统拆解为最小可管理程序单位的图。在结构化编程中,结构图可以将程序模块整理为树状结构,每一个模块以一个其中有模块名称的方框表示,树状结构可以清楚表示各模块之间的关系。
结构化分析中常用结构图表示程序的顶层架构。结构图有助于程序设计者用个个击破的方式处理软件问题,也就是将一直将问题拆解为更小的问题,直到最后问题小到可以被人类理解为止。此程序称为由上到下设计或是功能分解。结构图的作用类似建筑房屋中使用的蓝图。在设计阶段,结构图是客户和不同软件工程师沟通的方式。在代码实现的阶段,由结构图可以得知系统的完整架构。
结构化设计
如果说结构化分析做的是需求分析,描述的是开发软件过程中做什么的问题,那么结构化设计做的就是系统设计,描述的是开发软件过程中怎么做的问题。
结构化设计方法给出一组帮助设计人员在模块层次上区分设计质量的原理与技术。它把系统作为一系列数据流的转换,输入数据被转换为期望的输出值,通过模块化来完成自顶而下实现的文档化,并作为一种评价标准在软件设计中起指导性作用,通常与结构化分析方法衔接起来使用,以数据流图为基础得到软件的模块结构。结构化设计所使用的工具有结构图和伪代码。结构图是一种通过使用矩形框和连接线来表示系统中的不同模块以及其活动和子活动的工具。SD方法尤其适用于变换型结构和事务型结构的目标系统。结构化设计是数据模型和过程模型的结合。在设计过程中,它从整个程序的结构出发,利用模块结构图表述程序模块之间的关系。结构化设计的步骤如下:①评审和细化数据流图;②确定数据流图的类型;③把数据流图映射到软件模块结构,设计出模块结构的上层;④基于数据流图逐步分解高层模块,设计中下层模块;⑤对模块结构进行优化,得到更为合理的软件结构;⑥描述模块接口。
参考资料
- 百度百科:结构化方法
- 维基百科:Structured programming
- Edsger W. Dijkstra:Go To Statement Considered Harmful
- 百度百科:结构化分析
- 维基百科:Structured Analysis
- 维基百科:Data flow diagram
- 百度百科:结构化设计方法