热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

连载:面向对象设计精髓:理念、技术与实践(27)-动态模型构建

类模型教导我们如何定义类,而动态模型则指导我们如何实现类的功能。通常,在完成类模型设计后,才会进行动态模型的设计,因为后者依赖于前者提供的类结构。相比类模型,动态模型设计更为直观,主要因为它较少涉及复杂的设计原则或模式。

类模型教会我们如何定义类,而动态模型则指导我们如何实现类的功能。动态模型设计通常是在类模型设计完成后进行的,因为动态模型设计需要利用到已定义的类。与类模型相比,动态模型设计较为直接,主要原因是动态模型设计时并不需要应用复杂的设计原则或模式,只需根据用例模型的特点,选择合适的动态模型来表达即可。


在实际开发中,动态模型起着至关重要的作用。简而言之,如果没有动态模型,即使完成了类的设计,也无法进行编码,或者只能编写类的声明代码(如类的属性和方法名),但无法编写类的实现代码(即方法的具体逻辑)。动态模型正是用于指导我们如何编写这些具体的实现代码。


对于何时需要进行动态模型设计,这取决于个人判断。如果认为某个部分较为复杂,就需要设计;反之,如果觉得简单,则可以直接编码。这一决策往往基于个人的经验。例如,在我的实际工作中,一个中等规模的项目可能只需要设计一两个业务的动态模型,而对于小型项目,我通常会直接根据需求编码。


根据UML标准,以下是几种常见的动态模型:


【状态模型】


状态模型用于描绘对象在其生命周期内的状态变化。通过状态图,可以清晰地了解对象的不同状态及其转换条件。当对象的状态变化较为复杂时,设计状态模型尤为重要。


在UML中,状态图用于表示状态模型。


【活动模型】


活动模型用于描述工作流程或计算流程。它关注的是在完成某项任务的过程中,各个对象的角色和它们之间的交互顺序。当流程较为复杂时,设计活动模型有助于理清思路。


在UML中,活动图用于表示活动模型。


【序列模型】


序列模型用于展示对象间按时间顺序的消息交互过程。它的关键在于“时间顺序”,因此也被称为时序图或顺序图。序列模型是最常用的动态模型之一,特别适用于将用例模型或系统序列图转化为动态模型。


在UML中,序列图用于表示序列模型。


【协作模型】


协作模型用于展示基于对象间关系组织的消息交互过程。其特点在于强调“对象关系”而非时间顺序。虽然协作模型与序列模型作用类似,但在大多数情况下,序列模型因其时间顺序与用例模型步骤的一致性而更受欢迎。


在UML中,协作图用于表示协作模型。


需要注意的是,并非所有模型都是必需的,应根据实际情况选择使用。这些模型可以从用例模型中推导出来,尤其是活动模型、序列模型和协作模型,通常与用例模型一一对应,或对应某个特定分支。通常不建议在一个模型中包含多个分支,以免图形过于复杂且主题不明确。


相比之下,状态模型较为复杂,因为不能仅从单个用例或其分支直接推导出某个对象的所有状态。需要综合多个用例模型,提取与该对象状态相关的信息,再进行统一设计。


从用例模型推导出动态模型的过程是一种“分解和分配”的过程。在用例模型中,系统被视为一个“黑盒”,而在动态模型中,系统被细分为多个类。因此,需要将原本笼统分配给系统的功能和职责进一步细化,并分配给不同的类。简而言之,动态模型明确了为了实现系统的某一功能,各类需执行的任务及其顺序。


以POS机为例,假设我们基于“结账”这一用例的正常流程设计“序列模型”,则可得到相应的“序列模型”。有了这个“序列图”,编写代码时可以参照以下伪代码(实际编码会更加复杂,但方法相同):


main(){
Trade trade = new Trade();
Integer tradeId = trade.makeNewTrade(); // 创建交易
trade.addGoods(); // 添加商品
trade.calculateTotal(); // 计算总价
Receipt receipt = new Receipt();
receipt.print(trade); // 打印收据
trade.finish(); // 结束交易
}

推荐阅读
  • 我有这种ajax$.ajax({type:"POST",url:"bee_sesi_edit.php&# ... [详细]
  • 本文主要介绍了线油书的部分资料及其对相关领域的启示与影响。通过详细的数据分析和案例研究,探讨了线油书在未来的发展潜力。 ... [详细]
  • 本文继续探讨Java IO系统中的Reader与InputStream之间的关系,重点分析面向字符的IO流如何通过装饰者模式增强功能,以支持Unicode等国际化的需要。 ... [详细]
  • JobScheduler5.0源码分析
    0.JobScheduler执行代码mJobScheduler(JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE); ... [详细]
  • 在Ubuntu上通过Wine安装Photoshop CS6的详细指南
    针对专业设计师和图像处理人员,寻找能够完全替代Adobe Photoshop的开源软件往往不尽如人意。本文提供了一种解决方案,即通过Wine在Linux系统上安装Photoshop CS6,以实现更稳定的操作体验。 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 行为设计模式:命令模式详解
    命令模式是一种行为设计模式,它通过将请求封装为对象,使得可以使用不同的请求来参数化客户端,支持请求的排队、日志记录以及提供命令的撤销和恢复功能。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 本文是对《敏捷软件开发:原则、模式与实践》一书的深度解析,书中不仅探讨了敏捷方法的核心理念及其应用,还详细介绍了面向对象设计的原则、设计模式的应用技巧及UML的有效使用。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文详细介绍了笔记本电脑上多种实用的快捷键,包括屏幕调整、图形设置、分辨率更改、驱动更新、导航操作、音量控制及屏幕锁定等,旨在帮助用户更高效地使用笔记本电脑。 ... [详细]
  • 本文将在前几篇关于Android测试理论知识的基础上,通过ApiDemoTest实例详细探讨如何使用ApplicationTestCase进行Android应用测试。建议读者先阅读Android测试教程系列中的相关内容,以便更好地理解本文的实践部分。 ... [详细]
  • 本文探讨了一种统一的语义数据模型,旨在支持物联网、建筑及企业环境下的数据转换。该模型强调简洁性和可扩展性,以促进不同行业间的插件化和互操作性。对于智能硬件开发者而言,这一模型提供了重要的参考价值。 ... [详细]
  • RobotFramework之资源文件资源文件导入资源文件资源文件与用例前置、后置结合使用资源文件资源(Resource):用户关键字的 ... [详细]
author-avatar
印大大
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有