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

1.2 設(shè)計(jì)模式的原則

1.2.1 單一職責(zé)原則

引用百度詞條對(duì)單一職責(zé)原則的定義:“單一職責(zé)原則(Single Responsibility Principle,SRP)又稱單一功能原則,面向?qū)ο笪鍌€(gè)基本原則(SOLID)之一。它規(guī)定一個(gè)類應(yīng)該只有一個(gè)發(fā)生變化的原因。該原則是Robert C. Martin于《敏捷軟件開發(fā):原則、模式與實(shí)踐》一書中給出的。Martin表示此原則是基于Tom DeMarco和Meilir Page-Jones的著作中的內(nèi)聚性原則發(fā)展出的。”

單一職責(zé)原則,強(qiáng)調(diào)的是職責(zé)的分離,一個(gè)類,只需要負(fù)責(zé)一種職責(zé)即可,一個(gè)類發(fā)生變化的原因,必然是所負(fù)責(zé)的職責(zé)發(fā)生變化。這聽起來很抽象,干澀的文字描述可能會(huì)讓經(jīng)驗(yàn)稍淺的讀者產(chǎn)生一定的困惑,可實(shí)際上,從我們接觸代碼的那一刻起,已經(jīng)時(shí)時(shí)刻刻地在遵守單一職責(zé)原則。

· main函數(shù)所在的類,作為程序的啟動(dòng)入口,職責(zé)單一。

· SpringBoot框架的啟動(dòng)類是單一職責(zé)原則最完美的寫照。

· 我們創(chuàng)建的utils工具類,對(duì)日期的處理一般會(huì)封裝到一個(gè)DateUtils.java中,職責(zé)單一。即便我們將所有的工具類方法封裝到一個(gè)統(tǒng)一的CommonUtils.java中,也依然遵循了單一職責(zé)原則,因?yàn)樗穆氊?zé)就是工具。

· 大家眾所周知的MVC框架,提倡將接入層Controller、服務(wù)層Service、持久層DAO分別進(jìn)行實(shí)現(xiàn),劃分不同的職責(zé),也遵循了單一職責(zé)原則。

……

單一職責(zé)原則,是一個(gè)備受爭(zhēng)議的原則,也是設(shè)計(jì)模式最為基礎(chǔ)的原則。備受爭(zhēng)議的原因是,每個(gè)人對(duì)職責(zé)劃分的看法不一樣,不同項(xiàng)目需求所面臨的挑戰(zhàn)和劃分方式不一樣。我們以一個(gè)簡(jiǎn)單的“用戶注冊(cè)和用戶登錄”需求為例,展開一場(chǎng)討論,相信這個(gè)需求對(duì)讀者來說是非常簡(jiǎn)單的,很快就能書寫以下代碼。

這是一個(gè)非常完美的設(shè)計(jì),UserService類完全遵循了單一職責(zé)原則,不管是register注冊(cè)功能還是login登錄功能,都屬于“用戶操作”的相關(guān)職責(zé),簡(jiǎn)單的注冊(cè)和登錄功能,用粗粒度的“用戶操作”職責(zé)進(jìn)行了正確的劃分。

然而,如果登錄功能需要滿足多種第三方賬號(hào)授權(quán)登錄,注冊(cè)功能需要進(jìn)行短信、郵箱等動(dòng)態(tài)碼驗(yàn)證,金融相關(guān)軟件還需要進(jìn)行身份證驗(yàn)證和人臉識(shí)別等一系列附加功能,我們可能就要考慮將登錄功能和注冊(cè)功能以更加細(xì)粒度的職責(zé)進(jìn)行劃分。

(1)登錄功能單獨(dú)劃分,提供默認(rèn)登錄方式(擁有本站賬號(hào)的用戶)和第三方賬號(hào)的驗(yàn)證及登錄功能。

(2)注冊(cè)功能單獨(dú)劃分,分為注冊(cè)功能以及注冊(cè)過程中所需要的相關(guān)驗(yàn)證功能如下。

這樣的設(shè)計(jì)也是非常正確的,隨著業(yè)務(wù)的復(fù)雜程度越來越高,每一個(gè)細(xì)粒度的職責(zé)都可能擁有非常復(fù)雜的邏輯,那么我們就要考慮是否可以按照項(xiàng)目需求進(jìn)行更加細(xì)粒度的職責(zé)拆分,從而保證單一職責(zé)原則下的低耦合度。當(dāng)然,部分讀者會(huì)認(rèn)為,是否可以將“手機(jī)驗(yàn)證功能”和“郵箱驗(yàn)證功能”再次進(jìn)行單一職責(zé)的劃分?當(dāng)然可以,但是要避免過度的職責(zé)拆分,要根據(jù)項(xiàng)目需求的復(fù)雜程度進(jìn)行合理的規(guī)劃。

最后,我想對(duì)廣大讀者說的是,單一職責(zé)原則的劃分沒有正確與錯(cuò)誤之分,每個(gè)開發(fā)者都有自己的考量角度和劃分方式。一切都應(yīng)該以項(xiàng)目實(shí)際情況為出發(fā)點(diǎn)進(jìn)行設(shè)計(jì),因地制宜才是我們真正需要遵守的原則。

主站蜘蛛池模板: 廉江市| 汝阳县| 台南市| 邻水| 桦甸市| 寿阳县| 保德县| 延长县| 河津市| 即墨市| 柳江县| 黔江区| 宣威市| 和田市| 曲周县| 文水县| 临海市| 原平市| 论坛| 汤原县| 尉氏县| 临猗县| 黄龙县| 建宁县| 巴彦县| 科技| 河曲县| 酒泉市| 綦江县| 南城县| 探索| 麻城市| 万年县| 靖边县| 英山县| 商都县| 通海县| 双辽市| 丽江市| 泰来县| 永州市|