2010-09-30 63 views
4

我剛剛閱讀了單一責任原則,羅伯特C.馬丁曾說過,有時很難看出一個班級有多個責任。單一責任原則 - 一個難以看到的例子?

任何人都可以提供這樣一個類的例子嗎?

+0

根據傳統的SOLID教導,您還可以在一個類中搜索多個「更改原因」來查找SRP違規。 – bzlm 2010-09-30 09:38:26

回答

4

,不妨考慮方法

  • 獲取(網址URL)
  • sendRequest將(字符串請求)

這些方法都與HTTP做一個HTTP類。但是,Get和SendRequest有不同的抽象層次。獲取可能實際上使用SendRequest來發送GET請求。因此,SendRequest應該位於低級HTTP類中,Get應該位於使用低級HTTP類的高級HTTP類中。

+3

??你的推理似乎更多地集中在單一抽象層次原則上,而不是圍繞OP要求的單一責任原則? – 2010-09-30 19:08:26

2

這很有趣,因爲另一個StackOverflow user幾個小時前在his question顯示這樣的例子。

考慮這個類:

[Serializable] 
class MyClass 
{ 
    //Serializable fields 
    public void Save() 
    { 
    //Saving data into file 
    } 

    public void Load() 
    { 
    //Loading data from file 
    } 
} 

這個類(MyClass的),有幾個不同的角色:

  1. 這個類是可序列

  2. 這個類可以節省一些存儲他的狀態

在許多情況下,這不是一個好主意,因爲當我們希望將持久存儲從簡單二進制文件更改爲Xml文件或遠程存儲(例如通過WCF)時,我們無法輕鬆地重用此序列化實體。

您可以創建子類,像MyClassWCFSaver,但即使在這種情況下,它更容易使用序列化MyClass類和MyClassSavers的獨立的層次結構(與幾個不同sublcasses對XML,二進制或WCF存儲器)

BTW,這就是爲什麼在許多ORM中,我們經常從存儲庫中區分實體(請參閱Repository Pattern)。