2009-09-17 103 views
3

我有這樣的事情在我的項目,它還挺已經完成(它的工作) 我只是想知道,如果它是確定與固體原則這違反了SOLID原則嗎?

static public class Tools 
{ 
    static public GetProduct(this id){...} 

    static public GetProductCategory(this id){...} 

    static public GetUser(this id){...} 

    // I also have here methods like IsStringNull ... 
    // IsNull IsFalse, lots of stuff, everything static 
} 

,並使用該項目是這樣

var UserThatCreatedCategoryForThisProduct = 
     prodId.GetProduct().CategoryId.GetProductCategory().Creator.GetUser(); 

我知道這很明顯,它違反了SRP,但是這個類是靜態的,它包含了彼此獨立的靜態方法,如果我爲每個方法創建一個靜態類,它是相同的

+1

這些是擴展方法嗎?語法看起來有點偏離。 – peterchen 2009-09-17 08:06:35

+0

@peterchen:使用示例顯示這絕對是計劃,很好的抓住(我讀過它,甚至沒有注意到 - 這真是個壞主意!) – 2009-09-17 08:33:10

+1

+1對於一個好問題:是的......這違反了SRP。 – 2012-07-02 13:19:13

回答

8

盡我所見,這裏有很多SOLID違規行爲!單一職責原則的

  • 違規行爲 - 首先,你有幾類數據訪問方法,第二你必須與他們糾纏在一起的輔助方法(IsStringNull,ISNULL等)。
  • 違反界面分層原則(如Ruben所述) - 如果我只關注產品,爲什麼我需要暴露給獲得用戶的方法?

我敢肯定還有一些其他的,但這些是明顯的。

UPDATE現在有人評論它,我認爲他們是對的;上面的代碼看起來像是某種形式的擴展方法濫用

例如,我不認爲數據訪問應該降級到擴展方法,或者更糟糕的是,名爲「工具」的類。

讓一個抽象數據訪問概念的基類(完全不同的名稱空間和/或程序集)可能更有意義,然後爲每個唯一的域對象繼承一個數據訪問類(例如,UserDAO, ProductDAO等)。要明白,我的假設是,通過GetProduct或GetUser你實際上是指GetFromDatabase。

其餘的助手方法確實屬於擴展,所以他們沒事。

+1

+1:(不能+ 1ing的一半你的答案:P – 2009-09-17 08:34:33

+0

其實我有這個DAO類,它們用在Tools類的方法裏面 – Omu 2009-09-17 16:52:45

+1

好吧,再次,SRP。你的Tool類做得太多瞭如果你有DAO類,你可以把它們放在一個UserManager或ProductManager類中,在這裏所有的CRUD和其他功能都可以使用。擴展方法應該可以添加功能,而不會破壞現有的類,不會隱藏現有功能。 – 2009-09-18 01:57:58

2

根據你的例子,肯定有一個ISP和一個SRP,並且很可能是一個Demeter法(不是SOLID,但是......)違反了至少。

IMNSHO在閱讀關於SOLID的文章(或者購買Agile Principles, Patterns, and Practices in C# by Robert C. Martin and Micah Martin這是一本很好的文章以及我近年來讀過的最有用的書之一)之前,要比在這種類型的互聯網上提供零散的建議要好得多事情。

如果你想有一個快捷鍵(!你不這樣做雖然 - 書籍和PDF文件有解釋的東西很好的例子),這些用Bob大叔Hanselminutes播客是非常好的:

編輯:從Jon Limjapppiotrowicz

+0

有什麼選擇?肯定不會使'UserThatCreatedCategoryForThisProduct'成爲ProductID的一個屬性/擴展方法?! – peterchen 2009-09-17 08:11:33

+1

peterchen,這實際上是一個非常深刻的話題,需要大量的培訓和/或練習才能獲得。不幸的是,從軟件開發中的功能/程序思維到真正面向對象的思維模式的巨大差距在於覆蓋。 – 2009-09-17 08:23:48

+0

@Jon - 夠公平的。儘管如此,對我來說,訪問模式似乎是由數據結構強加的,它通常比處理代碼更加固體*(赦免雙關語)。 – peterchen 2009-09-17 08:55:20

0

其抓獲SRP在很多方面違反了SOLID原則。

  • 它不遵循單一職責原則,因爲I'T這樣做至少有3米不同的東西(退回產品,回頭客,字符串操作?)
  • 它是由不被對擴展開放
  • 違背開閉原則
相關問題