日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 大橙子瘋嵌入式


前言

軟件開發(fā)設(shè)計(jì)中最大的難題就是應(yīng)對(duì)需求的變化,而各種各樣的需求變化又是不可預(yù)料的,我們要為這種不可預(yù)料的變化做好準(zhǔn)備,這本身是一件十分痛苦的事情,通常涉及到功能的變更、擴(kuò)展和刪除等,所幸前輩們已經(jīng)給我們提出了經(jīng)典的六大設(shè)計(jì)原則23種設(shè)計(jì)模式來“封裝”未來的變化。

在程序設(shè)計(jì)領(lǐng)域, SOLID(單一功能、開閉原則、里氏替換、接口隔離以及依賴反轉(zhuǎn))是由羅伯特·C·馬丁在21世紀(jì)早期引入的記憶術(shù)首字母縮略字,指代了面向?qū)ο缶幊毯兔嫦驅(qū)ο笤O(shè)計(jì)的五個(gè)基本原則。六大設(shè)計(jì)原則中多了一個(gè)“迪米特法則”。

本文只針對(duì)六大設(shè)計(jì)原則的單一職責(zé)原則進(jìn)行介紹。

六大設(shè)計(jì)原則和23種設(shè)計(jì)模式主要適用于面向?qū)ο蟮木幊陶Z言,而非面向過程語言,即C語言。
熟練理解6大設(shè)計(jì)原則后,在面向過程語言中也能有一定的借鑒。

定義

在面向?qū)ο缶幊填I(lǐng)域中,單一功能原則(Single responsibility principle)規(guī)定每個(gè)類都應(yīng)該有一個(gè)單一的功能,并且該功能應(yīng)該由這個(gè)類完全封裝起來。所有它的(這個(gè)類的)服務(wù)都應(yīng)該嚴(yán)密的和該功能平行(功能平行,意味著沒有依賴)。
單一職責(zé)原則又稱單一功能原則,不要讓一個(gè)類承擔(dān)過多的職責(zé)。避免職責(zé)耦合在一起,避免一個(gè)職責(zé)的變化影響到其他職責(zé)。
所謂職責(zé)是指類變化的原因。如果一個(gè)類有多于一個(gè)的動(dòng)機(jī)被改變,那么這個(gè)類就具有多于一個(gè)的職責(zé)。而單一職責(zé)原則就是指一個(gè)類或者模塊應(yīng)該有且只有一個(gè)改變的原因。

一個(gè)具體的例子就是,想象有一個(gè)用于編輯和打印報(bào)表的模塊。這樣的一個(gè)模塊存在兩個(gè)改變的原因。第一,報(bào)表的內(nèi)容可以改變(編輯)。第二,報(bào)表的格式可以改變(打印)。這兩方面的改變會(huì)因?yàn)橥耆煌钠鹨蚨l(fā)生:一個(gè)是本質(zhì)的修改,一個(gè)是表面的修改。單一功能原則認(rèn)為這兩方面的問題事實(shí)上是兩個(gè)分離的功能,因此他們應(yīng)該分離在不同的類或者模塊里。

原則

如果一個(gè)類或者模塊承擔(dān)的職責(zé)過多,就等于把這些職責(zé)耦合在一起了。一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類完成其他職責(zé)的能力。這種耦合會(huì)導(dǎo)致脆弱的設(shè)計(jì),當(dāng)發(fā)生變化時(shí),設(shè)計(jì)會(huì)遭受到意想不到的破壞。而如果想要避免這種現(xiàn)象的發(fā)生,就要盡可能的遵守單一職責(zé)原則。

比如功能1和功能2,功能1由于需求變更導(dǎo)致功能1模塊需要調(diào)整,而調(diào)整后可能導(dǎo)致功能2原本正常的功能出現(xiàn)異常,這就表明功能1和功能2存在耦合

因此此原則的核心就是解耦增強(qiáng)內(nèi)聚性,控制類的粒度大?。K或函數(shù)功能的粒度大?。?

C語言中可以理解為功能模塊化、單一功能文件、單一功能函數(shù)等,如實(shí)現(xiàn)oled功能模塊、由具體功能實(shí)現(xiàn)接口函數(shù)文件、硬件接口功能文件、配置文件和字體數(shù)據(jù)文件組成;同時(shí)每個(gè)文件中的每個(gè)函數(shù)只具備一個(gè)功能,如畫點(diǎn)、畫線、畫圓,甚至細(xì)分到光標(biāo)定位函數(shù)。

其實(shí)熟練的程序設(shè)計(jì)人員都清楚應(yīng)該寫出高內(nèi)聚低耦合的程序,但是實(shí)際開發(fā)過程中很多耦合常常發(fā)生在不經(jīng)意之間。

職責(zé)擴(kuò)散:因?yàn)槟撤N原因,某一職責(zé)被分化為顆粒度更細(xì)的多個(gè)職責(zé)了;比如光標(biāo)定位函數(shù)過度地細(xì)分了多個(gè)函數(shù)進(jìn)行實(shí)現(xiàn)

因此在實(shí)現(xiàn)中,也需要把握尺度,避免過度細(xì)分功能函數(shù)。

優(yōu)點(diǎn)

  • 功能單一后,復(fù)雜度降低,自然可讀性增強(qiáng)

  • 擴(kuò)展性增強(qiáng),針對(duì)某一個(gè)功能更加容易變更

  • 變更引起的風(fēng)險(xiǎn)降低,由于功能單一,相互獨(dú)立,因此功能更改基本不會(huì)影響其他功能

總結(jié)

從字面上理解不難。但是“看懂”和“會(huì)用”是兩回事,而“用好”更是難上加難。從工作經(jīng)歷來看,很多朋友因?yàn)閷?duì)這些原則理解得不夠透徹,導(dǎo)致在使用的時(shí)候過于教條主義,拿原則當(dāng)真理,生搬硬套,適得其反。

如何理解?

一個(gè)類或模塊只負(fù)責(zé)完成一個(gè)職責(zé)或者功能。不要設(shè)計(jì)大而全的類或模塊,要設(shè)計(jì)粒度小、功能單一的類或模塊。但是,如果拆分得過細(xì),實(shí)際上會(huì)適得其反,反倒會(huì)降低內(nèi)聚性,也會(huì)影響代碼的可維護(hù)性。單一職責(zé)原則是為了實(shí)現(xiàn)代碼高內(nèi)聚、低耦合,提高代碼的復(fù)用性、可讀性、可維護(hù)性

如何判斷類的職責(zé)是否足夠單一?

在不同的應(yīng)用場(chǎng)景、不同階段的需求背景、不同的業(yè)務(wù)層面,對(duì)同一個(gè)類的或模塊職責(zé)是否單一,可能會(huì)有不同的判定結(jié)果。實(shí)際上,一些側(cè)面的判斷指標(biāo)更具有指導(dǎo)意義和可執(zhí)行性,比如,出現(xiàn)下面這些情況就有可能說明這類或模塊的設(shè)計(jì)不滿足單一職責(zé)原則:

  • 類(模塊)中的代碼行數(shù)、函數(shù)或者變量過多(關(guān)聯(lián)?。?/span>

  • 類(模塊)依賴的其他類(模塊)過多,或者依賴類(模塊)的其他類(模塊)過多;

  • 函數(shù)過多(可以再具體分類);

  • 比較難給類(模塊)起一個(gè)合適的名字;




本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉