若是一個類承擔的職責過多,就等於把這些職責耦合在了一塊兒。一個職責的變化可能削弱或者抑制這個類完成其餘職責的能力。java
這種耦合會致使脆弱的(fragile)設計,當變化時設計會遭受到意想不到的破壞。函數
在SRP中,咱們把職責定義爲「變化的緣由」。若是你可以想到多於一個的動機去改變一個類,那麼這個類就具備多於一個的職責。有時,咱們很難注意到這一點。咱們習慣於以組的形式去考慮職責。spa
Modem.java --違反SRP設計
interface Modem{ public void dial(String pno); public void hangup(); public void send(char c); public void recv(); }
然而,該接口中卻顯示出兩個職責。第一個職責是鏈接管理;第二個職責是數據通訊。dial和hangup函數進行調制解調器的鏈接處理,而send和recv 函數進行數據通訊。code
interface DataChannel{ public void send(char c); public void recv(); }
interface Connection{ public void dial(String pno); public void hangup(); }
....接口
。。。。io
....class
SRP是全部原則中最簡單的之一,也是最難正確運用的之一。咱們天然地把職責結合在一塊兒。軟件
軟件設計是真正要作的許多內容,就是發現職責並把那些職責相互分離。事實上,咱們將要論述的其他原則都會以忱樣或那樣的方式回到這個問題上。通信