2010-08-09 16 views
4

我希望遵循C++中的單一責任原則。然而,正如我分手類,似乎爲了讓班「看到」對方,我有以下選擇:C++中的單一責任 - 我應該使用朋友類還是更多訪問器來實現它?

  1. 添加更多的訪問者爲每個類
  2. 使對方的班朋友
  3. 提高設計(也許是事實,我會做1或2表示我的設計有一個缺點)

的朋友與存取問題可能已經討論過,但我不知道在實施單一責任方面更有優勢。

回答

2

現在你有一組所有需要一起工作的類,你應該考慮他們應該如何一起工作。如果它通過訪問函數或朋友,那麼你就緊密地聯結了類。未來很難放棄一個完全不同的新課程。由於它們都是相互依賴的,因此測試這些類也很困難。

考慮創建一個接口類來定義你的類應該如何通信。除非涉及到某些特殊權限,否則此界面還將定義其他人如何與他們進行通信。這樣,你就可以打破課程的相互依賴關係。任何未來的變化都是本地化的。其他人不得不改變(或者甚至重新編譯)。

1

您還有選項4:添加更多類以表示類之間的不同角色/交互。

這至少符合得墨忒耳定律。

4

我一直認爲規則是BS。大多數班級都有一些責任,並沒有造成任何傷害。考慮一個銀行賬戶類 - 它可能具有的責任:

  • 維護客戶的詳細資料
  • 允許借記&信用交易
  • 提供電流平衡
  • 報告安全可疑交易

當然,這些責任可能會使用由該賬戶組成的其他類來實施。

+1

取決於您定義爲責任。顯然太容易(如你所示)。我想說在這種情況下,班級負責管理一個帳戶。你必須用你的經驗來決定你定義爲責任的粒度。 – 2010-08-09 16:20:13

+0

@Martin我認爲責任可能出現在CRC卡上 - 「管理帳戶」太模糊,不太實用。 – 2010-08-09 16:21:57

+4

我不會說規則是BS。在你的例子中,它只是說你應該按照你在最後一段中的建議去做:將各種責任委託給其他類,讓頂層類負責管理它們。 – 2010-08-09 16:25:54

3

如果你必須暴露私人數據從一個類到另一個,比讓第二個類成爲朋友。爲您的私人數據創建一個訪問者會破壞首先將其設爲私有的目的。單一責任主體對此沒有影響。

編輯

針對迪馬的評論下面,也許我說「中的」目的就有點過頭了。畢竟,有不止一個理由讓數據成員保密。迪馬指出,其中一個原因是爲了保護物體的完整性。訪問者確實做到了這一點。

但第二個(更重要的是,在我看來)原因是隱藏類的實現細節。一旦你添加了公共訪問器,你就失去了對其他類的引用你的類的實現細節的控制權。隨着時間的推移,由於其他類的級聯效應,這可能會使修改實現變得非常困難。

朋友類雖然遠非完美,但至少可以嚴格控制您的更改會影響多少班。另一個好處是,當您進行更改時,您確切知道哪些類可能會受到影響。因此,當你必須分享課堂內部時,它們是更好的選擇。但是,所有的最佳選擇(當然)不是不公開實施細節。

+0

我將不得不繼續並且不同意。創建訪問者並不會破壞將數據成員私有化的目的。訪問器允許您爲數據的訪問方式定義精確的策略。例如,你可以提供一個getter而不是setter,因此允許只讀訪問。或者你可以提供一個成員函數來設置兩個數據成員,但沒有單獨的setter,定義一個策略,兩個數據成員應該一起更改。另一方面,友誼則將所有班級的私人數據暴露給另一個班級。這違背了保密數據的目的。 – Dima 2011-05-05 16:10:53

+0

有趣的評論。我會用我的回覆更新我的答案。 – 2011-05-05 21:37:18

+0

再一次,我不得不不同意。有訪問者不公開實現細節。考慮一個具有成員函數'getArea()'的類'Rectangle'。你仍然不知道'getArea()'是否簡單地返回一個數據成員,或者它是否從寬度和高度計算區域。公共訪問者在定義上是類的接口的一部分,而不是它的內部。保持數據成員私密性的關鍵在於您可以選擇是否提供訪問者。如果您確實提供了一個,您仍然可以選擇更改基礎實施。 – Dima 2011-05-06 15:18:50

相關問題