uml - UML 领域模型:如何区分属性和类?
问题描述
我目前正在制作战斗游戏的领域模型,我很难确定某些元素应该是它们自己的类还是某个类的属性。例如,我使用类别列表来确定以下想法/对象:战士、等级、武器、护甲、属性、技能、竞技场、游戏模式、游戏日志、对手。
例如,等级、武器、护甲、属性、技能是应该简单地表述为战士的属性,还是应该将它们划分为自己的对象。我也无法判断一个对手是否应该是一个独特的类别,因为它最终是一个与另一个战士有“攻击/防御”关联的战士对象。
如何确定类别列表中每个元素的正确选择是什么?这些可以是主观的吗?
仅供参考,我正在使用 Craig Larman 的“应用 UML 和模式”第 3 版作为信息源。
解决方案
暂时澄清您的问题——您的域模型中的每个类都将具有一组属性。我认为您要问的问题是这些属性中的每一个的类型是否应该是一个类本身,还是其他一些数据结构(例如结构、枚举、原语等)
如果这是正确的,那么答案归结为源自您的分析的设计选择;没有一种“正确的方法”——这是软件设计的艺术。但是,您在做出决定时可能需要注意一些关键事项:
- 行为要求的证据。属性引用的对象是否需要封装行为本身?显然,某些数据结构不可能封装行为,这可能会导致您选择那些可以封装的数据结构(例如类与结构)。
- 数据结构的复杂性。Attribute 所指的对象是否需要封装复杂的数据结构?(例如,多个,可能是分层的,各种原语和/或复杂类型的数据)还是简单?(例如单个整数值)。同样,结构的复杂性将限制您如何表示它。
- 您的系统有哪些非功能性要求?(例如性能要求?)性能、可扩展性和安全性等 NFR 可能会限制您的设计选择,因此您可能会选择以简单的方式表示复杂类型或消除行为需求等。
- 设计选择是帮助你还是阻碍你?以一种过于复杂的方式来表示阻碍您的工作或系统的事物是没有意义的。
- 观众。这可能是最重要的一点——你将域模型放在一起是为了谁,你试图与他们交流什么?
因此,例如,您可以将“武器”表示为类型为类或使用简单类型的属性。“武器”有自己的行为吗?它是否包含多个复杂数据?是否有 NFR 意味着它只能被视为一个枚举?等等。
推荐阅读
- css - 如何扩展绝对定位列表
- c++ - 范围的 std::lexicographical_compare_three_way
- javascript - 中止之前的远程调用
- c++ - std::filesystem::exists -- 如果函数返回 true,我是否需要检查 std::error_code 值?
- javascript - 如何与模式内的输入进行交互
- jquery - 如果使用 jQuery 和 CSS 检查单选按钮,则更改文本颜色
- javascript - 问题 - 从 Sequelize Reference / Node.js / Controller / Models 创建方法
- node.js - 更改布尔值mongodb
- mysql - 如何在 Java 中刷新 ResultSet
- assembly - 从 C 中读取二进制文件,存储 32 位机器指令 LEGv8