[英]Question on class interaction
我有如下課程
class A
{
private:
B b;
}
class B
{
private:
C c;
D d;
}
C 和 D 是存儲 class 主要包含結構和數據結構。 B 把它們都包起來。 我想知道如果我有 object A,獲取數據 C 和 D 或執行 function 的更好方法是什么?
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();
或者
我根本不應該公開 object 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();
或者
我不應該公開 object 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();
為什么我們選擇一個而不是另一個?
謝謝
良好的封裝表明您應該盡可能少地公開實現細節。 在您的情況下,這意味着支持您的最后一個選項,而不是公開B
、 C
或D
。 這樣,對B
、 C
和D
的任何更改都可以與A
的用戶隔離。
我最喜歡你的最后一個選擇。 從用戶的角度考慮問題。 當有人使用A
object 時,如果他們只需要知道他們想要performFunctionA
,這是最簡單的。 他們不必知道或關心 A 包含包含 C 和 D 的 B。此外,如果您更改 B 的內部細節,class A 的用戶將不必重新編譯。
如果您確實選擇將句柄公開給內部對象(如在您的其他示例中),請考慮在可行的情況下通過指針到 const 或引用到 const 來返回它們。 這可以幫助將用戶意外修改違反其中一個類中的不變量的內容的風險降到最低。
每個單元應該只對其他單元有有限的了解:只有與當前單元“密切”相關的單元。
每個單位只應與其朋友交談; 不要和陌生人說話。
只與您的直系朋友交談。
最后的選擇似乎遵守這條法律,在我看來是最好的。
關於您公開其他內部 class 方法的問題,wiki 還說
得墨忒耳法則的一個缺點是它有時需要編寫大量小的“包裝器”方法來將方法調用傳播到組件。
所以最終它是你的電話。 如果您需要公開一些方法,我覺得得墨忒耳法則合適。 它提供了很好的指導。 另一方面,如果您認為您的代碼變得龐大,那么它可能是代碼異味:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.