官术网_书友最值得收藏!

第2章 六大設計原則

2.1 單一職責原則

2.1.1 單一職責原則定義

單一職責原則(Single Responsibility Principle,SRP)又稱單一功能原則,是面向對象的五個基本原則(SOLID)之一。它規定一個類應該只有一個發生變化的原因,該原則由羅伯特·C.馬丁(Robert C.Martin)在《敏捷軟件開發:原則、模式與實踐》一書中提出。

如果需要開發的一個功能需求不是一次性的,且隨著業務發展的不斷變化而變化,那么當一個Class類負責超過兩個及以上的職責時,就在需求的不斷迭代、實現類持續擴張的情況下,就會出現難以維護、不好擴展、測試難度大和上線風險高等問題。

所謂的職責就是指類變化的原因,也就是業務需求。如果一個類有多于一個的原因被改變,那么這個類就有超過兩個及以上的職責。而單一職責約定一個類應該有且僅有一個改變類的原因。

2.1.2 模擬場景

這里通過一個視頻網站用戶分類的例子,來幫助大家理解單一職責原則的構建方法。當在各類視頻網站看電影、電視劇時,網站針對不同的用戶類型,會在用戶觀看時給出不同的服務反饋,如以下三種。

·訪客用戶,一般只可以觀看480P視頻,并時刻提醒用戶注冊會員能觀看高清視頻。這表示視頻業務發展需要拉客,以獲取更多的新注冊用戶。

·普通會員,可以觀看720P超清視頻,但不能屏蔽視頻中出現的廣告。這表示視頻業務發展需要盈利。

·VIP 會員(屬于付費用戶),既可以觀看 1080P 藍光視頻,又可以關閉或跳過廣告。

2.1.3 違背原則方案

下面根據需求場景直接編碼,實現一個最簡單的基本功能,即根據不同的用戶類型,判斷用戶可以觀看視頻的類型。

如上,實現業務功能邏輯的方式非常簡單,暫時也不會出什么問題。但是這一個類里包含著多個不同的行為,也就是多種用戶職責。如果在這樣的類上繼續擴展功能或添加邏輯,就會顯得非常臃腫。

接下來通過單元測試,再看這個類功能的使用。

因為上面的實現方式是在一個類中用if…else判斷邏輯,所以在調用方法時是所有的職責用戶都使用一個方法實現,作為程序調用入口。對于簡單的或者幾乎不需要迭代的功能,這種實現也未償不可。但如果面對頻繁迭代的業務需求,這樣的代碼結構就很難支撐系統迭代,每一次需求的實現都可能會影響其他邏輯,給整個接口服務帶來不可控的風險。

2.1.4 單一職責原則改善代碼

視頻播放是視頻網站的核心功能,當核心功能開發完成后,就需要不斷地完善用戶權限。這樣才能更好地運營一家視頻網站。

在模擬用戶場景中,其實就是在不斷地建設用戶權益。針對不同的用戶類型提供差異化服務,既滿足獲客需求,又可以讓部分用戶選擇付費。

為了滿足這樣不斷迭代的需求,就不能使用一個類把所有職責行為混為一談,而是需要提供一個上層的接口類,對不同的差異化用戶給出單獨的實現類,拆分各自的職責邊界。

1.定義接口

定義出上層接口 IVideoUserService,統一定義需要實現的功能,包括:視頻清晰級別接口definition()、廣告播放方式接口advertisement()。三種不同類型的用戶就可以分別實現自己的服務類,做到職責統一。

(1)實現類,訪客用戶。這個類實現的是訪客用戶在視頻網站中的形態,比如這類用戶只能觀看480P高清視頻,同時需要觀看廣告。

(2)實現類,普通會員。這個類實現的是普通會員在視頻網站中的形態,也就是注冊用戶可以觀看720P超清視頻,另外也需要觀看廣告。

(3)實現類,VIP會員。這個類實現的是VIP會員在視頻網站中的形態。因為這類用戶已經是付費用戶,所以可以觀看更高清的視頻,同時不需要觀看廣告。

綜上,每種用戶對應的服務職責都有對應的類實現,不會互相干擾。當某一類用戶需要添加新的運營規則時,操作起來也可以非常方便。比如,所有的注冊用戶可以發彈幕、付費用戶可以點播等。類關系圖如圖2-1所示。

2.單元測試

接下來再看現在的類服務的使用方式。

圖2-1

通過利用單一職責原則的代碼優化后,現在每個類都只負責自己的用戶行為。后續無論擴展新的功能還是需要在某個時刻修改某個用戶行為類,都可以非常方便地開發和維護。

在項目開發的過程中,盡可能保證接口的定義、類的實現以及方法開發保持單一職責,對項目后期的迭代和維護會有很大的幫助。

主站蜘蛛池模板: 新巴尔虎左旗| 佛坪县| 武陟县| 饶平县| 天祝| 灌阳县| 义乌市| 军事| 湖州市| 牟定县| 社旗县| 聂拉木县| 茂名市| 图们市| 桑植县| 独山县| 新闻| 苗栗市| 海城市| 英德市| 恩平市| 韶关市| 平江县| 南部县| 广宁县| 博罗县| 禄丰县| 浦北县| 略阳县| 含山县| 安宁市| 崇仁县| 庆云县| 苏尼特左旗| 察隅县| 鄂托克旗| 绥中县| 隆化县| 绿春县| 长乐市| 香格里拉县|