软件工程篇:从需求建模到系统设计,架构师必备方法论
作为系统架构师,软件工程方法论的掌握程度直接决定了系统设计的质量和可维护性。从需求分析到系统设计,每一步都需要严谨的方法论指导。今天,我们将深入探讨软件工程的核心概念和方法,帮助架构师构建扎实的技术基础。
一、建模工具家族:从不同视角理解系统
📊 流程图 vs 数据流图:掌握建模工具的本质区别
在系统分析中,流程图和数据流图是最常用的两种建模工具,但它们的应用场景和关注点截然不同。
流程图关注的是控制流,描述应用程序从数据输入开始到获得输出为止的逻辑过程。它展示的是处理过程的执行顺序,某个时间点只能处于一个处理过程。流程图适用于系统设计中的物理建模阶段。
数据流图关注的是数据流,说明业务处理过程、系统边界内所包含的功能和系统中的数据流。DFD中的处理过程可以并行,展现全局的处理过程,适用于系统分析中的逻辑建模阶段。
实际应用场景:
在设计一个电商订单处理系统时,如果你需要描述”用户下单→库存检查→支付→发货”的执行顺序,使用流程图;如果你需要分析数据如何在用户、订单系统、支付网关、物流系统之间流动,使用数据流图。
🔄 活动图 vs 流程图:面向过程与面向对象的差异
活动图和流程图虽然都描述过程,但有本质区别:
活动图描述的是对象活动的顺序关系所遵循的规则,着重表现系统的行为,而非处理过程。活动图支持并发进程,是面向对象的建模工具。
流程图一般限于顺序进程,着重描述处理过程,是面向过程的建模工具。
应用提示:在设计复杂业务流程时,如果涉及多个业务对象的协作和并发操作,优先选择活动图;如果只是描述简单的线性处理流程,流程图更加直观。
🎯 状态图 vs 活动图:结果 vs 过程
状态图和活动图都描述系统的动态行为,但侧重点不同:
状态图描述一个对象在其生存期间的动态行为,表现对象经历的状态序列、引起状态转移的事件,以及因状态转移而伴随的动作。状态图侧重于描述行为的结果。
活动图描述系统的工作流程和并发行为,可看作状态图的特殊形式。活动图侧重描述行为的动作。
核心差异:活动图中一个活动结束后将立即进入下一个活动;而状态图中状态的转移可能需要事件的触发。活动图可描述并发行为,状态图则不能。
实战案例:在设计用户账户系统时,用状态图描述账户的”激活→冻结→注销”状态转换;用活动图描述用户登录的完整流程。
二、数据流图深入解析
🔧 数据流图的基本元素
数据流图由四种基本元素组成,每种元素都有其特定的作用:
数据流:数据在系统内传播的路径,由一组成分固定的数据组成。在图中用箭头表示,箭头上标注信息说明或数据项。
外部实体:代表系统之外的实体,可以是人、物或其他软件系统。在图中用圆角框或平行四边形框表示。
加工(处理) :对数据进行处理的单元,接收输入数据,进行处理,产生输出。在图中用矩形框表示。
数据存储:表示信息的静态存储,可以是文件、文件的一部分、数据库元素等。对其进行的存取分别以指向或离开数据存储的箭头表示。
⚖️ 数据流图的平衡原则
数据流图的构建必须遵循平衡原则,这是保证数据一致性的关键:
父图与子图之间的平衡:任何一张DFD子图边界上的输入/输出数据流必须与其父图对应加工的输入/输出数据流保持一致。
子图内部平衡:加工的输入和输出需要平衡。
三种常见错误:
- 黑洞:一个加工只有输入数据流而无输出数据流
- 奇迹:一个加工只有输出数据流而无输入数据流
- 灰洞:一个加工的输入数据流无法通过加工产生输出流
实战经验:在设计银行转账系统的数据流图时,要确保”转账”加工的输入(账户A、账户B、金额)和输出(账户A余额减少、账户B余额增加、交易记录)在整个层次结构中保持平衡。
📖 数据流图与数据字典的协作
数据流图和数据字典是软件需求分析和设计阶段的黄金搭档:
数据流图的作用:
-
分析阶段:建立系统的功能模型 -
设计阶段:为模块划分与模块之间接口设计提供依据
数据字典的作用:
-
对DFD中出现的所有被命名的图形元素作为词条加以定义 -
确保每个图形元素的名字都有一个确切的解释 -
作为所有人员工作的依据和统一标准 -
提供按各种要求列表、相互参照、由描述内容检索名称、一致性检验和完整性检验等功能
实际应用:在设计医院信息系统时,DFD描述”患者→挂号→就诊→缴费→取药”的数据流动,数据字典则精确定义”患者信息”、”挂号单”、”处方”等数据元素的组成和约束。
三、面向对象建模核心
🎭 用例关系的三种类型
用例关系是需求分析中的重要概念,包括泛化、包含和扩展三种类型:
包含关系:当可以从两个或多个用例中提取公共行为时使用。例如,”用户注册”和”用户登录”都需要”验证邮箱”这个公共行为,可以将其提取为包含用例。
扩展关系:如果一个用例混合了两种或两种以上不同场景,根据情况可能发生多种分支,可以将这个用例分为一个基本用例和一个或多个扩展用例。例如,”在线支付”基本用例,可以扩展出”支付宝支付”、”微信支付”等扩展用例。
泛化关系:当多个用例共同拥有一个类似的结构和行为时,将它们的共性抽象成父用例,其他用例作为子用例。例如,”文件上传”、”视频上传”、”图片上传”可以泛化为”内容上传”父用例。
🏗️ 类关系的六种类型
类之间的关系是面向对象设计的核心,理解每种关系的含义至关重要:
依赖关系:一个事物发生变化影响另一个事物。这是最弱的关系,如一个类的方法参数使用另一个类。
泛化关系:特殊/一般关系,即继承关系。子类继承父类的属性和方法。
关联关系:描述了一组链,链是对象之间的连接。如”学生”和”课程”之间的关联。
聚合关系:整体与部分生命周期不同。部分可以独立于整体存在,如”班级”和”学生”。
组合关系:整体与部分生命周期相同。部分不能独立于整体存在,如”汽车”和”引擎”。
实现关系:接口与类之间的关系。类实现接口定义的方法。
实战指导:在电商系统设计中,订单和商品之间是关联关系,购物车和购物车项之间是组合关系,用户和VIP用户之间是泛化关系。
👥 设计类的三类划分
在面向对象设计中,类通常分为三类,每类都有明确的职责:
实体类:映射需求中的每个实体,保存需要存储在永久存储体中的信息。例如,用户、商品、订单等。实体类主要关注数据的持久化和基本操作。
控制类:用于控制用例工作的类,对一个或几个用例所特有的控制行为进行建模。例如,结算、备货、退款等。控制类封装业务逻辑和流程控制。
边界类:用于封装在用例内、外流动的信息或数据流。例如,浏览器、购物车、API接口等。边界类负责与外部系统或用户的交互。
应用场景:在设计在线考试系统时,”考生”、”试题”是实体类,”考试流程控制”是控制类,”答题界面”是边界类。
四、系统建模三模型
🔺 对象模型、动态模型、功能模型的关联关系
对象模型、动态模型和功能模型是OMT方法的核心,它们从不同侧面反映系统需求:
对象模型描述系统数据结构,表示静态的结构化”数据”性质,用类图表示。对象模型为动态模型和功能模型提供了基本框架。
动态模型描述系统控制结构,表示瞬间的行为化系统控制性质,用状态图表示。动态模型规定了对象模型中的对象合法变化序列。
功能模型描述系统功能,表示变化的系统功能性质,指明系统应该”做什么”,用数据流图表示。
三者之间的关联关系:功能模型指明系统应该”做什么”;动态模型明确规定了”什么时候做”;对象模型则定义”做事情的实体”。
实际应用:在设计智能家居系统时,对象模型定义”设备”、”场景”、”用户”等实体;动态模型描述设备的状态转换;功能模型说明系统的功能需求如远程控制、自动化场景等。
五、系统建模语言与工具
🏛️ SysML系统建模语言
SysML(Systems Modeling Language)是对象管理组织OMG在对UML2.0的子集进行重用和扩展的基础上提出的新型系统建模语言,作为系统工程的标准建模语言。
SysML的需求关系类型:
- 包含:需求可以且只能包含其他需求
- 跟踪:对提供方元素的修改可能会导致对客户端元素修改的需要
- 继承:一个需求可以继承另一个需求的属性
- 改善:表示一个需求改进了另一个需求的满足程度
- 满足:一般是模块满足某种需求
- 验证:表示一个需求验证了另一个需求的正确性
- 复制:表示一个需求复制了另一个需求的特性
应用场景:SysML特别适用于复杂的系统工程项目,如航空航天、汽车电子、医疗设备等领域的系统建模。
📬 序列图的消息类型
序列图是描述对象交互的重要工具,常见的消息类型包括:
简单消息:泛指对象之间的任何消息调用或发送,不关心是异步还是同步。
同步消息:发送消息后,接收者必须向发送者返回响应才能继续执行。这是一种阻塞式的消息传递方式。
异步消息:发送消息后,发送者不需要等待接收者的响应,可以继续执行其他操作。这是一种非阻塞式的消息传递方式。
返回消息:表示返回的消息。
创建消息:表示创建一个新的对象。
销毁消息:表示销毁一个对象。
条件分支的组合片段:
- 选择片段:根据条件选择执行不同的消息流
- 循环片段:重复执行消息流,直到条件不成立为止
- 并行片段:将消息流并行执行,可以同时或并发执行
六、软件设计方法论
🎯 非功能性需求的三类分类
非功能性需求是系统质量的重要保障,可分为三类:
操作性需求:系统完成任务所需的操作环境要求及如何满足系统将来可能的需求变更的要求。
性能需求:针对系统性能要求的指标,常见的包括响应时间、吞吐率。
安全性需求:防止系统崩溃和保证数据安全所需要采取的保护措施或防范措施。
📐 软件设计方法六大类型
软件设计方法包括多种技术路线,每种方法都有其适用场景:
模型驱动设计:通过绘制图形化系统模型描述系统的技术和实现,从逻辑模型导出系统设计模型。
结构化设计:面向过程的系统设计技术,将系统过程分解成容易实现和维护的计算机程序模块。
信息工程:以数据为中心的模型驱动技术,主要工具是数据模型图。
原型设计:反复迭代过程,通过构造小规模、不完整但可工作的示例与用户交互设计结果。
面向对象设计:精炼早期面向对象分析阶段确定的对象需求定义,定义新的与设计相关的对象。
快速应用开发(RAD) :瀑布的高速变种,通过使用基于构件的开发方法获得快速的开发进度。
🎯 结构化分析方法
结构化分析方法(SA)主要用于系统需求分析,通过图形化工具表达用户需求。具体步骤包括:
-
分析当前情况,生成反映当前物理模型的数据流图 -
推导出等价的逻辑模型的DFD -
设计新的逻辑系统,生成数据字典和基元描述 -
建立人机接口,提出目标系统物理模型的DFD -
确定各种方案的成本和风险等级,进行分析 -
选择一种方案 -
建立完整的需求规约
💾 信息工程方法
信息工程方法(IE)是一种系统化的方法论,主要用于指导企业或组织的信息系统规划、设计、开发与管理。它以数据为中心,强调通过结构化流程、数据建模和技术整合来构建高效、可扩展的信息系统。
🎨 UML交互图的选取原则
在软件分析和设计过程中,使用顺序图和通信图进行建模的选取原则:
顺序图:适用于描述对象之间的时序交互和消息传递顺序,适合描述系统中多个对象之间的交互逻辑,以及消息传递的时序。
通信图:适用于描述对象之间的合作关系和协作结构,强调收发消息的对象的结构组织。
选择建议:如果你更关注时间顺序和消息传递流程,使用顺序图;如果你更关注对象之间的结构和协作关系,使用通信图。
总结
软件工程方法论为系统架构师提供了科学的思维工具和实践指导。从建模工具的选择到设计方法的应用,每个环节都需要深入理解和灵活运用。掌握这些方法论,能够帮助架构师:
-
更好地理解和分析需求 -
更清晰地设计系统架构 -
更有效地与团队沟通 -
更可靠地保证系统质量
在下一篇文章中,我们将深入探讨架构设计核心内容,包括架构风格、质量属性、微服务等关键主题。
🔈 每日一问
「在你的项目中,最常用的建模工具是什么?为什么?」
欢迎在评论区分享你的实践经验!
夜雨聆风