單一職責(zé)原則也是面向?qū)ο笤O(shè)計(jì)原則中的一條,下面我們就來(lái)詳細(xì)地對(duì)其進(jìn)行介紹。
單一職責(zé)原則(Single Responsibility Principle,SRP)又稱單一功能原則,由羅伯特·C.馬丁(Robert C. Martin)于《敏捷軟件開發(fā):原則、模式和實(shí)踐》一書中提出的。這里的職責(zé)是指類變化的原因,單一職責(zé)原則規(guī)定一個(gè)類應(yīng)該有且僅有一個(gè)引起它變化的原因,否則類應(yīng)該被拆分(There should never be more than one reason for a class to change)。
該原則提出對(duì)象不應(yīng)該承擔(dān)太多職責(zé),如果一個(gè)對(duì)象承擔(dān)了太多的職責(zé),至少存在以下兩個(gè)缺點(diǎn):
1、一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類實(shí)現(xiàn)其他職責(zé)的能力;
2、當(dāng)客戶端需要該對(duì)象的某一個(gè)職責(zé)時(shí),不得不將其他不需要的職責(zé)全都包含進(jìn)來(lái),從而造成冗余代碼或代碼的浪費(fèi)。
單一職責(zé)原則的核心就是控制類的粒度大小、將對(duì)象解耦、提高其內(nèi)聚性。如果遵循單一職責(zé)原則將有以下優(yōu)點(diǎn)。
• 降低類的復(fù)雜度。一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé),其邏輯肯定要比負(fù)責(zé)多項(xiàng)職責(zé)簡(jiǎn)單得多。
• 提高類的可讀性。復(fù)雜性降低,自然其可讀性會(huì)提高。
• 提高系統(tǒng)的可維護(hù)性??勺x性提高,那自然更容易維護(hù)了。
• 變更引起的風(fēng)險(xiǎn)降低。變更是必然的,如果單一職責(zé)原則遵守得好,當(dāng)修改一個(gè)功能時(shí),可以顯著降低對(duì)其他功能的影響。
單一職責(zé)原則是最簡(jiǎn)單但又最難運(yùn)用的原則,需要設(shè)計(jì)人員發(fā)現(xiàn)類的不同職責(zé)并將其分離,再封裝到不同的類或模塊中。而發(fā)現(xiàn)類的多重職責(zé)需要設(shè)計(jì)人員具有較強(qiáng)的分析設(shè)計(jì)能力和相關(guān)重構(gòu)經(jīng)驗(yàn)。下面以大學(xué)學(xué)生工作管理程序?yàn)槔榻B單一職責(zé)原則的應(yīng)用。
【例1】大學(xué)學(xué)生工作管理程序。
分析:大學(xué)學(xué)生工作主要包括學(xué)生生活輔導(dǎo)和學(xué)生學(xué)業(yè)指導(dǎo)兩個(gè)方面的工作,其中生活輔導(dǎo)主要包括班委建設(shè)、出勤統(tǒng)計(jì)、心理輔導(dǎo)、費(fèi)用催繳、班級(jí)管理等工作,學(xué)業(yè)指導(dǎo)主要包括專業(yè)引導(dǎo)、學(xué)習(xí)輔導(dǎo)、科研指導(dǎo)、學(xué)習(xí)總結(jié)等工作。如果將這些工作交給一位老師負(fù)責(zé)顯然不合理,正確的做 法是生活輔導(dǎo)由輔導(dǎo)員負(fù)責(zé),學(xué)業(yè)指導(dǎo)由學(xué)業(yè)導(dǎo)師負(fù)責(zé),其類圖如圖 1 所示。
圖1 大學(xué)學(xué)生工作管理程序的類圖
注意:?jiǎn)我宦氊?zé)同樣也適用于方法。一個(gè)方法應(yīng)該盡可能做好一件事情。如果一個(gè)方法處理的事情太多,其顆粒度會(huì)變得很粗,不利于重用。