软件工程概要设计与详细设计的区别联系
软件工程中概要设计与详细设计的区别与联系
一、引言:为什么区分概要设计和详细设计?
在软件工程实践中,「概要设计应该做到什么程度」「详细设计又应该细化到什么程度」是许多开发者都会遇到的困惑。这一问题在公司内部也经常被提及。本文基于经典的瀑布型开发模型,结合结构化设计方法,系统阐述两者的定位、职责边界及其协作关系。
软件设计采用自顶向下、逐次功能展开的方法:首先完成总体设计,然后逐步完成各组成部分的设计。根据工作性质和内容的不同,软件设计分为概要设计和详细设计两个阶段,两者在目标、输出物和粒度上均有明确区分。
二、概要设计——建立系统的整体骨架
概要设计(又称总体设计)的主要任务,是设计软件系统的整体架构,包括:
·组成模块及其层次结构;
·模块间的调用关系和接口定义;
·应用系统的总体数据结构和数据库结构(存储什么数据、数据之间的关联);
·关键技术路线和技术选型。
概要设计阶段,设计者会大致考虑各模块的内部实现,但不过多纠缠于此;主要精力集中在模块划分、任务分配和调用关系定义上。模块间的接口与传参必须在此时定得十分细致明确,并编写严谨的数据字典,以避免后续工作中产生歧义。
概要设计阶段通常产生的文档为「软件结构图」,它反映了系统的整体框架和各模块的归属关系。概要设计往往不是一次到位,而是需要反复进行结构调整,直至架构合理、接口清晰。
三、详细设计——为每个模块规划具体实现
详细设计(又称模块设计)的工作对象是单个模块,根据概要设计赋予的局部任务和对外接口,具体设计并表达出:
·模块的算法与执行流程;
·状态转换逻辑;
·涉及的数据结构(精确到字段级);
·类名、方法名、SQL语句等具体实现细节。
详细设计阶段常用的描述方式有:
·流程图
·N-S图(盒图)
·PAD图
·伪代码
详细设计阶段,各个模块可以分给不同的人并行推进,设计者各自专注于所负责模块的内部实现。此处有一个关键规则:如果在详细设计过程中发现结构调整的必要性(如需要分解出新的子模块等),必须返回到概要设计阶段进行调整,不得擅自修改概要设计所定义的模块边界——如需变更,必须经过项目经理同意。
四、概要设计与详细设计的关系
4.1 顺序与依赖
·概要设计是详细设计的基础,必须在详细设计之前完成;
·概要设计经复查确认后,才可以开始详细设计;
·详细设计必须遵循概要设计所定义的模块划分和接口约束。
4.2 关于「模块粒度」的讨论
有人提出质疑:概要设计只说明模块划分和接口,是否足够?如果不了解模块的内部实现细节,如何决定模块下是否要划分子模块?如何确定子模块的调用顺序?
这一问题的答案是:概要设计中,确实需要适当考虑模块的实现细节——至少在粒度层面要心中有数。例如,一个排序程序分为两个模块:主模块负责调用排序子模块,子模块负责交换两个变量的值。只有了解了排序算法的具体逻辑,才能合理地决定哪些功能值得独立成模块。
因此,概要设计虽然不深入展开每个模块的具体算法,但仍然需要从实现可行性角度审视模块划分是否合理,二者并非截然割裂。
4.3 文档类比
一个形象的比喻是:概要设计文档相当于机械设计中的装配图,说明各零件如何组装成整机;详细设计文档相当于机械设计中的零件图,精确标注每个零件的尺寸和工艺要求。文档的编排和装订方式也可以参考机械图纸的规范做法。每个模块的设计文档(概要版和详细版)均应独立成册,便于管理和审阅。
五、数据库设计的侧重点差异
概要设计和详细设计中都有数据库设计环节,但两者的侧重点截然不同:
概要设计中的数据库设计:重点在于描述数据关系,说明数据的来龙去脉。需要结合业务数据,说明结果数据的来源、数据模型设计的目的和原因。这一阶段关注的是「数据之间的关联是什么」。
详细设计中的数据库设计:重点在于输出完善的数据结构文档,即完整的数据字典。必须包含类型、命名规范、精度要求、字段说明、数据表说明等细节。这一阶段关注的是「每个字段具体怎么定义」。
六、功能描述的深度差异
概要设计中的功能描述:重点在于功能整合和对需求的解释。应整体划分功能模块,对各模块进行图文并茂的描述,让读者大致了解系统完成后的整体结构和操作方式。追求的是「读者能理解系统做什么」。
详细设计中的功能描述:重点在于说明系统的具体实现方式。各模块详细说明实现功能所需的类、具体的方法函数,乃至涉及的SQL语句。追求的是「开发人员能据此直接写代码」。
七、形象比喻:盖房子与软件开发
可以用建筑来理解两者的区别:
软件的概要设计,如同盖房子时先搭建房屋的整体骨架——确定有几层楼、每层有哪些房间、房间之间如何连通。有了骨架,住户就能知道这套房的整体格局是否满意。
软件的详细设计,则是对每个房间的装修方案进行详细说明——地板用什么材料、墙面刷什么颜色、插座装在哪个位置。有了详细的装修方案,施工队可以直接照图施工。从这个意义上说,详细设计做得足够清晰时,代码甚至可以交付给第三方来实现。
八、总结
|
维度 |
概要设计 |
详细设计 |
|
核心目标 |
建立系统整体骨架 |
规划模块具体实现 |
|
工作粒度 |
模块划分与接口 |
算法、流程、字段级 |
|
输出物 |
软件结构图、接口定义 |
流程图、PAD图、伪代码、数据字典 |
|
依赖关系 |
依赖需求分析 |
依赖概要设计 |
概要设计与详细设计是软件设计不可分割的两个阶段:概要设计定义「系统由哪些模块构成、模块之间如何协作」,详细设计定义「每个模块内部如何实现」。只有两者衔接得当,才能确保软件开发有序推进、代码质量有据可依。
夜雨聆风