我有像下面这样的课程
class A
{
private:
B b;
}
class B
{
private:
C c;
D d;
}C和D是存储类,主要包含结构和数据结构。把这两个包在一起。我在想,如果我有一个对象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();或
我根本不应该公开对象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();或
我不应该暴露对象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();为什么我们选择一个而不是另一个?
谢谢
发布于 2011-06-10 10:55:42
好的封装意味着您应该公开尽可能少的实现细节。在您的情况下,这意味着支持您的最后一个选择,不公开B、C或D。这样,对B、C和D的任何更改都可以与A的用户隔离。
发布于 2011-06-10 11:06:04
我最喜欢你的最后一个选择。从用户的角度考虑问题。当有人使用A对象时,如果他们所需要知道的就是他们想要performFunctionA,这是最简单的。它们不必知道或关心A包含包含C和D的B。而且,如果您更改了B的内部细节,则A类的用户将不必重新编译。
如果您确实选择公开内部对象的句柄(就像在其他示例中一样),请考虑在实际情况下通过指向常量的指针或指向常量的引用来返回它们。这有助于最大限度地降低用户意外修改某个类中违反不变量的内容的风险。
发布于 2011-06-10 14:59:32
Law of Demeter说
最后一种选择似乎符合这一规律,在我看来是最好的。
关于公开内部类的其他方法的问题,wiki还说
德米特定律的一个缺点是,它有时需要编写大量的小“包装器”方法来将方法调用传播到组件。
所以最终还是由你来决定吧。如果你需要暴露一些方法,我觉得德米特定律是合适的。它提供了很好的指导。另一方面,如果您认为您的代码变得笨重,那么这可能是代码气味:-)
https://stackoverflow.com/questions/6301496
复制相似问题