第三篇——软件工程之结构化设计方法
软件工程有很大的一个章节介绍结构化分析方法。对于结构化分析,我认为它是整体和细节的桥梁,把一个软件整体分成几个块,不同的块负责不同的内容,比如数据输入,数据处理,数据输出;然后在块的基础上敲定细节,需要读入哪些数据,数据的类型,怎么读入数据,数据输入后的计算、查询、添加、删除、修改,数据输出的格式等等。一个软件可能是一个很大的工程,但是它也是由许多小部件搭建起来的,如何确定这些小部件,这时候就需要用到结构化分析方法。对于结构化的具体知识,结合书上的内容,做了一个整理。可能不完善,但是对于基本概念的掌握很有帮助。
结构化分析方法是在模块化,自顶向下逐步细化及结构化程序设计基础之上发展起来的,可以分为两类:一类是根据系统系统的数据流进行设计,还有一类是根据系统的数据结构进行设计。
软件设计的5个原则:
1 分而治之:将大型复杂的问题分解成许多容易的小问题,软件的体系设计,模块化设计都是分而治之的具体策略。
2 模块独立性:指软件系统中每个模块只设计软件要求的具体子功能,与软件系统中其他模块的借口是简单的。耦合性越高,模块独立性越若弱。
3 提高抽象层次:抽象是指护士一个主题中与当前目标无关的方面,以便更注意与当前目标有关的方面。软件设计时,尽量提高软件的抽象层次,按抽象级别从高到低进行软件设计,将软件的体系结构,按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计的语句能够实现为止。当然实现这个过程需要我们对软件的接口,模块的运行等等有足够的熟悉。
4 复用性设计:指在构造新的软件的时候,不必从零做起,可以直接使用已有的软构件即可组装成新的系统。
5 灵活性设计:引入灵活性的方法有,降低耦合并提高内聚(易于提高替换功能);建立抽象(创建有多态操作的接口和父类);不要将代码写死(消除代码中的常数);抛出异常(由操作的调用者处理异常);使用并创建可复用的代码。
模块结构及表示:
一个软件系统需要很多模块(包括程序设计中的函数和子程序)组成,称不能再分解的模块为原子模块。如果一个软件系统的全部实际加工(数据处理或计算)都有原子模块来完成,而其他所有非原子模块仅仅执行控制或协调功能,这样的系统就是完全因子分解的系统,但是大多数系统做不到完全因子分解。
模块一般分为四类:传入模块、传出模块、变换模块(从上级调用模块取得数据,进行特定的处理,转换成其他形式,再将加工结果返回给调用模块)、协调模块。
传入模块:取得输入数据,经过某些处理,再将其传送给其他模块;
传出模块:输出数据,在输出之前可能进行某些处理,数据可能被传输到系统的外部,也可能会输出到其他模块进行进一步的处理,但最终目的是输出到系统的外部;
变换模块:也叫加工模块,从上级调用模块取得数据,进行特定的数据处理,转换成其他形式,再将加工结果返回给调用模块;
协调模块:通过调用,协调和管理其他模块来完成特定的功能;
模块的结构有树状结构和网状结构。
在树状结构中,位于最上层的根部是顶层模块,它是程序的主模块,与其联系的有若干下属模块,各下属模块还可以进一步引出更下一层的下属模块;
网状结构则完全不同,在网状结构中,任意两个模块之间都可以有调用关系,任何两个模块都是平等的,没有从属关系;
结构图(SC):清楚地反映软件模块之间的层次调用关系和联系,它不仅严格地定义了各个模块的名字,功能和接口,而且还集中地反映了设计思想。
在结构图中,两个模块之间用单向箭头联结。箭头从调用模块指向被调用模块,表示调用模块调用了被调用模块,但是被调用模块执行完成后,控制又返回到调用模块;为了表示在模块之间传递的数据或者控制信息,在联合模块的箭头旁边给出短箭头,并且用尾端带有空心圆的短箭头表示数据信息,用尾端带有实心圆的短箭头表示控制信息。通常在短箭头的附近应注有信息的名字。当模块A有条件地调用另一个模块B时,在模块A的箭头尾部标以一个菱形符号。当一个模块A反复地调用模块C和模块D时,在调用箭头尾部则标以一个弧形符号。
在多层次的结构图中,模块结构的层次数成为结构图的深度。结构图的深度在一定意义上反映了程序结构的规模和复杂程度。对于中等规模程度的程序,其结构图的深度约为10左右。结构图中同一层模块的最大模块数称为结构图的宽度。模块的扇入和扇出:扇出表示一个模块直接调用或控制下属模块的数目,扇入则定义为调用或控制一个给定模块的调用模块的数目。多扇入的模块通常是公用模块。
在软件工程这门课程中,结构化是比较实用的一章,掌握结构化设计的方法,对于我们在软件编程中有流程指导作用。