软件⼯程详细设计
在完成前置的总体设计报告后,就应该开始着⼿于详细设计了,在这⼀步骤中,我们将需要去细化总体设计中提出的模块,详细的设计出每个模块的作⽤、算法,各个模块间的结构关系,通过需求分析中的结果,利⽤总体设计提出的⼤致框架设计出满⾜客户需求的软件系统产品。
⼀、为什么需要详细设计
在总体设计完成后,应当对系统的整体有了⼤概的⼀个了解,但在没有对各个模块提出更为详细的要求的情况下,程序员难以对系统拥有准确的判断,从⽽导致系统运⾏效率低下,结构不清晰等等的问题,⽽在详细设置中,将会提出对每⼀个模块的性能要求、流程要求、⽤户界⾯要求等⼀系列详细的要求,这将会令编码者在编码实现的过程中思路更为清晰,减少编程过程中因合作产⽣的混乱,提⾼整个程序的开发效率。
⼆、程序的结构化设计
“模块化设计是指在进⾏程序设计时将⼀个⼤程序按照功能划分为若⼲个⼩程序模块,每个⼩程序模块完成⼀个确定的功能,并在这些模块间建⽴必要的联系,通过模块的互相协作完成整个功能的程序设计⽅法。”
在我们刚开始学习c语⾔程序设计时,我们通常习惯将所有的代码按照⾃⼰的思路写在同⼀个.c⽂件当中,虽然程序可以实现相应的功能,并且作者只需要标注良好的注释,就能在回看代码时重新理解代码的含义。但当程序需要分享或者⼯程量过于庞⼤需要多⼈协作完成⼀项程序时,这种⾯向过程编程的⽅式将是极其没有效率的,就如同在运动会上的接⼒赛跑,唯有当⼀个⼈完成了指定的任务和功能后,后⾯的成员才能开始其负责部分的代码,所以这种编程⽅法并不适⽤于⼤项⽬。
⽽程序的结构化设计很好的弥补了⾯向过程编程难以多⼈协作的问题,它将⼀个⼤程序拆分成⼀个⼀个⼩零件,每⼀个零件都有其⾃⾝的功能,并且零件便于程序测试,在每完成⼀个零件后可单独对其进⾏各种测试保证程序的运⾏正确⽆误,在完成所有的零件后,由⼀根主轴将所有的零件穿起来,利⽤零件的相互转换作为参数和返回值实现不同的程序功能。
同时模块化设计实现的程序也便于后期程序的维护,就如同⼀辆汽车,某个部件出现损坏或过时了,只需更换对应的部件即可,⽽模块化程序在出现错误时也只需对相应的部分进⾏修改更新,⽽在程序需要添加功能时,也只需要再制造所需要的零件进⾏组装即可。极⼤的降低了程序的维护更新成本。
模块化设计应当遵循以下原则:
1. 模块之间相互独⽴。
每个模块要能独⽴的完成指定的⼯作,要保证模块尽可能少的和其他模块相关联,若模块间的联系过于紧密,将导致程序的结构化不够彻底,使得升级维护的成本提⾼。
1. 模块⼤⼩要适当。
⼀个模块的⼤⼩不易太⼤,模块不可能将所有的程序功能都囊括进去,这样在不仅增加了实现难度的同时还使程序成为⼀个变相的⾯向过程,但也不适宜太⼩,否则就如同c语⾔中独⽴为⼀个函数就好。
1. 模块的分解要有层次。
在模块的设计初期,⾸先设计范围⽐较⼤的模块,到后期再慢慢对⼤模块进⾏细化分解成较⼩的模块进⾏实现。
三、⼈机界⾯设计
⼈机界⾯设计,⼜称⼈机互动(human-machine interaction),是专门研究系统与⽤户之间交互关系的学问。系统可以是各种机器,不过在本⽂,将会着重介绍⼈与计算机软件系统间的交互关系。
(⼀) 交互模式
好的界⾯应该是能够有效地让互动顺利进⾏,让使⽤者可以在已存在的应⽤范围中顺利轻松地完成他们的⽬的。
由Norman在1988年提出的⼈机对话的七个⾏为阶段,分别是:
1. 形成⽬标。
2. 形成意图。
3. 指定动作。
4. 执⾏动作。
5. 领会系统状态。
6. 解释系统状态。
7. 评价结果。
Norman模型考虑系统为界⾯,只关⼼了系统表现和使⽤者期待之间的差距,并没有考虑系统透过界⾯产⽣的沟通。
后来由Abowd和Beale提出,延伸了Norman的模式,解决了Norman模式中的问题。除了使⽤者的任务语⾔(task-language)和界⾯的核语⾔(core-language)之外,还有代表输出和输⼊的语⾔,它们有时分开有时重叠。在互动中,四个主要的转换是:发出指⽰(articulation)、表现(performance)、呈现(presentation)、观察(observation)。
(⼆) 概念模型
“设计者或其他相关⼯程⼈员,所共同设计的操作接⼝称为概念模型。⽤户并⽆法直接与设计者进⾏对话,也鲜少透过说明书准确⽽有效地了解设计者的概念;透过与接⼝的交互,进⽽对该设计产品的功能及操作所形成的了解,则称为⽤户对于该产品所形成的⼼智模型。⼀般⽽⾔,⽤户的⼼智模型是在使⽤中⾃然逐步形成的,同时,借由与系统不断地交互,⽤户会不断修正其⼼智模型。如果到了最后,⽤户的⼼智模型与设计师的概念模型能⼀致或相当接近,那么,接⼝设计就算是相当成功了。”
概念模型⼤致可分为依据活动所设计或依据对象所设计的两种导向。
活动型概念模型:
指令型——根据⽤户输⼊指令执⾏对应的操作,如Dos系统。
对话型——系统与⽤户进⾏对话,双向交互,但容易产⽣误解,如Siri语⾳助⼿。
操作导航型——让⽤户⽤最⾃然的直觉去操作接⼝,如MacOS、Windows系统等图形化系统。
搜索浏览型——⽤户通过关键词搜索信息,如百度搜索引擎。
对象型概念模型:
⾯向对象的概念模型将重点放在处于某些特定背景情境下使⽤的特定对象,它往往与其在现实⽣活中的原型极为类似,如机场中⾃助取票机等终端系统。
四、详细设计所使⽤的⼯具及其使⽤⽅法
在详细设计中所使⽤到的⼯具⼤致分为三种:图形⼯具、表格⼯具以及语⾔⼯具。
(⼀) 程序流程图
在这⼏种⼯具中使⽤最为⼴泛的就是程序流程图了。它是表⽰算法、⼯程流的⼀种框图表⽰,以不同类型的框代表不同种类的步骤,在每个步骤之间则以箭头相连。在流程图的绘制前,需要先将任务流程梳理⼀边,并把需要执⾏的任务逐⼀写下,在绘制中,要遵守标准惯⽤的流程图符号,绘制的⽅向需符合从上到下,从左到右,⽂字说明需简洁扼要。在绘制完成后,还需要检查流程是否有所遗漏,或是有哪些流程需要调整。
流程图中常见的符号:
流程符号⽤来表达过程的次序,⽤⼀条线由⼀个符号连接⾄另
⼀个符号。如果不是标准的上⾄下、左⾄右图就会加
上箭头。
起⽌符号表⽰次要或程序的开始和完结。通常会在其中表
上“开始”或“结束”或其他相关字眼。
程序以长⽅形来表⽰⼀系列程序去改变量值、形式、数据
的位置。
判断以菱形去表⽰⼀个条件进程,⽤来按情况去决定下⼀
步的⾛向。通常以True或False的值来决定。
输⼊/输出以平⾏四边形来标⽰数据输⼊或输出的过程,即填⼊
数据或显⽰⼯作结果的步骤。
注解⽤来补充某步骤的额外信息,可⽤⼀个虚线来连接⼀
个半闭合的长⽅型⾄想注释的符号中。
已定义流程⽤⼀个有2条左右垂直线长⽅型,来表⽰⼀个已在其
他地⽅定义了的过程。
同页参考⽤⼀个含有字母的⼩圆圈来连接⽬标流程画于同⼀页
上。
换页参考⽤⼀个倒画的屋型来表⽰⽬标流程画于另⼀页上。
(⼆) 伪代码
windows程序设计第7版pdf另⼀种常⽤来表⽰程序流程、描述算法的⼀种⽅法就是伪代码。它是属于语⾔⼯具的⼀种,虽然名称中包含代码⼆字,但实际上不是⼀种现实存在的编程语⾔,可能会综合使⽤多种编程语⾔的语法、保留字,甚⾄会⽤到英⽂、中⽂等⾃然语⾔来说明流程。
当程序员需要实现⼀个具体的算法时,尤其是对于⼀个不熟悉的算法时,通常就会从伪代码开始对算法进⾏理解,然后将伪代码翻译为所需要的⽬标编程语⾔,并让翻译出来的程序与其余的程序相互匹配。
在详细设计的阶段,就可以使⽤伪代码对实际算法和程序结构进⾏充分描述说明,直到编码阶段再通过翻译伪代码的形式完成编码过程。
伪代码例⼦(C语⾔风格):
void function fizzbuzz {
for (i = 1; i <= 100; i++) {
set print_number to true;
If i is divisible by 3 {
print "Fizz";
set print_number to false; }
If i is divisible by 5 {
print "Buzz";
set print_number to false; }
If print_number, print i;
print a newline;
}
}
(三) 判定表和判定树
判定表是⼀种间接的可视化表⽰,⽤于指定根据给定条件所相对应的操作。判定表相较于流程图和伪代码⽽⾔,可以更清晰的表⽰条件复杂情况下的分⽀选项。
判定表通常由四个部分组成:条件桩、动作桩、条件项、动作项。
条件桩⽤来列出问题的所有条件,动作桩⽤来规定在满⾜某些条件下可能采取的操作,条件项⽤来列出针对条件桩中各种情况的真假值的各种组合,动作项⽤于列出对应各种条件项所对应需要采取的动作。
判定表虽然能够清晰的表⽰复杂的条件组合与采取相应动作的对应关系,但是要看懂这么⼀个表还是需要学习成本的,所以,判定树就诞⽣了,它是判定表的变种,降低了学习成本,使其易于掌握和理解使⽤,但是相较于判定表,简洁性却有所降低,并且当数据元素越接近叶⼦时,需要重复书写的部分越多。判定树的功能和判定表相同,需要我们根据实际情况选择合适的使⽤。
下⾯是判定表的⼀个例⼦:
123456789
国内乘客T T T T F F F F
头等舱T F T F T F T F
残疾乘客F F T T F F T T
⾏李重量W≤30T F F F F F F F F
免费×
(W-30)×2×
(W-30)×3×
(W-30)×4××
(W-30)×6××
(W-30)×8×
(W-30)×12×
下⾯是判定树的⼀个例⼦:
(四) ⽂学编程
⽂学编程,⼜名⽂字式编程,是⾼德纳提出的编程⽅法,并被期望能取代结构式编程的范型。“⽂学程序是⽤⾃然语⾔(⽐如英语)写出来的对程序逻辑的解释,程序中交织点缀着宏和传统源代码段。”这是中对⽂学编程的解释。这种⼯具将代码段或更低层次的宏隐藏了起来,实际⽤法也与伪代
码写的算法类似。
关于⽂学编程的优点,⽂学编程强迫程序员显式描述程序背后的思路,让不充分的设计决策⽆所遁形。同时,⽂学编程还提供了⼀流的⽂档系统,⽂档能使作者能在以后的任何时间重新到⾃⼰的思路,也能使其他程序员更容易理解程序的建构过程。⽂学编程的元语⾔(meta-language)能⼒也据称普遍利于思考,能从更⾼的层次统观代码。
但是⽂学编程也有显著的缺点,通常⽽⾔,⽂学编程就是把代码撕裂成多个代码⽚段,然后再通过拼接构成⼀个软件,⽽拆分成过多的⽂件将导致代码阅读上的困难。相较于优点⽽⾔,这些缺点过于严重,所以在当前时期,已经很少有⼈采⽤⽂学编程作为常⽤⼯具了。
五、详细设计⼩结
这个阶段的关键任务是确定怎样具体的实现⽤户需求的软件系统,在保证程序稳定可靠的同时在结构上要易于维护,也要易于程序员阅读理解、测试修改等。要保证上述的要求,结构化的程序设计是其基本保障。
在⼈机界⾯的设计上,要实现⽤户易于上⼿,保证界⾯的直观和较低的学习成本,同时保证程序的响应速度在合理的范围内,以提⾼⽤户的使⽤体验。
在进⾏详细设计的过程中,若仅仅使⽤⽂字性的描述,就会导致设计过于的抽象难懂,⽽使⽤⼀些图形⼯具或伪代码等⼯具,将使得设计的思想更为清晰易懂且不易产⽣误解,因此,要善于使⽤直观的⼯具进⾏设计。
《科学发展》杂志2003年8⽉,368期,18⾄23页
张海潘,《软件⼯程导论(第六版)》,清华⼤学出版社,P128
张海潘,《软件⼯程导论(第六版)》,清华⼤学出版社,P129
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论