聚合/组合与定向聚合/组合?

时间:2015-12-22 12:47:02

标签: c++ uml diagram

聚合/组合与bouml中的定向聚合/组合有什么区别?

除了bouml和bouml在其网站中没有解释之外,其他地方都没有找到定向聚合/组合概念。

注意:基于代码的解释会更好。

2 个答案:

答案 0 :(得分:3)

根据BOUML UML工具箱的site使用的措辞,“方向”必须被理解为“单向”(与“双向”相对):

  

聚合:定义双向聚合的代码   生成器将生成两个名称为角色的属性   名称。这种关系可能被认为是定义的捷径   两个(定向)聚合。

这个“定向”术语因此指的是相关对象之间的导航可能性。为了进行比较,在MSVC2015中,您可以在“Is Navigable”property of the association中找到方向的概念。

因此,单向聚合可以是:

class Member { ... };  // member of a club 
class Club {
   list<Members*> members; // you can go from Club to Members but not the contrary. 
   ...
};

双向聚合应该是这样的:

class Club; 
class Member {   // member of a club 
    list<Club*> clubs;  // club to which a membershib relation exist.  
    ...
};
class Club {
   list<Members*> members; // you can go from Club to Members and now back. 
   ...
};

对于非定向合成,我们可以举例如:

class Element { ... };  // Elemetn doesn't know parent (=> unidirectional)
class Object {
    vector<Element> element; // own by value for example
    ...
}; 

或者:

class Element { ... }; 
class Object {
    vector<unique_ptr<Element>> element; // ownnership by unique pointer 
    ...
}; 

双向组合可能类似于:

class Object; 
class Element {
    Object *parent;    //  you can navigate back (Element knows about parent)
    ...
 }; 
class Object {
    vector<Element> element; // own by value for example
    ...
}; 

答案 1 :(得分:1)

克里斯托夫是对的。这是否意味着&#34;定向&#34;是一个糟糕的选择,最好更换&#34;方向&#34;通过&#34;单向&#34; ?

编辑:有关记录的终结的一些其他元素

OMG的UML standard v2.5 11.5.Associations 部分中定义了导航原则:

  

Navigability意味着在运行时参与链接的实例   (协会的实例)可以从中有效地访问   协会另一端的实例。精确的机制   通过其实现这种有效访问是特定于实现的。   如果结束不可导航,则可以或不可以从其他端访问   是可能的,如果是的话,可能效率不高。

以下措辞支持术语&#34; direction&#34;:

  • &#34; 箭头表示要将关联读取为将箭头方向的末端与箭头所指向的末端相关联&#34;
  • &#34; 双向导航关联&#34;
  • &#34; 没有定向重要性&#34; (在第20.1.4节中关于另一种图表)。

尽管如此,在很多地方,标准明确使用&#34;单向&#34;和&#34; bidrectional&#34;:

  • &#34; 在箭头所在的图表中 仅显示单向导航关联,这可能表示双向导航&#34;
  • &#34; 这些图表(...)可能始终显示导航(通过空心箭头)或非导航(通过X),仅用于单向关联(oneWay),或从不 &#34; (关于结构图的B.3.2节)
  • 和许多其他地方

所以,虽然&#34;定向&#34;是完全有效的,术语&#34; unidrectional&#34;可能是一个更好,更不明确的选择。