Oop 简单的OO问题:这些类中哪些应该拥有这个操作?

Oop 简单的OO问题:这些类中哪些应该拥有这个操作?,oop,uml,Oop,Uml,我正在研究一个UML类模型,我觉得我需要看看我的假设是否正确。我有两种类型:管理员和位置。(两者之间存在一种关系,管理员可以位于一个或多个位置) 管理员需要将自己分配到一个位置。此分配操作应为位置类型还是管理员类型?一个优于另一个的原因是什么?在我看来,管理员是一个拥有状态的类,因此知道他在哪里。该位置是一个数据条目,应该是无状态的 因此,您可以在管理员处添加或删除位置 例如,典型的C#: 另外,如果不使用双向关系,我看不出它在位置类型中是如何实现的,这在这里似乎不合适。这取决于您的软件是关于什

我正在研究一个UML类模型,我觉得我需要看看我的假设是否正确。我有两种类型:管理员和位置。(两者之间存在一种关系,管理员可以位于一个或多个位置)


管理员需要将自己分配到一个位置。此分配操作应为位置类型还是管理员类型?一个优于另一个的原因是什么?

在我看来,管理员是一个拥有状态的类,因此知道他在哪里。该位置是一个数据条目,应该是无状态的

因此,您可以在管理员处添加或删除位置

例如,典型的C#:


另外,如果不使用双向关系,我看不出它在位置类型中是如何实现的,这在这里似乎不合适。

这取决于您的软件是关于什么的。如果是关于人的数据库,则管理员将包含指定地点的列表(addLocation/removeLocation),如果是关于地点的数据库,则地点应引用其管理员(setAdministrator)。如果您跟踪分配的历史记录,那么显然分配将是一个单独的实体。
埃里克·埃文斯(Eric Evans)在书中很好地描述了这类事情,这两种情况都是可能的,经过论证,这两种情况也都可以

如果管理员在主服务器上登录,他可以调用
adminitils.Locations(That).AddAdministrator(Me)
。另一方面,如果管理员位于特定位置,则在登录该位置之前,他可以调用
administratils.Administrators(Me).AddLocation(This)

此类问题适用于特定情况,通常通过考虑责任来回答。哪个实体对哪个实体负责


还要注意的是,这些Add方法完全可以是两个实体的元素,但其中一个映射到实际的存储,而实际的存储应该只有一个。

谢谢Claus,所以在决定方法应该放在哪里时,您会说状态是关键?但是如果您想知道某个位置有什么管理员,您需要查看所有管理员及其所有位置记录。。。
Administrator.Locations.Add
Administrator.Locations.Remove