單一功能原則

在面向對象編程領域中 ， 單一功能原則 （ Single responsibility principle ） 規定每個類都應該有一個單一的功能 ， 並且該功能應該由這個類完全封裝起來 。 所有它的 （ 這個類的 ） 服務都應該嚴密的和該功能平行 （ 功能平行 ， 意味着沒有依賴 ） 。 這個術語由羅伯特 · C · 馬丁 （ Robert Cecil Martin ） 在他的 《 敏捷軟件開發 ， 原則 ， 模式和實踐 》 一書中的一篇名爲 〈 面向對象設計原則 〉 的文章中給出 。 馬丁表述該原則是基於的 《 結構化分析和系統規格 》 一書中的內聚原則 （ Cohesion ） 上 。 馬丁把功能 （ 職責 ） 定義爲 ： “ 改變的原因 ” ， 並且總結出一個類或者模塊應該有且只有一個改變的原因 。 如果你能夠想到多於一個的動機去改變一個類 ， 那麼這個類就具有多於一個的職責 。 一個具體的例子就是 ， 想象有一個用於編輯和打印報表的模塊 。 這樣的一個模塊存在兩個改變的原因 。 第一 ， 報表的內容可以改變 （ 編輯 ） 。 第二 ， 報表的格式可以改變 （ 打印 ） 。 這兩方面的改變會因爲完全不同的起因而發生 ： 一個是本質的修改 ， 一個是表面的修改 。 單一功能原則認爲這兩方面的問題事實上是兩個分離的功能 ， 因此他們應該分離在不同的類或者模塊裏 。 把有不同的改變原因的事物耦合在一起的設計是糟糕的 。 保持一個類專注於單一功能點上的一個重要的原因是 ， 它會使得類更加的健壯 。 繼續上面的例子 ， 如果有一個對於報表編輯流程的修改 ， 那麼將存在極大的危險性 ， 因爲假設這兩個功能存在於同一個類中 ， 修改報表的編輯流程會導致公共狀態或者依賴關係的改變 ， 打印功能的代碼會因此不工作 。