一、SRP簡介(SRP--Single-Responsibility Principle):
就一個(gè)類而言,應(yīng)該只專注于做一件事和僅有一個(gè)引起它變化的原因。PHP開源com
所謂職責(zé),我們可以理解他為功能,就是設(shè)計(jì)的這個(gè)類功能應(yīng)該只有一個(gè),而不是兩個(gè)或更多。也可以理解為引用變化的原因,當(dāng)你發(fā)現(xiàn)有兩個(gè)變化會要求我們修改這個(gè)類,那么你就要考慮撤分這個(gè)類了。因?yàn)槁氊?zé)是變化的一個(gè)軸線,當(dāng)需求變化時(shí),該變化會反映類的職責(zé)的變化。
“就像一個(gè)人身兼數(shù)職,而這些事情相互關(guān)聯(lián)不大,,甚至有沖突,那他就無法很好的解決這些職責(zé),應(yīng)該分到不同的人身上去做才對。”
二、舉例說明:
違反SRP原則代碼: PHP開源com
modem接口明顯具有兩個(gè)職責(zé):連接管理和數(shù)據(jù)通訊;
interface Modem
{
public void dial(string pno);
public void hangup();
public void send(char c);
public void recv();
}
如果應(yīng)用程序變化影響連接函數(shù),那么就需要重構(gòu):
interface DataChannel
{
public void send(char c);
public void recv();
}
interface Connection
{
public void dial(string pno);
public void hangup();
}
三、SRP優(yōu)點(diǎn):PHP開源com
消除耦合,減小因需求變化引起代碼僵化性臭味
四、使用SRP注意點(diǎn):
1、一個(gè)合理的類,應(yīng)該僅有一個(gè)引起它變化的原因,即單一職責(zé);
2、在沒有變化征兆的情況下應(yīng)用SRP或其他原則是不明智的;
3、在需求實(shí)際發(fā)生變化時(shí)就應(yīng)該應(yīng)用SRP等原則來重構(gòu)代碼;
4、使用測試驅(qū)動開發(fā)會迫使我們在設(shè)計(jì)出現(xiàn)臭味之前分離不合理代碼;
5、如果測試不能迫使職責(zé)分離,僵化性和脆弱性的臭味會變得很強(qiáng)烈,那就應(yīng)該用Facade或Proxy模式對代碼重構(gòu);