2008-08-19 94 views
22

answer堆棧溢出問題指出,特定的框架違反了簡單和簡單的OOP規則:單一職責原則(SRP)。是單一責任原則OOP的一個規則?

是單責任原則真的 OOP的規則?

我的面向對象編程的定義的理解是「在那裏的對象和他們的行爲被用於創建軟件的範例」。這包括以下技術:封裝,多態性&繼承。

現在不要誤會我的意思 - 我相信SRP是最好的OO設計的關鍵,但我覺得有些情況下這個原則可以並且應該被打破(就像數據庫規範化規則一樣)。我積極推動SRP的好處,並且我的絕大多數代碼遵循這一原則。

但是,它是一個規則,從而意味着它不應該被打破?

回答

22

很少的規則,如果有的話,在軟件開發中是沒有例外。有人認爲goto沒有地方,但他們錯了。

至於OOP去,沒有面向對象性,從而取決於你問,你會得到不同的軟硬原則,模式和做法,誰的單一定義。

OOP的經典思想是,消息被髮送到否則不透明的物體和物體解釋該消息與自己的內臟的知識,然後執行某種功能。

SRP是一種軟件工程原理,可以應用於類,函數或模塊的角色。它有助於某種東西的凝聚力,以使它表現得很好,沒有不相干的東西掛在一起,或者有多重角色交織在一起並使事情複雜化。

即使只是一個負有責任,仍然可以從單一功能到一組鬆散相關的功能是一個共同的主題系列的一部分。只要你避免陪審團操縱一個元素來承擔一些不是主要設計的事情的責任,或者做一些稀釋對象簡單性的特殊事情,那麼就違反了你想要的任何原則。

但是,我發現SRP更準確,然後做更精細的事情也同樣強大。

+0

的「問題」,我努力克服有關SRP是「有多少是遠」?你可以把它放到一個荒謬的級別,這樣做,爲每個實體生成100個類。 – 2011-05-26 12:51:41

+3

@PERERER ZERO:閱讀這個問題的答案:[如何確定如何粗略或細粒度責任應該當](http://stackoverflow.com/問題/ 2455705 /你怎麼確定如何 - 粗略或細粒度 - 責任 - 應該 - 何時)他說得很好。 – User 2011-07-22 23:34:07

5

這些規則都不是法律。他們更多的指導方針和最佳實踐。有時候,遵循「規則」是沒有意義的,你需要做一些最適合你的情況。

不要害怕做你認爲正確的事。你可能會想出更新更好的規則。

1

啊,我猜這個屬於我給的答案。 :)

與大多數規則和法律一樣,這些規則有相關的動機 - 如果潛在的動機不存在或不適用於您的案例,那麼您可以自由地根據你自己的需求。

話雖這麼說,SRP是不是OOP本身的規則,但被認爲是最佳實踐創建既易於擴展和單位可測試的OOP應用程序。

兩者都是,我認爲作爲企業應用程序開發,在現有應用程序的維護佔用比新的發展做更多的時間最重要的特徵。

5

引述巴伯薩船長:

「 ..和其次,你必須對海盜的代碼申請海盜和你不 第三,代碼越多,你想叫什麼」準則「比實際的規則......」

引述傑克斯派洛&吉布斯。 「我以爲你應該遵守代碼。」 吉布斯先生:「我們估計,他們更實際的指導方針。」

所以很明顯盜明白這相當不錯。

的「規則」可以通過運動模式可以理解爲「力」

所以有試圖讓這個類有一個責任的力量。 (凝聚力)

但也有試圖保持連接到其他類下跌的力量。

與所有設計(不僅僅是代碼)一樣,答案在於它取決於。

0

正如許多其他海報所說,所有規則都被打破。
這就是說,我認爲SRP是編寫優秀代碼的更重要的規則之一。它不是特定於面向對象的編程,但是如果類沒有單獨的責任,OOP的「封裝」部分很難做到。

畢竟,你如何正確而簡便地封裝與多重責任的一類?通常情況下,答案是多個界面,並且在很多語言中可以提供很多幫助,但是對於班級的用戶來說,它仍然會讓人感到困惑,因爲它可能會在不同情況下以完全不同的方式應用。

0

SRP只是ISP的另一個表達:-)。

而「P」的意思是「原則」,而不是「規則」:d