[5+1]開閉原則(一)

[5+1]開閉原則(一)

前言

面向?qū)ο蟮腟OLID設(shè)計(jì)原則,外加一個(gè)迪米特法則,就是我們常說(shuō)的5+1設(shè)計(jì)原則。

↑ 五個(gè),再加一個(gè)稽揭,就是5+1個(gè)。哈哈哈英古。

這六個(gè)設(shè)計(jì)原則的位置有點(diǎn)不上不下淀衣。論原則性和理論指導(dǎo)意義,它們不如封裝繼承抽象或者高內(nèi)聚低耦合召调,所以在寫代碼或者code review的時(shí)候膨桥,它們很難成為“應(yīng)該這樣做”或者“不應(yīng)該這樣做”的一個(gè)有說(shuō)服力的理由。論靈活性和實(shí)踐操作指南唠叛,它們又不如設(shè)計(jì)模式或者架構(gòu)模式只嚣,所以即使你能說(shuō)出來(lái)某段代碼違反了某項(xiàng)原則,常常也很難明確指出錯(cuò)在哪兒艺沼、要怎么改册舞。

所以,這里來(lái)討論討論這六條設(shè)計(jì)原則的“為什么”和“怎么做”障般。順帶调鲸,作為面向?qū)ο笤O(shè)計(jì)思想的一環(huán),這里也想聊聊它們與抽象挽荡、高內(nèi)聚低耦合藐石、封裝繼承多態(tài)之間的關(guān)系。

=================================
↑前言↑
↓正文↓
=================================

開閉原則(Open-Closed Principle)

開閉原則指的是“對(duì)擴(kuò)展開放定拟、對(duì)修改關(guān)閉”于微。

“Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.”

—— Object-Oriented Software Construction, Robert C. Martin

↑ 和門一樣:開的意思是“請(qǐng)這邊走”,關(guān)的意思是“此路不通”

什么是擴(kuò)展青自?就Java而言株依,實(shí)現(xiàn)接口(implements SomeInterface)、繼承父類(extends SuperClass)延窜,甚至重載方法(Overload)恋腕,都可以稱作是“擴(kuò)展”。

什么是修改逆瑞?在Java中吗坚,嚴(yán)格來(lái)說(shuō)祈远,凡是會(huì)導(dǎo)致一個(gè)類重新編譯、生成不同的class文件的操作商源,都是對(duì)這個(gè)類做的修改。

實(shí)踐中我們會(huì)放寬一點(diǎn)谋减,只有改變了業(yè)務(wù)邏輯的修改牡彻,才會(huì)歸入開閉原則所說(shuō)的“修改”之中。

例如出爹,把一個(gè)很大的方法拆分成三個(gè)小方法庄吼,但方法的調(diào)用流程、業(yè)務(wù)功能等都沒(méi)有變严就。這個(gè)操作當(dāng)然會(huì)導(dǎo)致類重新編譯总寻,但還算可以接受,不必對(duì)它亮紅燈梢为。但如果在某個(gè)方法中加一個(gè)if-else渐行,只在某種情況下沿用原有邏輯、其它情況下使用新的功能铸董,這時(shí)祟印,我們就應(yīng)該像甘道夫那樣,揮舞起“開閉原則”之劍粟害,高呼“You shall not pass”了蕴忆。

You shall not pass

=================================
↑開閉原則:是什么↑
↓開閉原則:為什么↓
=================================

為什么

有那么一段時(shí)間,我?guī)缀醭商旄覀兝洗蟊г埂?br> “這個(gè)if-else的條件重復(fù)出現(xiàn)了至少五次了悲幅,為什么不重構(gòu)一下疤锥臁?”
“這個(gè)同步請(qǐng)求的處理時(shí)間太長(zhǎng)了汰具,可以改用異步輪詢來(lái)處理吧卓鹿?”
“這個(gè)表的讀寫比這么高,考慮下給它加個(gè)緩存吧郁副〖跷”
……諸如此類。

而我老大呢存谎,一般都是這樣答復(fù)的:
“你有時(shí)間就去改一改吧拔疚。不過(guò)要注意,不要影響業(yè)務(wù)功能既荚≈墒В”

于是我就一直沒(méi)有改。

一方面恰聘,我一直沒(méi)有時(shí)間句各。業(yè)務(wù)需求一個(gè)接一個(gè)吸占,每次都要傷筋動(dòng)骨地改一大堆代碼。而且凿宾,我們經(jīng)常遇到改著改著發(fā)現(xiàn)產(chǎn)品漏提了一項(xiàng)需求矾屯、測(cè)著測(cè)著發(fā)現(xiàn)開發(fā)漏改了一處代碼這樣的問(wèn)題,開發(fā)簡(jiǎn)直一刻不得閑初厚,哪兒騰得出手來(lái)做技術(shù)上的重構(gòu)優(yōu)化件蚕?更何況,重構(gòu)優(yōu)化完了之后产禾,測(cè)試組還要進(jìn)行回歸驗(yàn)證排作。即使開發(fā)能改得過(guò)來(lái),測(cè)試也測(cè)不過(guò)來(lái)亚情。

另一方面妄痪,只要修改了代碼,誰(shuí)敢保證不影響業(yè)務(wù)功能呢楞件?我曾經(jīng)遇到過(guò)在某處加一行代碼衫生、結(jié)果在一百多行外引發(fā)bug的情況;也遇到過(guò)開發(fā)的單元測(cè)試和QA的回歸測(cè)試都安然無(wú)恙履因、偏偏在線上環(huán)境爆出bug的情況障簿。誰(shuí)能保證重構(gòu)優(yōu)化后的代碼能夠在重重考驗(yàn)下全身而退呢?

↑ 求而不得栅迄,真的很無(wú)奈站故。

開閉原則可以緩解第一個(gè)問(wèn)題。遵循了開閉原則的話毅舆,開發(fā)和測(cè)試都只需要專注于新的代碼西篓、新的功能,而不用操心修改老代碼對(duì)老邏輯會(huì)有什么樣的影響憋活。因而岂津,大家可以用較少的時(shí)間來(lái)完成業(yè)務(wù)需求,從而騰出工夫來(lái)做重構(gòu)優(yōu)化悦即。

但是吮成,開閉原則只能幫助開發(fā)環(huán)節(jié)、以及下游的測(cè)試環(huán)節(jié)做一些改進(jìn)辜梳。要真正解決產(chǎn)品需求絡(luò)繹不絕粱甫、每個(gè)需求都要傷筋動(dòng)骨、產(chǎn)品和開發(fā)顧此失彼等問(wèn)題作瞄,需要產(chǎn)品茶宵、開發(fā)、測(cè)試甚至運(yùn)維等環(huán)節(jié)全線聯(lián)動(dòng)宗挥,用一套完整方案理順整個(gè)產(chǎn)品上線流程乌庶。不過(guò)這里只聊開閉种蝶,這個(gè)問(wèn)題暫且按下不表。

雖然只能緩解第一個(gè)問(wèn)題瞒大,但開閉原則可以很好地解決第二個(gè)問(wèn)題螃征。

既然修改代碼會(huì)影響業(yè)務(wù)功能,那就不修改現(xiàn)有代碼糠赦。連一行代碼都沒(méi)修改会傲,現(xiàn)有功能總不會(huì)變了吧?這就是開閉原則中的“對(duì)修改關(guān)閉”的意義拙泽。

↑ 我都沒(méi)改代碼你就出bug了?

然后裸燎,通過(guò)實(shí)現(xiàn)接口顾瞻、繼承父類等方式,為系統(tǒng)引入新的功能德绿。這就是開閉原則中“對(duì)擴(kuò)展開放”的意義荷荤。

在單元測(cè)試、回歸測(cè)試和金絲雀測(cè)試都通過(guò)之后移稳,祖?zhèn)鞯睦洗a就可以“壽終正寢”蕴纳,系統(tǒng)也就正式而平滑地過(guò)渡到重構(gòu)優(yōu)化后的代碼上來(lái)了。


借助開閉原則个粱,我們用設(shè)計(jì)模式重構(gòu)了無(wú)數(shù)個(gè)if-else古毛,用消息隊(duì)列、異步回調(diào)和異步輪詢改寫了無(wú)數(shù)個(gè)同步請(qǐng)求都许,用緩存替代了無(wú)數(shù)次數(shù)據(jù)庫(kù)查詢……我們甚至用這種方法稻薇,把一套老系統(tǒng)代碼平滑地合并到了新的系統(tǒng)內(nèi),并逐步地用新代碼和新配置替代老系統(tǒng)的代碼和配置胶征。當(dāng)老系統(tǒng)的代碼和配置都不再被使用時(shí)塞椎,它就徹底地退出歷史舞臺(tái)了。

平滑過(guò)渡的一套老系統(tǒng)

當(dāng)然睛低,不光是重構(gòu)優(yōu)化案狠,在開發(fā)新需求時(shí),開閉原則也有很大的幫助钱雷。究其根本骂铁,是“對(duì)擴(kuò)展開放、對(duì)修改關(guān)閉”的做法能夠使我們的系統(tǒng)兼具擴(kuò)展性和穩(wěn)定性急波。擴(kuò)展性能幫助系統(tǒng)輕松地吸納新技術(shù)从铲、實(shí)現(xiàn)新需求;而穩(wěn)定性則能夠降低系統(tǒng)中的新技術(shù)澄暮、新需求在業(yè)務(wù)功能名段、架構(gòu)設(shè)計(jì)阱扬、核心代碼等方面的影響,從而減少系統(tǒng)bug伸辟、需求范圍和開發(fā)工作量麻惶。

“求木之長(zhǎng)者,必固其根本信夫;欲流之遠(yuǎn)者窃蹋,必浚其泉源”。無(wú)論是做業(yè)務(wù)需求静稻,還是做重構(gòu)優(yōu)化警没,“開閉原則”都是我們把系統(tǒng)做成、做完振湾、做好的“根本”和“泉源”杀迹。

=================================
↑開閉原則:為什么↑
↓開閉原則:怎么做↓
=================================

怎么做

要把開閉原則運(yùn)用到開發(fā)實(shí)踐中,跟所謂的工作閉環(huán)“計(jì)劃-實(shí)施-檢查-處理”非常相似押搪。

首先树酪,我們要做出“開閉計(jì)劃”,也就是判斷你的代碼中大州,哪些地方會(huì)發(fā)生變化续语、會(huì)發(fā)生什么樣的變化。然后厦画,根據(jù)這個(gè)“開閉計(jì)劃”疮茄,把不會(huì)改變的代碼嚴(yán)密地封裝起來(lái);并根據(jù)可能發(fā)生的變化苛白、以及發(fā)生變化的方式娃豹,在代碼中預(yù)留好擴(kuò)展點(diǎn)。接著购裙,合理地運(yùn)用預(yù)留的擴(kuò)展點(diǎn)來(lái)實(shí)現(xiàn)業(yè)務(wù)需求或者重構(gòu)優(yōu)化懂版。最后,必要時(shí)躏率,根據(jù)實(shí)際情況去調(diào)整當(dāng)初設(shè)計(jì)的擴(kuò)展點(diǎn)躯畴。

↑ “工作閉環(huán)”在很多場(chǎng)合都能用得上。

開閉計(jì)劃

在開閉原則的“閉環(huán)”中薇芝,“計(jì)劃”是這四個(gè)步驟中最困難蓬抄、但也是最重要的一步。

說(shuō)它困難夯到,是因?yàn)槌恕拔磥?lái)一定會(huì)不一樣”這一點(diǎn)之外嚷缭,誰(shuí)都不知道未來(lái)會(huì)怎樣。也許下個(gè)月這個(gè)系統(tǒng)就要重做了;也許下半年這項(xiàng)業(yè)務(wù)就要下線了阅爽;也許明年就要封路封城路幸、在家隔離了;也許我們現(xiàn)在認(rèn)為不會(huì)改的代碼付翁,明天就被改得面目全非了简肴;也許當(dāng)改變真的降臨時(shí),我們現(xiàn)在預(yù)留的擴(kuò)展點(diǎn)完全是在幫倒忙……

說(shuō)它重要百侧,是因?yàn)槿绻麑?duì)未來(lái)毫無(wú)規(guī)劃砰识,我們只能走一步算一步,走到哪算哪兒佣渴。而在這種情況下辫狼,絕大部分時(shí)候,我們所做的每一件事都是在為未來(lái)挖坑辛润,都是在增加自己的“技術(shù)債”予借。接口方法返回值類型聲明為L(zhǎng)ong,數(shù)據(jù)庫(kù)表中引入一個(gè)傳遞依賴频蛔,在邏輯相似的兩個(gè)類之間大段地copy代碼……當(dāng)新的需求要求修改這部分代碼時(shí),我們除了“待從頭秦叛,收拾舊山河”晦溪,似乎也沒(méi)有什么更好的辦法。

這就好像螃蟹這類的甲殼動(dòng)物一樣挣跋,眼前這身甲殼雖然合身三圆,但是當(dāng)身體逐漸長(zhǎng)大,原本“合身”的甲殼逐漸變成了牢籠避咆,最后只能把它脫掉舟肉、再長(zhǎng)一幅新的來(lái)用。

↑ 甲殼動(dòng)物蛻殼容易查库;業(yè)務(wù)系統(tǒng)重構(gòu)是真難路媚。

因?yàn)樽觥伴_閉計(jì)劃”會(huì)很困難,所以敏捷開發(fā)模式提出了“簡(jiǎn)單設(shè)計(jì)”的口號(hào)樊销;在互聯(lián)網(wǎng)開發(fā)中也有“快速試錯(cuò)”的傳統(tǒng)整慎。但是簡(jiǎn)單設(shè)計(jì)不等于沒(méi)有設(shè)計(jì)。它提倡的是不對(duì)未來(lái)做過(guò)多預(yù)測(cè)围苫、也不根據(jù)這些預(yù)測(cè)做過(guò)多設(shè)計(jì)裤园。快速試錯(cuò)也不是技術(shù)上的決策剂府。它指的是找不準(zhǔn)市場(chǎng)方向時(shí)拧揽,對(duì)業(yè)務(wù)進(jìn)行快速迭代、用市場(chǎng)反應(yīng)來(lái)為業(yè)務(wù)指路。

而且淤袜,即使是簡(jiǎn)單設(shè)計(jì)和快速試錯(cuò)痒谴,也要求我們的系統(tǒng)遵循開閉原則。否則饮怯,每次需求都要拆墻砸柱重做水電闰歪,敏捷項(xiàng)目怎么能敏捷得起來(lái)?快速試錯(cuò)又怎么能快速起來(lái)蓖墅?這也是其重要性的一種體現(xiàn)库倘。


那么,“開閉計(jì)劃”到底要怎么做呢论矾?

“未來(lái)的種子深埋在過(guò)去當(dāng)中”教翩。雖然無(wú)法預(yù)見(jiàn)未來(lái),但我們可以總結(jié)過(guò)去贪壳。無(wú)論是業(yè)務(wù)還是系統(tǒng)饱亿,我們總能從它們過(guò)去的發(fā)展軌跡中找到一點(diǎn)變化的模式。通過(guò)對(duì)這些模式進(jìn)行分析和總結(jié)闰靴,我們就能夠把未來(lái)大部分的可能性握在手中了彪笼。

但是,如果業(yè)務(wù)和系統(tǒng)都剛剛起步蚂且,還沒(méi)有可用于分析總結(jié)的過(guò)去配猫,我們要怎么辦呢?“太陽(yáng)底下沒(méi)有新鮮事”杏死,我們的業(yè)務(wù)和前人的業(yè)務(wù)泵肄、我們的系統(tǒng)和前人的系統(tǒng),多多少少都有相似之處淑翼。而前人已經(jīng)對(duì)這些業(yè)務(wù)和系統(tǒng)做過(guò)很多分析和總結(jié)了——比如這里說(shuō)的設(shè)計(jì)原則腐巢,比如以后要分享的設(shè)計(jì)模式⌒ǎ“它山之石可以攻玉”冯丙,我們把這些成果“拿來(lái)主義”,當(dāng)遇到前人經(jīng)歷過(guò)的變化時(shí)惠豺,就可以輕松應(yīng)對(duì)了银还。

但是,如果對(duì)設(shè)計(jì)模式不熟悉洁墙,或者碰到了哪種設(shè)計(jì)模式都不適用的極端情況蛹疯,那又該怎么辦呢?


如果真的遇到了這種情況热监,那么可以考慮考慮下面這些建議捺弦。

第一,面向接口編程。接口的“開閉”性是不言自明的列吼。雖然具體的實(shí)現(xiàn)類也可以“對(duì)擴(kuò)展開放幽崩、對(duì)修改關(guān)閉”,但是相比接口寞钥,還是要略遜一籌慌申。

第二,不要用基本數(shù)據(jù)類型做接口方法的入?yún)⒑头祷刂道碇!_@一點(diǎn)相信是眾所周知的蹄溉,不多啰嗦。

第三您炉,在實(shí)現(xiàn)接口時(shí)柒爵,區(qū)分處理“數(shù)據(jù)結(jié)構(gòu)”和“算法”。

↑ 程序=數(shù)據(jù)結(jié)構(gòu)+算法

在設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí)赚爵,我們應(yīng)該忠于現(xiàn)實(shí):數(shù)據(jù)結(jié)構(gòu)在現(xiàn)實(shí)中是怎樣的棉胀,那么在代碼中就應(yīng)該是怎樣的。現(xiàn)實(shí)中是正整數(shù)冀膝,代碼中就應(yīng)該是Integer或Long唁奢,而不應(yīng)該是String;現(xiàn)實(shí)中是日期窝剖,代碼中就應(yīng)該是Date或LocalDateTime驮瞧,而不應(yīng)該是String;現(xiàn)實(shí)中是1:1的關(guān)系枯芬,代碼中就應(yīng)該是1:1的關(guān)系;現(xiàn)實(shí)中是1:N:M的關(guān)系采郎,代碼中就應(yīng)該是1:N:M的關(guān)系千所。

數(shù)據(jù)是信息的載體。它承載信息的方式不僅僅是數(shù)據(jù)的取值蒜埋,還包括數(shù)據(jù)的類型和數(shù)據(jù)之間的關(guān)系淫痰。當(dāng)看到整數(shù)類型的“有效期”時(shí),我們會(huì)很自然地認(rèn)為它是“從某個(gè)日期開始的有效期天數(shù)”整份;而在看到日期類型的“有效期”時(shí)待错,我們又會(huì)很自然地把它理解為“有效期截止日”。這就是數(shù)據(jù)類型所承載的信息烈评。當(dāng)銀行卡與用戶之間是1:1的關(guān)系時(shí)火俄,說(shuō)明多筆借款申請(qǐng)可以共用一張銀行卡,那么用戶只需綁定一次即可讲冠;但若銀行卡與借款申請(qǐng)之間的關(guān)系是1:1瓜客,說(shuō)明借款申請(qǐng)之間不能復(fù)用銀行卡數(shù)據(jù),則用戶每次申請(qǐng)借款時(shí),都需要重新綁定一次銀行卡谱仪。這就是數(shù)據(jù)關(guān)系所承載的信息玻熙。

如果我們?cè)谙到y(tǒng)設(shè)計(jì)時(shí),不使用實(shí)際的數(shù)據(jù)結(jié)構(gòu)疯攒、而是定義某種特殊的數(shù)據(jù)結(jié)構(gòu)嗦随,那就意味著我們將某種特殊的信息隱式地固定在了這種設(shè)計(jì)中。而這種信息勢(shì)必會(huì)對(duì)后續(xù)擴(kuò)展帶來(lái)一定的約束敬尺。如果后續(xù)擴(kuò)展時(shí)的數(shù)據(jù)結(jié)構(gòu)與這種約束相抵牾枚尼,那么光是如何處理歷史數(shù)據(jù)的問(wèn)題就足夠大家喝一壺了。

這種“隱藏的筷转、特殊的信息”姑原,比較常見(jiàn)于傳遞依賴中。例如呜舒,用戶锭汛、賬號(hào)、銀行卡之間實(shí)際的數(shù)據(jù)關(guān)系是1:1:N袭蝗。但為了查詢方便唤殴,我們庫(kù)表中只存了用戶id和銀行卡號(hào)。這時(shí)到腥,表中就出現(xiàn)了“傳遞依賴”朵逝。當(dāng)某一天,用戶和賬號(hào)之間的數(shù)據(jù)關(guān)系擴(kuò)展為1:N的時(shí)候乡范,只存了用戶id和銀行卡號(hào)的表就遇上麻煩了配名。這也是為什么在數(shù)據(jù)表設(shè)計(jì)時(shí),我們要遵循第三范式的原因之一:傳遞依賴把一部分信息變成了某種隱藏的晋辆、固定的數(shù)據(jù)約束渠脉。這種約束不僅是對(duì)當(dāng)前數(shù)據(jù)的約束,也是對(duì)未來(lái)擴(kuò)展的約束瓶佳。

忠于現(xiàn)實(shí)的數(shù)據(jù)結(jié)構(gòu)也有可能遇到這種問(wèn)題芋膘。但是相對(duì)來(lái)說(shuō),概率要小得多霸饲。因?yàn)樵谶@種情況下为朋,數(shù)據(jù)所承載的信息和約束都會(huì)直接體現(xiàn)在數(shù)據(jù)上,因而會(huì)更加直白厚脉、靈活习寸。這就像裝修時(shí)水電都走明線一樣,雖然不如走暗線那么“優(yōu)雅”傻工,但是當(dāng)需要改水改電時(shí)融涣,明線的優(yōu)勢(shì)就一目了然了童番。


說(shuō)完數(shù)據(jù)結(jié)構(gòu),我們說(shuō)說(shuō)算法威鹿。對(duì)業(yè)務(wù)系統(tǒng)來(lái)說(shuō)剃斧,“算法”實(shí)際就是業(yè)務(wù)功能在系統(tǒng)中的流程邏輯。與設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí)應(yīng)該忠于現(xiàn)實(shí)的做法相反忽你,設(shè)計(jì)系統(tǒng)流程時(shí)恰恰不能照抄業(yè)務(wù)流程圖幼东。業(yè)務(wù)流程圖僅僅是根據(jù)當(dāng)前的業(yè)務(wù)流程來(lái)制作的。如果系統(tǒng)流程直接照抄業(yè)務(wù)流程科雳,那就意味著這個(gè)系統(tǒng)徹底失去了對(duì)未來(lái)的擴(kuò)展性根蟹、以及做出擴(kuò)展的自主性。

例如糟秘,下圖是我們某個(gè)系統(tǒng)中“用戶注銷需求”的兩份簡(jiǎn)要流程設(shè)計(jì)简逮。圖中左側(cè)的是業(yè)務(wù)流程,而右側(cè)是系統(tǒng)流程尿赚。對(duì)比之下散庶,我們可以發(fā)現(xiàn):如果按業(yè)務(wù)流程來(lái)開發(fā),那么凌净,每當(dāng)需要?jiǎng)h除信息的表發(fā)生變更時(shí)——加一張表悲龟、少一張表、改一個(gè)查詢條件等冰寻,我們就要修改一次代碼须教;而按系統(tǒng)流程來(lái)開發(fā)的話,大多數(shù)情況下斩芭,這些變更都只需要修改配置即可轻腺。顯然,后者更加的“開閉”划乖,對(duì)開發(fā)和測(cè)試也更加的友好约计。

↑ 業(yè)務(wù)流程和系統(tǒng)流程的區(qū)別

不照抄的話,要怎么辦呢迁筛?我在左耳朵耗子的一篇文章中看到過(guò)這樣的觀點(diǎn):把業(yè)務(wù)流程拆分為“控制單元”和“處理單元”兩類邏輯。這是設(shè)計(jì)算法時(shí)的一種思路耕挨。放在“開閉計(jì)劃”的視角下细卧,“控制單元”是易變的、需要預(yù)留擴(kuò)展點(diǎn)的筒占;而“處理單元”是不那么容易變的贪庙、可以封裝為“黑盒”的。這樣翰苫,在做業(yè)務(wù)需求或重構(gòu)優(yōu)化時(shí)止邮,不用修改已有的處理單元这橙、而是通過(guò)擴(kuò)展控制單元來(lái)引入新的處理單元,也就很好地遵守了“開閉原則”导披。

↑ 業(yè)務(wù)流程=控制+處理

除了按“控制+處理=系統(tǒng)流程”這種思路來(lái)設(shè)計(jì)之外屈扎,在單一職責(zé)原則一文中提到的“邏輯簡(jiǎn)單、結(jié)構(gòu)復(fù)雜”也是一種符合開閉原則的設(shè)計(jì)思路撩匕。這種思路在前文中已經(jīng)介紹過(guò)鹰晨,這里就不贅述了。

把“邏輯復(fù)雜度”轉(zhuǎn)變?yōu)椤敖Y(jié)構(gòu)復(fù)雜度”止毕,就是降低邏輯單元內(nèi)的邏輯復(fù)雜度模蜡、提高邏輯單元間的結(jié)構(gòu)復(fù)雜度”饬荩或者簡(jiǎn)單來(lái)說(shuō)忍疾,就是把系統(tǒng)由“復(fù)雜邏輯、簡(jiǎn)單結(jié)構(gòu)”轉(zhuǎn)變成“簡(jiǎn)單邏輯谨朝、復(fù)雜結(jié)構(gòu)”卤妒。除了優(yōu)化算法之外,重構(gòu)函數(shù)叠必、系統(tǒng)分層荚孵、拆分服務(wù)等方式,本質(zhì)上都是在按這種思路來(lái)應(yīng)對(duì)系統(tǒng)復(fù)雜度纬朝。

花園的景昕收叶,公眾號(hào):景昕的花園[5+1]單一職責(zé)原則

=================================
↑正文↑
↓往期索引↓
=================================

往期索引

面向?qū)ο蟾攀?/h3>

《面向?qū)ο笫鞘裁础?/a>

從具體的語(yǔ)言和實(shí)現(xiàn)中抽離出來(lái),面向?qū)ο笏枷刖烤故鞘裁垂部粒抗娞?hào):景昕的花園面向?qū)ο笫鞘裁?/a>

抽象

抽象這個(gè)東西判没,說(shuō)起來(lái)很抽象,其實(shí)很簡(jiǎn)單隅茎。

花園的景昕澄峰,公眾號(hào):景昕的花園抽象

高內(nèi)聚與低耦合

高內(nèi)聚與低耦合

細(xì)說(shuō)幾種內(nèi)聚

細(xì)說(shuō)幾種耦合

"高內(nèi)聚"與"低耦合"是軟件設(shè)計(jì)和開發(fā)中經(jīng)常出現(xiàn)的一對(duì)概念。它們既是做好設(shè)計(jì)的途徑辟犀,也是評(píng)價(jià)設(shè)計(jì)好壞的標(biāo)準(zhǔn)俏竞。

花園的景昕,公眾號(hào):景昕的花園高內(nèi)聚與低耦合

封裝繼承多態(tài)

封裝

繼承

多態(tài)》

——“面向?qū)ο蟮娜筇匦允鞘裁刺镁梗俊薄胺庋b魂毁、繼承、多態(tài)出嘹∠”

[5+1]SOLID設(shè)計(jì)原則+迪米特法則

[5+1]單一職責(zé)原則

單一職責(zé)原則非常好理解:一個(gè)類應(yīng)當(dāng)只承擔(dān)一種職責(zé)。因?yàn)橹怀袚?dān)一種職責(zé)税稼,所以烦秩,一個(gè)類應(yīng)該只有一個(gè)發(fā)生變化的原因垮斯。花園的景昕只祠,公眾號(hào):景昕的花園[5+1]單一職責(zé)原則

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兜蠕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子铆农,更是在濱河造成了極大的恐慌牺氨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墩剖,死亡現(xiàn)場(chǎng)離奇詭異猴凹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)岭皂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門郊霎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人爷绘,你說(shuō)我怎么就攤上這事书劝。” “怎么了土至?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵购对,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我陶因,道長(zhǎng)骡苞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任楷扬,我火速辦了婚禮解幽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烘苹。我一直安慰自己躲株,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布镣衡。 她就那樣靜靜地躺著霜定,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廊鸥。 梳的紋絲不亂的頭發(fā)上望浩,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音黍图,去河邊找鬼。 笑死奴烙,一個(gè)胖子當(dāng)著我的面吹牛助被,可吹牛的內(nèi)容都是我干的剖张。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼揩环,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搔弄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起丰滑,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤顾犹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后褒墨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炫刷,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年郁妈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浑玛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡噩咪,死狀恐怖顾彰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胃碾,我是刑警寧澤涨享,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站仆百,受9級(jí)特大地震影響厕隧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜儒旬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一栏账、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栈源,春花似錦挡爵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至艰亮,卻和暖如春闭翩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迄埃。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工疗韵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侄非。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓蕉汪,卻偏偏與公主長(zhǎng)得像流译,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子者疤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345