我有类似下面的课程
class A
{
private:
B b;
}
class B
{
private:
C c;
D d;
}
C和D是存储类,主要包含结构和数据结构。 B将它们包装在一起。我想知道如果我有一个对象A,在获取数据C和D或执行函数时有什么更好的方法?
For example:
class A
{
private:
B b;
public:
B* GetB() { return &b;}
};
class B
{
private:
C c;
D d;
public:
C* GetC() {return &c;}
D* GetD() {return &d;}
};
class C
{
public:
functionA();
};
A a;
B* b = a.GetB();
C* c = b->GetC();
c->functionA();
OR
我根本不应该暴露对象B:
class A
{
private:
B b;
public:
C* GetC() { return &b.GetC();}
D* GetD() { return &b.GetD();}
};
A a;
C* c = a.GetC();
c->functionA();
OR
我不应该暴露对象B,C和D
class A
{
private:
B b;
public:
void performFunctionA() { b.performFunctionA(); }
};
class B
{
private:
C c;
D d;
public:
void performFunctionA() { c.functionA();}
};
class C
{
public:
functionA();
};
A a;
a.performFunctionA();
为什么我们选择一个而不是另一个?
由于
答案 0 :(得分:1)
良好的封装表明您应该尽可能少地公开实现细节。在您的情况下,这意味着支持您的上一个选项,而不是公开B
,C
和D
。这样,对B
,C
和D
的任何更改都可以与A
的用户隔离。
答案 1 :(得分:1)
我最喜欢你最后的选择。从用户的角度考虑事情。当有人使用A
对象时,如果他们只需知道他们想要performFunctionA
,那么这是最简单的。他们不必知道或关心A包含含有C和D的B。另外,如果您更改了B的内部细节,A类用户将不必重新编译。
如果确实选择向内部对象公开句柄(如在其他示例中那样),请考虑在实际可行时通过指针指向const或指向const返回它们。这可以帮助最大限度地降低用户意外修改违反其中一个类别中的不变量的风险。
答案 2 :(得分:0)
每个单位应该只有限制 关于其他单位的知识:仅限 单位“密切”与当前有关 单元。
每个单位都应该只与它交谈 朋友;不要和陌生人说话。
只与您的直接朋友交谈。
最后的选择似乎遵守这项法律,在我看来是最好的。
关于揭露内部类的其他方法的问题,wiki也说了
德米特定律的缺点 是有时需要写作 大量的小“包装” 传播方法调用的方法 组件。
所以最后是你的电话。如果您需要公开一些方法,我会发现Demeter法适当。它提供了很好的指导。另一方面,如果你认为你的代码变得笨重,那么它可能是代码味道: - )