聊聊軟件設(shè)計(jì)原則(三)單一職責(zé)原則(SRP)

?單一職責(zé)(Simple Responsibility Pinciple,SRP)是指不要存在多于一個(gè)導(dǎo)致類變更的原因。假設(shè)我們有一個(gè)類負(fù)責(zé)兩個(gè)職責(zé),一旦需求發(fā)生變更,修改其中一個(gè)職責(zé)的業(yè)務(wù)邏輯代碼時(shí),有可能導(dǎo)致另一個(gè)職責(zé)的功能發(fā)生故障。這樣一來,這個(gè)類就存在兩個(gè)導(dǎo)致類變更的原因。
?如何去解決這個(gè)問題呢?很簡(jiǎn)單,將兩個(gè)職責(zé)用兩個(gè)類來實(shí)現(xiàn),進(jìn)行解耦。后期需求變更和維護(hù)互不影響。這樣的設(shè)計(jì),可以降低類的復(fù)雜度,提高類的可讀性,提高系統(tǒng)的可維護(hù)性,降低代碼變更引起的風(fēng)險(xiǎn)。
?總而言之,就是盡可能的讓一個(gè)類,接口或者方法只負(fù)責(zé)一項(xiàng)職責(zé)。

?來看一段代碼幫助理解,還是拿書舉例。現(xiàn)在這些書,成了電子書。電子書分免費(fèi)書和付費(fèi)書。免費(fèi)書可以任意觀看,付費(fèi)書僅限VIP觀看,功能職責(zé)不一樣。先創(chuàng)建一個(gè)Book類:

/**
 * @Author: zhouzhen
 * @email: zhouzhen0517@foxmail.com
 * @Description
 * @Date: Create in 12:39 2020/4/9
 */
public class Book {
    public void read(String bookName) {
        if("免費(fèi)書".equals(bookName)) {
            System.out.println("可以任意觀看");
        } else {
            System.out.println("僅限VIP觀看");
        }
    }
}

來看一下調(diào)用代碼

    public static void main(String[] args) {
        Book book = new Book();
        book.read("免費(fèi)書");
        book.read("付費(fèi)書");
    }

?從上面的代碼看,Book類承擔(dān)了兩種處理邏輯。假如現(xiàn)在要對(duì)電子書進(jìn)行加密,免費(fèi)書和付費(fèi)書的加密邏輯不一樣,必須修改代碼。而修改代碼勢(shì)必會(huì)相互影響,容易帶來不可控的風(fēng)險(xiǎn)。現(xiàn)在我們來對(duì)職責(zé)進(jìn)行解耦,來看代碼,分別創(chuàng)建兩個(gè)類:FreeBook和PayBook。

FreeBook的代碼如下:

/**
 * @Author: zhouzhen
 * @email: zhouzhen0517@foxmail.com
 * @Description
 * @Date: Create in 13:41 2020/4/10
 */
public class FreeBook {
    public void read(String bookName) {
        System.out.println(bookName + "可以任意觀看");
    }
}

PayBook的代碼如下:

/**
 * @Author: zhouzhen
 * @email: zhouzhen0517@foxmail.com
 * @Description
 * @Date: Create in 13:41 2020/4/10
 */
public class PayBook {
    public void read(String bookName) {
        System.out.println(bookName + "僅限VIP觀看");
    }
}

調(diào)用代碼如下:

    public static void main(String[] args) {
        FreeBook freeBook = new FreeBook();
        PayBook payBook = new PayBook();
        freeBook.read("免費(fèi)書");
        payBook.read("付費(fèi)書");
    }

?修改之后,各個(gè)類負(fù)責(zé)各自的職責(zé),開發(fā)起來簡(jiǎn)單,維護(hù)起來也容易。我們?cè)趯?shí)際開發(fā)中會(huì)有項(xiàng)目依賴,組合,聚合這些關(guān)系,還有項(xiàng)目的規(guī)模,周期,技術(shù)人員的水平,對(duì)進(jìn)度的把控。出于各方面的妥協(xié),很多類的設(shè)計(jì)都不符合單一職責(zé)原則。但是,我們?cè)诰帉懘a的過程中,還是要盡可能的讓接口和方法保持單一職責(zé),對(duì)項(xiàng)目的后期維護(hù)是有很大幫助的。

文章參考

《Spring5核心原理》〔中〕譚勇德(Tom)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容