软件工程之系统建模方法
一、前言
在高级软件架构师备考中,学习了软件工程基础信息的章节,对系统分析与设计内容做关键内容的笔记。软件开发的过程是一门软件工程,只是开发者实际工作中已经轻车熟路,对软件工程的理论内容没有过多理解和总结。系统分析与设计的方法也称为系统建模的方法,系统分析指在分析阶段把复杂的对象分解为简单对象的组成,并且分析其彼此之间的关系的过程。系统分析师与用户在对用户的系统需求的充分了解的基础上,完成系统表达为系统需求规格说明书。系统设计指在系统分析结果、需求说明书基础上完成系统构建的过程,包括系统蓝图、技术选项、利弊权衡、实施方式等内容,完成系统的概要设计与详细设计文档。
二、方法
系统分析与设计的方法包括①原型方法、②结构化方法(面向功能开发软件方法、面向数据流开发软件方法)、③面向对象方法、④面向服务方法。对应系统建模的方法原型建模、结构化建模、面向对象建模、功能分解建模、数据库建模(信息工程建模)、基于构件的开发方法。对上述方法通过基本思想、工具、步骤进行详细介绍。
1、原型法
原型方法指在需求阶段的分析方法,针对需求不明确,按照功能分水平原型(界面原型)、垂直原型(负责算法),按照最终结果分抛弃式原型(此类原型在系统真正实现以后就抛弃不用了)、演化式原型(此类原型的构造从目标系统的一个或多个基本需求出发,通过修改和追加的过程逐渐丰富,演化成为最终的系统)。基本思想:通过用交互的,快速建立起来的原型取代了形式的、僵硬的(不允许更改的)大部分的规格说明,用户通过在计算机上实际运行和试用原型系统而向开发者提供真实的、具体的反馈意见。
通过原型法开发过程的指导和原型法开发的活动图执行,在限定的时间内、最经济的方法开发出一个系统模型,用户在运行使用整个原型的基础上,通过对其评价,提出改进意见,对原型进行修改,统一使用,评价过程反复进行,使原型逐步完善,直到完全满足用户的需求为止。原型法是对过程中许多细节问题逐个补充、完善、求精,最终形成系统。
原型法优缺点,符合人们认识事物的规律,系统开发循序渐进,反复修改,确保较好的用户满意度;开发周期短,费用相对少;由于有用户的直接参与,系统更加贴近实际;易学易用,减少用户的培训时间;应变能力强。不适合大规模系统的开发;开发过程管理要求高,开发人员易将原型取代系统分析;缺乏规范化的文档资料。
原型法适用场景,处理过程明确、简单系统;涉及面窄的小型系统。不适合于,大型、复杂系统,难以模拟;存在大量运算、逻辑性强的处理系统;管理基础工作不完善、处理过程不规范;大量批处理系统。
2、结构化方法(SD)
是一种传统的软件开发方法,它是由①结构化程序设计(SP)、②结构化分析(SA)、③结构化设计三部分有机组合而成的。基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内;基本要点:自顶向下、逐步求精、模块化设计、结构化编码。
结构化编码:一种编程范式,这种范式规定了我们在写程序时候的一些要求,其目的是使我们能够编出来的程序可读性、可维护性、可扩展性更佳。结构化的程序由四种控制结构构成:顺序、选择(if语句)、循环(while语句)和递归;两个重要概念:子过程和块,子过程就是可调用的单元,如我们常用的C语言里面的函数。块就是一系列的语句,在C语言里面就是if或while里面的语句列。在一个严格纯粹的结构化程序里面,一个块只允许有一处入口以及一处出口。结构化编码提供相关编程要求,但是严格的限制带来编码不方便,会突破规则使用goto、continue、break、多个return出口、try-catch语句,所以大多数程序或者程序设计语言也并非完全遵守结构化编程,但可以确定的是,大多数程序或者程序设计语言都受到了结构化编程思想的影响且很大程度上地遵守着结构化编程的规则。
结构化分析:给出一组帮助系统分析人员产生功能规约的原理与技术。它一般利用图形表达用户需求,使用的手段主要有数据流图、数据字典、结构化语言、判定表以及判定树等。结构化分析的步骤如下:1、分析当前的情况,做出反映当前物理模型的DFD;2、推导出等价的逻辑模型的DFD;3、设计新的逻辑系统,生成数据字典和基元描述;4、建立人机接口,提出可供选择的目标系统物理模型的DFD;5、确定各种方案的成本和风险等级,据此对各种方案进行分析;6、选择一种方案;7、建立完整的需求规约。
使用系统关系图,从宏观的层面描述系统和外界环境之间的作用,系统关系图可以表示一个系统和外界相关系统的输入及输出,有助于了解系统与其他相关系统或者事件的关系,对后续的结构化设计提供系统边界说明,提炼相关系统对外功能。
使用数据字典,数据库字典是定义数据库基本组织的文件。数据字典包括数据库中所有的文件、每一个文件的字段个数、字段名称及型态。从涉及的数据层面收集、汇总、整理系统数据项,对后续结构化的数据库设计,数据字段提供文档依据。
使用数据流图(DFD),是用图像方式表示信息系统中数据的移动方式。数据流程图和系统流程图不同,主要是表示数据在不同程序之间的移动,而不是程序的控制流程。DFD是自顶向下分析方法中常用的一个分析工具。第0层DFD描述了系统最顶层的结构、各个结构间数据的流向、以及系统和外界环境的数据交互(个人觉得这里也可以把系统关系图看作是第0层的DFD);第1层的DFD描述的是第0层DFD中各个模块的细分,即第1层DFD描述了第0层DFD各个模块的结构、内部各个结构间数据的流向、以及这个结构的输入输出数据。第2层DFD又是第1层DFD中各个模块的细分,以此类推。从动态层面对系统的数据流向图表呈现,对后续结构化设计的数据流转提供说明。
使用结构图,是一个将系统拆解为最小可管理程序单位的图。在结构化编程中,结构图可以将程序模块整理为树状结构,每一个模块以一个其中有模块名称的方框表示,树状结构可以清楚表示各模块之间的关系。 通过对系统不断细分,一直将问题拆解为更小的问题,直到最后问题小到可以被人类理解为止。
结构化设计:结构化设计是数据模型和过程模型的结合。在设计过程中,它从整个程序的结构出发,利用模块结构图表述程序模块之间的关系。结构化设计的步骤如下:①评审和细化数据流图;②确定数据流图的类型;③把数据流图映射到软件模块结构,设计出模块结构的上层;④基于数据流图逐步分解高层模块,设计中下层模块;⑤对模块结构进行优化,得到更为合理的软件结构;⑥描述模块接口。
结构化方法优缺点:至顶向下逐步分解求精、开发目标清晰化、工作阶段程式化、开发文档规范化、设计方法结构化、应变能力差。
结构化方法场景:结构化程序设计适用于程序规模较大的情况,对于规模较小程序也可采用非结构化程序设计方法。
3、面向对象方法(OO)
将面向对象的思想应用于软件开发过程中,指导开发活动,是建立在“对象”概念基础上的方法学。面向对象方法的本质是主张参照人们认识一个现实系统的方法,完成分析、设计与实现一个软件系统,提倡用人类在现实生活中常用的思维方法来认识和理解描述客观事物,强调最终建立的系统能映射问题域,使得系统中的对象,以及对象之间的关系能够如实地反映问题域中固有的事物及其关系。
面向对象开发方法认为客观世界是由对象组成的,对象由属性和操作组成,对象可按其属性进行分类,对象之间的联系通过传递消息来实现,对象具有封装性、继承性和多态性。面向对象开发方法是以用例驱动的、以体系结构为中心的、迭代的和渐增式的开发过程,主要包括需求分析、系统分析、系统设计和系统实现4个阶段,但是,各个阶段的划分不像结构化开发方法那样清晰,而是在各个阶段之间迭代进行的。
面向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成;设计模型则是以包图表示的软件体系结构图、以交互表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。所以面向对象方法包含面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程(OOP)。
面向对象分析(OOA):面向对象分析是对系统进行需求分析、业务调查以后,按照面向对象的思想来分析问题。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。如何完成素材的归类分析和整理,主要涉及归纳五个层次:主题层、对象类层、结构层、属性层和服务层;识别五个活动:标识对象类、标识结构、定义主题、定义属性和定义服务;在分析过程中依据原则:①抽象(数据抽象、流程抽象)抽取共同的本质的特征,抽象是OOA的核心原则,强调把数据(属性)和操作(服务)结合为一个不可分的系统单位(即对象),对象的外部只需要知道它做什么,而不必知道它如何做;②封装;③继承;④分类;⑤聚合;⑥关联;⑦消息通信;⑧粒度控制;⑨行为分析。基本步骤:确定对象和类、确定结构(类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系)、确定主题(事物的总体概貌和总体分析模型)、确定属性(属性就是数据元素,可用来描述对象或分类结构的实例)、确定方法。
面向对象设计(OOD):面向对象设计是延续面向对象分析的延续,基本思想是抽象、封装、可扩展性,可扩展性通过继承和多态的实现。OOD接近于现实世界、更自然的方式设计系统。在OOD中类被划分成三类:控制类用于控制用例工作的类,一般是由动宾结构的短语(“动词+名词”或“名词+动词”)转化来的名词,例如,用例“身份验证”可以对应于一个控制类“身份验证器”,它提供了与身份验证相关的所有操作。控制类将用例的特有行为进行封装,控制对象的行为与特定用例的实现密切相关,当系统执行用例的时候,就产生了一个控制对象,控制对象经常在其对应的用例执行完毕后消亡。
面向对象编程(OOP):将面向对象设计后的抽象,采用面向对象的方式来实现的方法,就叫做面向对象编程。在这种方法中,程序被组织成许多相互协作的对象,每个对象都是一个类的实例。利用对象构成业务逻辑的组成基本元素(组合模式的层次结构),而不是采用算法。组成程序的基本元素是一个又一个的基础组件(类),那么组件就是我们层次结构所对应的接口或接口的实现类,那么程序就是由一个又一个实现类的实例相互协作来完成业务逻辑的实现。
面向对象建模工具使用UML(统一建模语言),独立于任何特定的编程语言,使用UML构建功能模型(用例图)、对象模型(类图、对象图)、动态模型(序列图、活动图、状态图、协助图)、构件图、部署图,通过不同视角完成面向对象分析,为下一步面向对象设计与面向对象编程提供依据。
面向对象方法优缺点:自底向上、阶段界限不明、 更好应变,更好服用、符合人们的思维习惯、面向对象建模可以实现软件复用,简化程序设计;系统易于维护;系统开发周期短。
面向对象方法场景:可以普遍适用于各类信息系统开发,但是不能涉足系统分析以前的开发环节。
面向对象方法总结:使用符合思维习惯的面向对象方法,使用面向对象分析方法、UML工具,提炼类、对象、关系,从复杂的系统中梳理本质关系,基于分析的结果使用面向对象编程的方式完成系统的开发,与传统的结构化法或者数据库建模方法不一样,通过对象的继承、封装、多态分割整个系统、由单个对象自底向上构建整个系统,保持类、对象间的关系是反映现实世界的。基于面向对象方法归纳总结出七大设计原则(开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则、里氏替换原则、合成复用原则),基于面向对象思想和七大设计原则总结出23种设计模式,代表面向对象设计的最佳实践。
4、面向服务方法(SOD)
面向服务的方法是一种将软件系统划分为多个独立的服务单元,并通过服务间的交互来完成系统功能的开发方法。
面向服务的过程:需求分析(明确系统的业务需求和服务划分,识别出可以独立部署和可重用的服务)、服务设计(定义服务的接口和输入输出参数,设计服务之间的交互流程和通信协议)、服务实现(根据服务接口的定义,实现服务的具体功能。这通常包括编码、单元测试等步骤)、服务集成与测试(将各个服务集成在一起,进行系统级的测试和验证,确保服务之间的交互符合设计要求)、部署与运维(将系统部署到生产环境,并进行日常的运维管理,包括服务的监控、故障排查和性能优化等)。
面向服务的工具:面向服务架构(SOA)、微服务架构,使用该架构风格的设计系统,使用各种中间件完成服务注册与发现、服务编排、服务监控、服务间调用、分布式一致性等。
面向服务的优缺点:提高开发效率、增强系统可维护性、促进团队协作、提升系统可扩展性;服务划分难度、服务治理难度、网络延迟和容错机制、技术门槛。
三、总结
上述开发方法由原型法->结构化法->面向对象方法->面向服务方法,都是在软件工程的发展过程中不断变迁,由简单的系统,基于控制流、数据流、业务流的系统到复杂的业务系统,高性能、高可扩展的要求发展而来。从单个系统线性拆解结构化设计->非线性,现实世界复杂的关系图的面向对象方法->粗粒度、提供服务的面向服务方法,都体现软件工程应对复杂问题的解决之道,随着工程的前进,落后或者不适用的方法自然会消失,当然每个方法都不是独立,都是存在包含关系的,本文对各个开发方法进行对比总结,体会开发方法的变化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?