2010-07-19 67 views
6

鑑於Mixins通常會將新行爲引入類中,這通常意味着一個類將具有多個行爲。Single Responsibility and Mixins

如果一個班級有單一責任,則將其定義爲只有一個變更理由的班級。

所以,我可以從兩個不同的角度

  1. 類只有一個變更理由看到這一點。混入的模塊也只有一個原因需要改變。如果班級改變,只有班級需要重新測試。如果模塊更換,只有模塊需要重新測試。因此,SRP是完整的。

  2. 這個班現在有兩個變化的原因。如果班級更改,班級和模塊都需要重新測試。如果模塊改變了,那麼類和模塊都需要重新測試。 Henge,SRP受到侵犯。

使用mixin是否違反了Single Responsibility Principle,最終導致系統維護困難?

回答

1

當你需要共享無關類之間的行爲(和某個需要),基本上有三個選項:

  1. 複製並粘貼無處不在。這違反了DRY,保證會傷害可維護性。
  2. 把它放到一個抽象類中,並讓所有的類(其中很多是彼此不相關的)從它繼承。這通常被認爲是OO反模式。簡而言之,它完全敲開了繼承的概念。僅僅因爲foo和bar做了一些相同的事情,你不會聲稱foo是 -
  3. 把它放在其他地方,給它一個明確的名字,並將其混合到所有需要它的類中。

至於測試,我認爲,一個「好」混入,就像一個好普通的方法,應該再加足夠寬鬆,它和類中使用它可以獨立使用。

+0

如果你需要不相關的類之間的共享行爲,這聽起來像是另一個類的工作。它可以通過一個沒有繼承或混合的接口來處理那些不相關的類之間需要的行爲。這照顧SRP和DRY。 – Tek 2015-02-19 15:40:04

-1

我同意這一點。但是,SRP可能(或應該)有時會違反

1

我認爲這取決於mixin。它可能會給它額外的責任,但也有像Ruby's Comparable這些提供相當低級別的功能,我會說不違反SRP。

1

鑑於Mixin通常會將新行爲引入類中,這通常意味着一個類將具有多個行爲。

如果這是真的,那麼對於單一(實現)繼承也是如此。雖然沒有人喜歡23層深的繼承層次結構,但它仍然佔有一席之地。

繼承不破壞SRP的原因是它所談論的類是文字代碼文件意義上的類,而不是更抽象的類。如果您更改基類代碼文件,該文件通常不需要更改。

所以改變它的單一原因被保留下來。