首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于课堂互动的问题

关于课堂互动的问题
EN

Stack Overflow用户
提问于 2011-06-10 10:53:46
回答 3查看 167关注 0票数 0

我有像下面这样的课程

代码语言:javascript
复制
class A
{
 private:
   B b;
}

class B
{
private:
  C c;
  D d;

}

C和D是存储类,主要包含结构和数据结构。把这两个包在一起。我在想,如果我有一个对象A,那么获取数据C和D或者执行函数的更好的方法是什么?

代码语言:javascript
复制
 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:

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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();

为什么我们选择一个而不是另一个?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2011-06-10 10:55:42

好的封装意味着您应该公开尽可能少的实现细节。在您的情况下,这意味着支持您的最后一个选择,不公开BCD。这样,对BCD的任何更改都可以与A的用户隔离。

票数 1
EN

Stack Overflow用户

发布于 2011-06-10 11:06:04

我最喜欢你的最后一个选择。从用户的角度考虑问题。当有人使用A对象时,如果他们所需要知道的就是他们想要performFunctionA,这是最简单的。它们不必知道或关心A包含包含C和D的B。而且,如果您更改了B的内部细节,则A类的用户将不必重新编译。

如果您确实选择公开内部对象的句柄(就像在其他示例中一样),请考虑在实际情况下通过指向常量的指针或指向常量的引用来返回它们。这有助于最大限度地降低用户意外修改某个类中违反不变量的内容的风险。

票数 1
EN

Stack Overflow用户

发布于 2011-06-10 14:59:32

Law of Demeter

  • 每个单元应该只对其他单元有有限的了解:只有与当前单元“密切”相关的单元。

  • 每个单元应该只和它的朋友说话,不要和陌生人说话。

  • 仅与您的直接朋友交谈。

最后一种选择似乎符合这一规律,在我看来是最好的。

关于公开内部类的其他方法的问题,wiki还说

德米特定律的一个缺点是,它有时需要编写大量的小“包装器”方法来将方法调用传播到组件。

所以最终还是由你来决定吧。如果你需要暴露一些方法,我觉得德米特定律是合适的。它提供了很好的指导。另一方面,如果您认为您的代码变得笨重,那么这可能是代码气味:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6301496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档