有向无环图的约束怎么表达-《分析模式》漫谈39

DDD领域驱动设计批评文集

做强化自测题获得"软件方法建模师"称号

《软件方法》各章合集

"Analysis Patterns"的第3章的图3.10,原图如下:

2004和2020中译本都只是翻译了文字,在2024中译本中,我们先照猫画虎用UML改编如下:

但还有一个问题没有解决,在"观察概念"的自反关联中,Fowler标了一个[dag]:

DAG即有向无环图(Directed Acyclic Graph),意思是"观察概念"自反关联组成的对象图应该是一个有向无环图,像下面这样:

这个约束是为了防止出现某个实例的超类型直接或间接地又把该实例作为超类型。

之所以是有向无环图,是因为"超类型"一端的多重性可以为"多",如果最多为1,那就是一棵有向树,例如:

虽然Fowler在附录中有说明,[dag]是类别图的一个约束标记,但这样表示是不严谨的。

之前漫谈文章中评点过图3.5,图上也放了一个标记[bag]:

这是可以的,因为它约束的是某个"复合单位"链接到的"原子单位"集合(无序、可重复)。

而本文开头图3.10中的[dag]并不是对某个"观察概念"的"超类型"集合的约束,而是描述存在图中所定义自反关联的所有"观察概念"以及它们之间的链接所形成的图,在"超类型"那里简单这样标一下是不合适的。

如果想更严谨地表达这个约束,可以用OCL,如下:

意思是,对于任何一个"观察概念",不允许出现这样的情况:求它的"超类型"闭包所得的"观察概念"集合中包含它自己。

最后得到的图3.10如下:

相关推荐
来自远方的老作者7 小时前
第10章 面向对象-10.2类和对象
python·面向对象·类和对象·hasattr函数·setattr函数·getattr函数
耿雨飞10 小时前
Python 后端开发技术博客专栏 | 第 03 篇 面向对象编程进阶 -- 从 SOLID 原则到 Python 特色 OOP
开发语言·python·面向对象·oop
Byte不洛12 小时前
C++继承详解(菱形继承与虚拟继承)
c++·继承·面向对象·菱形继承·虚拟继承
烟锁池塘柳01 天前
一文讲透 C++ / Java 中方法重载(Overload)与方法重写(Override)在调用时机等方面的区别
java·c++·面向对象
Karl_wei1 天前
Vide Coding 的基础:LLM 大模型
llm·ai编程·领域驱动设计
FreakStudio1 天前
MicroPython对接大模型:uopenai + 火山方舟实现文字聊天和图片理解
python·单片机·ai·嵌入式·面向对象·电子diy
Jump 不二2 天前
AI 绘图 Skill|Markdown 一键出架构图、UML、数据可视化
人工智能·信息可视化·语言模型·uml
YDS8292 天前
大营销平台 —— 模板方法串联前中置抽奖规则
java·spring boot·ddd
Rsun045513 天前
Java UML类图从入门到实战
uml
YDS8293 天前
大营销平台 —— 抽奖规则决策树
java·springboot·ddd