【问题标题】:What UML relation to use for class A and class C, where class C is a member of Class B and Class A depends on Class B用于 A 类和 C 类的 UML 关系,其中 C 类是 B 类的成员,A 类取决于 B 类
【发布时间】:2020-02-03 18:19:04
【问题描述】:

这是一个代码示例。

class C;

/* B is a container of class C */
class B
{
public:
    size_t size() const;

    C const& operator[](size_t index) const {
        return elements[index];
    }

    std::vector <C> elements;
}


class D
{
public:
    D(C const& c);
}

/* A is a container of class D */
class A
{
public:
    A(B const& b) {

        // TO construct Class D instance, A needs to pass reference to class C 
        // to class D's constructor.
        for (int i = 0; i < b.size(); ++i) {
            elements.emplace_back(b[i]);
        }
    }
    std::vector <D> elements;
}

这里,

  1. 作文D

  2. B 成分 C

  3. 依赖 B

  4. D 依赖关系

在 A 和 C 之间使用哪个 UML 关系?

从 A 到 C 是单向关联吗?

【问题讨论】:

    标签: oop uml


    【解决方案1】:

    这就是您所说的(由于我的 Cxx 知识有限,对您的代码不太确定):

    您可以清楚地看到,A 也依赖于 C,因为它是 B 的成员。但是您不需要用依赖关系来表达它,因为它很明显。

    注意:根据@Ister的评论,A不直接依赖C,因为它不使用它。 UML 图显示了这一点。这种依赖只是间接的,因为(可能)B 需要C 才能正常工作。这就是为什么C 被第一手放在B 中的原因。但是从AC 的依赖关系在这里是错误的。

    【讨论】:

    • 并非如此。正如它清楚地表明,A 不需要知道任何关于 C 的信息,也不需要知道 B 是如何在内部实现的。因此,除非出于其他原因需要,否则 A 和 C 之间实际上没有(直接)关系。使其成为依赖项将违反封装和密封原则。从可追溯性的角度来看,如果 C 或 A 有任何更改,则此更改将通过 B 传播。例如,如果 A 的接口没有更改(在更改对 B 的影响评估期间进行评估),则无需将更改跟踪传播到一个或更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2020-12-25
    • 2017-12-28
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多