面系那個(gè)對象開發(fā)原則.高內(nèi)聚.低耦合
軟件設(shè)計(jì)中通常用耦合度和內(nèi)聚度作為衡量模塊獨(dú)立程度的標(biāo)準(zhǔn)。劃分摸塊的一個(gè)準(zhǔn)則就是高內(nèi)聚低耦合。
這是軟件工程中的概念,是判斷設(shè)計(jì)好壞的標(biāo)準(zhǔn),主要是面向OO的設(shè)計(jì),主要是看類的內(nèi)聚性是否高,偶合度是否低.
每一個(gè)類完成特定的獨(dú)立的功能,這個(gè)就是高內(nèi)聚。耦合就是類之間的互相調(diào)用關(guān)系,如果耦合很強(qiáng),互相牽扯調(diào)用很多,那么會牽一發(fā)而動全身,不利于維護(hù)和擴(kuò)展。
類之間的設(shè)置應(yīng)該要低耦合,但是每個(gè)類應(yīng)該要高內(nèi)聚.耦合是類之間相互依賴的尺度.如果每個(gè)對象都有引用其它所有的對象,那么就有高耦合,這是不合乎要求的,因?yàn)樵趦蓚€(gè)對象之間,潛在性地流動了太多信息.低耦合是合乎要求的:它意味著對象彼此之間更獨(dú)立的工作.低耦合最小化了修改一個(gè)類而導(dǎo)致也要修改其它類的”連鎖反應(yīng)”. 內(nèi)聚是一個(gè)類中變量與方法連接強(qiáng)度的尺度.高內(nèi)聚是值得要的,因?yàn)樗馕吨惪梢愿玫貓?zhí)行一項(xiàng)工作.低內(nèi)聚是不好的,因?yàn)樗砻黝愔械脑刂g很少相關(guān).成分之間相互有關(guān)聯(lián)的模塊是合乎要求的.每個(gè)方法也應(yīng)該高內(nèi)聚.大多數(shù)的方法只執(zhí)行一個(gè)功能.不要在方法中添加’額外’的指令,這樣會導(dǎo)致方法執(zhí)行更多的函數(shù).
推廣開來說,這個(gè)思想并不限于類與類之間的關(guān)系。模塊和模塊,子系統(tǒng)之間也都要遵守這個(gè)原則,才可以設(shè)計(jì)出延展性比較強(qiáng)的系統(tǒng)。
什么是耦合
定義
耦合性也稱塊間聯(lián)系。指軟件系統(tǒng)結(jié)構(gòu)中各模塊間相互聯(lián)系緊密程度的一種度量。模塊之間聯(lián)系越緊密,其耦合性就越強(qiáng),模塊的獨(dú)立性則越差。模塊間耦合高低取決于模塊間接口的復(fù)雜性、調(diào)用的方式及傳遞的信息。
耦合度就是某模塊(類)與其它模塊(類)之間的關(guān)聯(lián)、感知和依賴的程度,是衡量代碼獨(dú)立性的一個(gè)指標(biāo),也是軟件工程設(shè)計(jì)
及編碼質(zhì)量評價(jià)的一個(gè)標(biāo)準(zhǔn)。耦合的強(qiáng)度依賴于以下幾個(gè)因素:
(1)一個(gè)模塊對另一個(gè)模塊的調(diào)用;
(2)一個(gè)模塊向另一個(gè)模塊傳遞的數(shù)據(jù)量;
(3)一個(gè)模塊施加到另一個(gè)模塊的控制的多少;
(4)模塊之間接口的復(fù)雜程度。
耦合分類
耦合按從強(qiáng)到弱的順序可分為以下幾種類型:
a)非直接耦合:兩模塊間沒有直接關(guān)系,之間的聯(lián)系完全是通過主模塊的控制和調(diào)用來實(shí)現(xiàn)的
b)數(shù)據(jù)耦合:指兩個(gè)模塊之間有調(diào)用關(guān)系,傳遞的是簡單的數(shù)據(jù)值,相當(dāng)于高級語言的值傳遞;
c)標(biāo)記耦合:指兩個(gè)模塊之間傳遞的是數(shù)據(jù)結(jié)構(gòu),如高級語言中的數(shù)組名、記錄名、文件名等這些名字即標(biāo)記,其實(shí)傳遞的是這個(gè)數(shù)據(jù)結(jié)構(gòu)的地址;
d)控制耦合:一指一個(gè)模塊調(diào)用另一個(gè)模塊時(shí),傳遞的是控制變量(如開關(guān)、標(biāo)志等),被調(diào)模塊通過該控制變量的值有選擇地執(zhí)行塊內(nèi)某一功能;
e)外部耦合:一組模塊都訪問同一全局簡單變量而不是同一全局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過參數(shù)傳遞該全局變量的信息
f)公共耦合:一組模塊都訪問同一個(gè)公共數(shù)
據(jù)環(huán)境。該公共數(shù)據(jù)環(huán)境可以是全局?jǐn)?shù)據(jù)結(jié)構(gòu)、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)等。
g)內(nèi)容耦合:這是最高程度的耦合,也是最差的耦合。當(dāng)一個(gè)模塊直接使用另一個(gè)模塊的內(nèi)部數(shù)據(jù),或通過非正常入口而轉(zhuǎn)入另一個(gè)模塊內(nèi)部。
為什么要低耦合(解耦合)
??在面向?qū)ο缶幊讨校瑢ο笞陨硎莾?nèi)聚的,是保管好自己的數(shù)據(jù),完成好自己的操作的,而對外界呈現(xiàn)出自己的狀態(tài)和行為。但是,沒有絕對的自力更生,對外開放也是必要的!一個(gè)對象,往往需要跟其他對象打交道,既包括獲知其他對象的狀態(tài),也包括仰賴其他對象的行為,而一旦這樣的事情發(fā)生時(shí),我們便稱該對象依賴于另一對象。只要兩個(gè)對象之間存在一方依賴一方的關(guān)系,那么我們就稱這兩個(gè)對象之間存在耦合。 比如媽媽和baby,媽媽要隨時(shí)關(guān)注baby的睡、醒、困、哭、尿等等狀態(tài),baby則要仰賴媽媽的喂奶、哄睡、換紙尿褲等行為,從程序的意義上說,二者互相依賴,因此也存在耦合。首先要說,耦合是必要的。
??耦合的程度就是耦合度,也就是雙方依賴的程度。上文所說的媽媽和baby就是強(qiáng)耦合。而你跟快遞小哥之間則是弱耦合。一般來說耦合度過高并不是一件好事。就拿作為IT精英的你來說吧,上級隨時(shí)敦促你的工作進(jìn)度,新手頻繁地需要你指導(dǎo)問題,隔三差五還需要參加酒局飯局,然后還要天天看領(lǐng)導(dǎo)的臉色、關(guān)注老婆的心情,然后你還要關(guān)注代碼中的bug 、bug、bug,和需求的變化、變化、變化,都夠焦頭爛額了,還猝不及防的要關(guān)注眼睛、頸椎、前列腺和頭發(fā)的狀態(tài),然后你再炒個(gè)股,這些加起來大概就是個(gè)強(qiáng)耦合了。從某種意義上來說,耦合天生就與自由為敵,無論是其他對象依賴于你,還是你依賴其他對象。比如有人嗜煙、酗酒,你有多依賴它們就有多不自由;比如有人家里生了七八個(gè)娃,還有年邁的父母、岳父母,他們有多依賴你,你就有多不自由。所以老子這樣講:“五音令人耳聾,五色令人目盲,馳騁狩獵令人心發(fā)狂,難得之貨令人行妨?!北R梭也是不無悲涼的說“人生而自由,卻又無往而不在枷鎖中”。因此,要想自由,就必須要降低耦合,而這個(gè)過程就叫做解耦和。
??耦合度很高的情況下,維護(hù)代碼時(shí)修改一個(gè)地方會牽連到很多地方,如果修改時(shí)沒有理清這些耦合關(guān)系,那么帶來的后果
可能會是災(zāi)難性的,特別是對于需求變化較多以及多人協(xié)作開發(fā)維護(hù)的項(xiàng)目,修改一個(gè)地方會引起本來已經(jīng)運(yùn)行穩(wěn)定的模塊錯誤,嚴(yán)重時(shí)會導(dǎo)致惡性循環(huán),問題永遠(yuǎn)改不完,開發(fā)和測試都在各種問題之間奔波勞累,最后導(dǎo)致項(xiàng)目延期,用戶滿意度降低,成本也增加了,這對用戶和開發(fā)商影響都是很惡劣的,各種風(fēng)險(xiǎn)也就不言而喻了。
如何降低耦合(解耦合)
- 少使用類的繼承,多用接口隱藏實(shí)現(xiàn)的細(xì)節(jié)。 Java面向?qū)ο缶幊桃虢涌诔酥С侄鄳B(tài)外, 隱藏實(shí)現(xiàn)細(xì)節(jié)也是其中一個(gè)目的。
- 模塊的功能化分盡可能的單一,道理也很簡單,功能單一的模塊供其它模塊調(diào)用的機(jī)會就少。(其實(shí)這是高內(nèi)聚的一種說法,高內(nèi)聚低耦合一般同時(shí)出現(xiàn),為了限制篇幅,我們將在以后的版期中討論)。
- 遵循一個(gè)定義只在一個(gè)地方出現(xiàn)。
- 少使用全局變量。
- 類屬性和方法的聲明少用public,多用private關(guān)鍵字,
- 多用設(shè)計(jì)模式,比如采用MVC的設(shè)計(jì)模式就可以降低界面與業(yè)務(wù)邏輯的耦合度。
- 盡量不用“硬編碼”的方式寫程序,同時(shí)也盡量避免直接用SQL語句操作數(shù)據(jù)庫。
-
最后當(dāng)然就是避免直接操作或調(diào)用其它模塊或類(內(nèi)容耦合);如果模塊間必須存在耦合,原則上盡量使用數(shù)據(jù)耦合,少用控制耦合,
限制公共耦合的范圍,避免使用內(nèi)容耦合。
什么是內(nèi)聚
??內(nèi)聚,通俗的來講,就是自己的東西自己保管,自己的事情自己做。每個(gè)模塊盡可能獨(dú)立完成自己的功能,不依賴于模塊外部的代碼。
??對象是什么?對象就是保管好自己的東西,做好自己的事情的程序模塊——這就是內(nèi)聚!當(dāng)然,對象的內(nèi)聚只是內(nèi)聚的一個(gè)層次,在不同的尺度下其實(shí)都有內(nèi)聚的要求,比如方法也要講內(nèi)聚,架構(gòu)也要講內(nèi)聚。
內(nèi)聚: 內(nèi)聚性又稱塊內(nèi)聯(lián)系。指模塊的功能強(qiáng)度的度量,即一個(gè)模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度的度量。若一個(gè)模塊內(nèi)各元素(語名之間、程序段之間)聯(lián)系的越緊密,則它的內(nèi)聚性就越高。
高內(nèi)聚:類與類之間的關(guān)系而定,高,意思是他們之間的關(guān)系要簡單,明了,不要有很強(qiáng)的關(guān)系,不然,運(yùn)行起來就會出問題。一個(gè)類的運(yùn)行影響到其他的類。由于高內(nèi)聚具備魯棒性,可靠性,可重用性,可讀性等優(yōu)點(diǎn),模塊設(shè)計(jì)推薦采用高內(nèi)聚。
內(nèi)聚度是指內(nèi)部各元素之間聯(lián)系的緊密程度,模塊的內(nèi)聚種類通??煞譃?種,按其內(nèi)聚度從低
到高的次序依此為:偶然內(nèi)聚、邏輯內(nèi)聚、瞬時(shí)內(nèi)聚、過程內(nèi)聚、通信內(nèi)聚、順序內(nèi)聚、功能內(nèi)聚。
1 偶然內(nèi)聚: 指一個(gè)模塊內(nèi)的各處理元素之間沒有任何聯(lián)系。
2 邏輯內(nèi)聚: 指模塊內(nèi)執(zhí)行幾個(gè)邏輯上相似的功能,通過參數(shù)確定該模塊完成哪一個(gè)功能。
3 時(shí)間內(nèi)聚: 把需要同時(shí)執(zhí)行的動作組合在一起形成的模塊為時(shí)間內(nèi)聚模塊。
4 通信內(nèi)聚: 指模塊內(nèi)所有處理元素都在同一個(gè)數(shù)據(jù)結(jié)構(gòu)上操作(有時(shí)稱之為信息內(nèi)聚),或者指各處理使用相同的輸入數(shù)據(jù)或者產(chǎn)生相同的輸出數(shù)據(jù)。
5 順序內(nèi)聚: 指一個(gè)模塊中各個(gè)處理元素都密切相關(guān)于同一功能且必須順序執(zhí)行,前一功能元素輸出就是下一功能元素的輸入。
6 功能內(nèi)聚: 這是最強(qiáng)的內(nèi)聚,指模塊內(nèi)所有元素共同完成一個(gè)功能,缺一不可。與其他模塊的耦合是最弱的。
例子:
有個(gè)例子很容易明白:一個(gè)程序有50個(gè)函數(shù),這個(gè)程序執(zhí)行得非常好;然而一旦你修改其中一個(gè)函數(shù),其他49個(gè)函數(shù)都需要做修改,這就是高耦合的后果。
一旦你理解了它,你編寫概要設(shè)計(jì)的時(shí)候設(shè)計(jì)類或者模塊自然會考慮到“高內(nèi)聚,低耦合”。
可能也可以這樣理解:
高內(nèi)聚相對的是方法的獨(dú)立性,減少外部(全局參數(shù))的影響。低耦合相對的是方法的依賴性低,可用搭積木的方式構(gòu)建程序。內(nèi)聚類似積木,耦合類似蓋房子,而高內(nèi)聚低耦合的方式是比較效率并個(gè)性化構(gòu)建房屋的方式。
Python安裝詳細(xì)教程
以windows版本舉例:
1、首先去Pycharm官網(wǎng),或者直接輸入網(wǎng)址:http://www.jetbrains.com/pycharm/download/#section=windows,下載PyCharm安裝包,根據(jù)自己電腦的操作系統(tǒng)進(jìn)行選擇,對于windows系統(tǒng)選擇下圖的框框所包含的安裝包。
2,雙擊下載的安裝包,進(jìn)行安裝,然后會彈出界面:
3,選擇安裝目錄,Pycharm需要的內(nèi)存較多,建議將其安裝在D盤或者E盤,不建議放在系統(tǒng)盤C盤:
4,點(diǎn)擊Next,進(jìn)入下圖的界面:
Create Desktop Shortcut創(chuàng)建桌面快捷方式,一個(gè)32位,一個(gè)64位,小編的電腦是64位系統(tǒng),所以選擇64位。
勾選Create Associations是否關(guān)聯(lián)文件,選擇以后打開.py文件就會用PyCharm打開。
5,點(diǎn)擊Next,進(jìn)入下圖(默認(rèn)安裝即可):
6,耐心的等待兩分鐘左右,如下圖:
7,之后就會得到下面的安裝完成的界面:
8,選擇Accept,進(jìn)入下一步:
9,進(jìn)入激活界面,選擇第二個(gè)License server,如下圖所示:
之后在License server address中隨意輸入下面兩個(gè)注冊碼中的任意一個(gè)即可,Pycharm新注冊碼1:http://idea.liyang.io或pycharm新注冊碼2:http://xidea.online,之后點(diǎn)擊OK,便可以激活Pycharm了。
如果還不行,那么點(diǎn)擊圖片中的
,復(fù)制粘貼以下驗(yàn)證碼:
View Code
10,Pycharm激活后:
激活之后會自動跳轉(zhuǎn)到下圖界面,選擇IDE主題與編輯區(qū)主題:
11,可以選擇主題風(fēng)格:
12,之后進(jìn)入界面:
13,創(chuàng)建py文件:
14,最終書寫代碼并運(yùn)行:
print輸出帶顏色的方法
書寫格式: 開頭部分 :\033[顯示方式;前景色;背景色m + 結(jié)尾部分: \033[0m
? 注意:開頭部分的三個(gè)參數(shù):顯示方式,前景色,背景色是可選參數(shù),可以只寫其中的某一個(gè);另外由于表示三個(gè)參數(shù)不同含義的數(shù)值都是唯一的沒有重復(fù)的,所以三個(gè)參數(shù)的書寫先后順序沒有固定要求,系統(tǒng)都能識別;但是,建議按照默認(rèn)的格式規(guī)范書寫。
? 對于結(jié)尾部分,其實(shí)也可以省略,但是為了書寫規(guī)范,建議\033[***開頭,\033[0m結(jié)尾。
-------------------------------------------
-------------------------------------------
字體色 | 背景色 | 顏色描述
-------------------------------------------
30 | 40 | 黑色
31 | 41 | 紅色
32 | 42 | 綠色
33 | 43 | 黃色
34 | 44 | 藍(lán)色
35 | 45 | 紫紅色
36 | 46 | 青藍(lán)色
37 | 47 | 白色
-------------------------------------------
-------------------------------
顯示方式 | 效果
-------------------------------
0 | 終端默認(rèn)設(shè)置
1 | 高亮顯示
4 | 使用下劃線
5 | 閃爍
7 | 反白顯示
8 | 不可見
-------------------------------
數(shù)值表示的參數(shù)含義:
顯示方式:
0(默認(rèn)值)、1(高亮)、22(非粗體)、4(下劃線)、24(非下劃線)、 5(閃爍)、25(非閃爍)、7(反顯)、27(非反顯)
前景色:
30(黑色)、31(紅色)、32(綠色)、 33(黃色)、34(藍(lán)色)、35(洋 紅)、36(青色)、37(白色)
背景色:
40(黑色)、41(紅色)、42(綠色)、 43(黃色)、44(藍(lán)色)、45(洋 紅)、46(青色)、47(白色)
常見開頭格式
:
\033[0m 默認(rèn)字體正常顯示,不高亮
\033[32;0m 紅色字體正常顯示
\033[1;32;40m 顯示方式: 高亮 字體前景色:綠色 背景色:黑色
\033[0;31;46m 顯示方式: 正常 字體前景色:紅色 背景色:青色
舉例說明:
1,
print('\033[1;35;0m字體變色,但無背景色 \033[0m') # 有高亮 或者 print('\033[1;35m字體有色,但無背景色 \033[0m')
print('\033[1;45m 字體不變色,有背景色 \033[0m') # 有高亮
print('\033[1;35;46m 字體有色,且有背景色 \033[0m') # 有高亮
print('\033[0;35;46m 字體有色,且有背景色 \033[0m') # 無高亮
結(jié)果:
2,
print('\033[0;36m床前明月光,')
print('疑是地上霜。')
print('舉頭望明月,')
print('低頭思故鄉(xiāng)。\033[0m')
結(jié)果:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
