类关联属性访问显隐选择及Model向View提供OneThing列表的建模方法
咱们先拆解你的问题,分两部分来聊:关联属性的显式/隐式选择,以及UML建模的优化方案。
一、显式vs隐式关联:优先显式,除非有框架级约定
首先,业务逻辑层面的关联访问,优先用显式方式——除非你用的SDK本身提供了完全成熟的隐式约定(比如依赖注入容器自动解析、全局服务定位器的隐式调用),否则显式关联的可读性和可维护性甩隐式十条街。
回到你的场景:Model要给View提供OneThing列表,而OneThing是通过SDK的ProviderProvider/Provider获取的。这里的核心逻辑是:Model依赖SDK的Provider类,而非直接依赖OneThing。所以代码层面,Model应该显式持有Provider的实例(或者通过构造注入、方法参数传入),然后调用其API拿到OneThing——这才是符合依赖倒置原则的显式关联。
二、UML建模:别直接画Model到OneThing的依赖箭头!
你觉得直接画Model到OneThing的依赖箭头会让视图杂乱,这个判断完全正确。原因很简单:Model并没有直接和OneThing产生代码级的依赖——它既不实例化OneThing,也不直接引用其类型(除非是接收返回值,但这是“使用”而非“依赖”)。
最优建模方式调整建议:
移除Model到
OneThing的直接依赖箭头
这个箭头属于冗余信息,只会让图变得拥挤,而且不符合实际的依赖链。显式画出Model到Provider(或ProviderProvider)的依赖箭头
这才是代码里真实存在的核心依赖:Model需要调用Provider的方法来获取OneThing实例,这个关系必须明确。用返回类型/注释标注Model的产出
如果需要让看图的人知道Model最终会提供OneThing列表,可以:- 在UML的Model类中添加一个操作(比如
getThingList(): List<OneThing>),通过操作的返回类型来体现这个产出关系; - 或者给Model类加一个注释(比如
<<produces>> List<OneThing>),用UML构造型或普通注释来补充信息,既清晰又不杂乱。
- 在UML的Model类中添加一个操作(比如
保留Provider到
OneThing的依赖箭头
这是SDK内部的依赖关系,能完整展示整个依赖链:Model → Provider → OneThing,逻辑一目了然。
三、为什么这么做?
- 符合代码实际逻辑:代码里Model只和Provider打交道,跳过中间层画直接依赖,会误导看图的人以为Model直接操作
OneThing; - 保持UML图简洁:避免大量重复的依赖箭头,尤其是当多个类都通过同一个Provider获取实例时,这种方式能大幅减少图的复杂度;
- 兼顾信息完整性:通过返回类型或注释,既保留了“Model提供OneThing列表”的关键信息,又不会破坏图的可读性。
内容的提问来源于stack exchange,提问作者pindab0ter

