久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

架構(gòu)之思-分析那些深入骨髓的設(shè)計(jì)原則

 編程一生 2022-03-09

引子

遵從SOLID五大設(shè)計(jì)原則、遵從三大編程范式……很多的設(shè)計(jì)原則對于像我這樣工作十幾年的人來說,,已經(jīng)刻到了骨髓里。

在平時(shí)工作中,,不自覺的進(jìn)行了熟練的運(yùn)用:看到公司里有個(gè)基礎(chǔ)數(shù)據(jù)這樣的服務(wù),,明知道很難很難也要決心治理掉:“這種服務(wù)不應(yīng)該存在!任何一個(gè)軟件模塊都應(yīng)該只對一個(gè)用戶或系統(tǒng)利益相關(guān)者負(fù)責(zé)(單一職責(zé)原則),。我們的代碼是要長長久久運(yùn)行N個(gè)世紀(jì)的,,不應(yīng)該將領(lǐng)域不清的部分堆到一處!”

有一次跟剛工作幾年的小伙子討論的時(shí)候,,就是《面對編碼分歧怎樣展開討論》里邏輯分析那一段,,我突然意識到自己正面臨著危險(xiǎn):很多原則是在很多年前思考并開始運(yùn)用了,那時(shí)候的批判性思維還很弱,,時(shí)代也在飛速的發(fā)展,,是不是很多金科玉律當(dāng)時(shí)并沒有想明白、或者理解有偏差,、或者應(yīng)該被更新了,。我是否正在逐漸走向經(jīng)驗(yàn)主義?

想到這里,,我決心從頭來梳理分析自己深入骨髓的設(shè)計(jì)原則,。

SOLID原則

先簡單回憶一下SOLID原則的內(nèi)容:

SRP:單一職責(zé)原則,任何一個(gè)軟件模塊應(yīng)該只對某一類行為者負(fù)責(zé),。

OCP:開閉原則,,設(shè)計(jì)良好的軟件應(yīng)該易于擴(kuò)展(對擴(kuò)展開放),同時(shí)抗拒修改(對修改關(guān)閉)。

LSP:里氏替換原則,,盡量使用抽象(如父類),,避免使用具體(如子類),以便于方便的進(jìn)行替換,。

ISP:接口隔離原則,,客戶端不應(yīng)該依賴于它不需要的接口。這里啰嗦兩句,,Bob大叔在自己的巔峰之作《架構(gòu)整潔之道》中詳細(xì)介紹了SOLID原則,,后來設(shè)計(jì)原則逐漸演變?yōu)榱螅喑鰜淼囊粋€(gè)是LOD迪米特法則,,又稱最少知識原則,,我一直找不到六大設(shè)計(jì)原則的出處,知道的朋友還煩請告知,。我個(gè)人觀點(diǎn),,接口隔離原則與迪米特法則異曲同工,所以沒有必要放進(jìn)來,。

DIP:依賴反轉(zhuǎn)原則,,多使用抽象接口,盡量避免使用多變的實(shí)現(xiàn)類,。

《面對編碼分歧怎樣展開討論》里邏輯分析那一段,,我本身之所以認(rèn)為自己是對的,原因是同事的設(shè)計(jì)違反了LSP里氏替換原則和DIP依賴反轉(zhuǎn)原則,,同時(shí)還間接的違反了OCP開閉原則,。

落筆在這個(gè)地方躊躇了很久。我該怎么證明自己這樣是對的還是錯(cuò)的呢,?這個(gè)問題最后還是想起了Bob大叔的觀點(diǎn),,才和自己達(dá)成和解。

Bob大叔說:

科學(xué)和數(shù)學(xué)在證明方法上有著根本性的不同,,科學(xué)理論和科學(xué)定律通常是無法被證明的,,比如我們沒法證明萬有引力的正確性,但我們可以用科學(xué)實(shí)驗(yàn)來演示這些定律的正確性,。而且不管做多少次正確的實(shí)驗(yàn),,也無法排除在今后的某次實(shí)驗(yàn)可能會(huì)推翻萬有引力定律的可能性。 

這就是科學(xué)理論和定律的特點(diǎn):它們可以被偽證,,但是沒有辦法被證明,。如果某個(gè)結(jié)論經(jīng)過一定努力沒有辦法證明是偽證,我們則認(rèn)為它在當(dāng)下是足夠正確的,。

從這里吸取的營養(yǎng)是:我應(yīng)該從本身這么做是否正確出發(fā),。《面對編碼分歧怎樣展開討論》里邏輯分析那一段,實(shí)際上同事已經(jīng)認(rèn)同了他要解決的問題有別的方法去解決,而我的建議有更好的擴(kuò)展性和可維護(hù)性,。

擴(kuò)展性和可維護(hù)性又在軟件領(lǐng)域有多重要的作用呢,?軟件之所以叫軟件,軟本身就有靈活的意思,,如果以后都不太會(huì)變化,,這段邏輯刻在硬件上不是更高效嘛。為了達(dá)到軟件的本來目的,,軟件系統(tǒng)必須足夠軟,,應(yīng)該很容易被修改。

三大編程范式

先來簡單回憶一下三大編程范式:

結(jié)構(gòu)化編程

結(jié)構(gòu)化編程對程序控制權(quán)的直接轉(zhuǎn)移進(jìn)行了限制和規(guī)范,。

對結(jié)構(gòu)化編程的結(jié)構(gòu)舉個(gè)例子,大家就明白了:順序結(jié)構(gòu),、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)?,F(xiàn)在大多數(shù)編程語言都禁止使用goto這樣的無限制跳轉(zhuǎn)語句,因?yàn)樗鼘?huì)損害程序的整體結(jié)構(gòu),。

工作十幾年,,自己從未寫過goto語句。但是見過一些源碼有g(shù)oto語句的,,那時(shí)候才見識了goto的厲害:用它可以跳轉(zhuǎn)到任何代碼位置,,不受限制。它破壞了程序的封裝,,修改一個(gè)類的內(nèi)部結(jié)構(gòu)變的很危險(xiǎn),,增加了耦合性。

不過我們不必?fù)?dān)心自己沒有遵循結(jié)構(gòu)化編程的范式,,只要是按照編程語言推薦的語法都是遵循這一范式的,。

面向?qū)ο缶幊?/span>

面向?qū)ο缶幊虒Τ绦蚩刂茩?quán)的間接轉(zhuǎn)移進(jìn)行了限制和規(guī)范。

面向過程和面向?qū)ο笞畲蟮牟煌谟?,面向?qū)ο笥懈玫目勺x性和重用性,。

記得頭幾年評價(jià)別人代碼寫的不怎么樣會(huì)這樣說:這個(gè)同學(xué)用面向?qū)ο蟮恼Z言寫出了面向過程的程序。

函數(shù)式編程

函數(shù)式編程對程序中的賦值進(jìn)行了限制和規(guī)范,。

面向?qū)ο缶幊淌菍?shù)據(jù)進(jìn)行抽象,,函數(shù)式編程是對行為的抽象。我們來理解一下什么是對行為的抽象,。

下面代碼可以被編譯通過:

new ArrayList<Integer>().stream().forEach(x-> System.out.println(x=x+1));

下面代碼不可以被編譯通過:

int i =0;
new ArrayList<Integer>().stream().forEach(x-> System.out.println(i+=x));

提示說i應(yīng)該是final或者effectively(實(shí)際上) final,。

為什么函數(shù)式編程要求用到的變量i為不可變的?但是沒有要求x是不可變呢,?

區(qū)別是x是函數(shù)的參數(shù)也就是輸入,,i是函數(shù)外變量。而函數(shù)式編程是對行為抽象,就是說對輸入進(jìn)行了一系列的處理行為,,得到一個(gè)輸出,;不能對其他數(shù)據(jù)進(jìn)行操作,對其他數(shù)據(jù)操作是面向編程做的事情,。

舉個(gè)生活中的例子:

記得高中的時(shí)候特別喜歡陸游那首<卜算子.詠梅>

驛外斷橋邊,,寂寞開無主。

已是黃昏獨(dú)自愁,,更著風(fēng)和雨,。 

無意苦爭春,一任群芳妒,。

零落成泥碾作塵,,只有香如故。

這首古文描述了對梅花的加工行為,。這個(gè)行為抽象為函數(shù)是這個(gè)樣子的:

function 梅花變香泥(一枝梅{    第一步:孤立它    第二步:讓它經(jīng)歷黑暗    第三步:讓它經(jīng)歷風(fēng)雨    第四步:讓其他花兒妒忌它    第五步:讓它凋落到泥里化為塵土只保留香氣}

這里“梅花變香泥”行為被抽象,,對調(diào)用者來說只要調(diào)用了這個(gè)函數(shù),就是調(diào)用了那5步驟的行為,。這里僅能對一枝梅處理,,一枝紅杏出墻來到這里,她只能對這枝梅產(chǎn)生改變,,她可以嫉妒這枝梅冬天開放,。“梅花已謝杏花新”,,讓梅花零落成泥后讓杏花開放,,這就不是這個(gè)函數(shù)該做的事了。

面向?qū)ο缶幊炭梢宰鲞@件事情,,它是對數(shù)據(jù)的抽象:

暖氣潛催次第春,,梅花已謝杏花新。

暖氣對象 暖氣;春對象 春;梅花對象 梅花;杏花對象 杏花;public 春對象 描述春天() {    梅花.狀態(tài)=謝了;    杏花.狀態(tài)=開了;    春.空氣狀態(tài)=暖氣;    春.梅花狀態(tài)=謝了;    春.杏花狀態(tài)=開了;    return 春;}

我有對結(jié)構(gòu)化編程沒有什么疑問,,畢竟50年前有人就用數(shù)學(xué)方法證明了順序結(jié)構(gòu),、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的正確性。

但是作為一直以java語言作為主要開發(fā)語言的我,,java是面向?qū)ο蟮倪@句話一直在腦子里和引入函數(shù)式做斗爭,。

函數(shù)式編程確實(shí)有很多優(yōu)勢:因?yàn)楹瘮?shù)式編程的引入變量都是不可變的,虛擬機(jī)實(shí)現(xiàn)時(shí)可以去掉很多多余的鎖,,并發(fā)處理更快,;代碼簡潔;內(nèi)聚性更好……
我仔細(xì)想了一下,,對諸如java這種面向?qū)ο蟮木幊陶Z言來說,,函數(shù)式編程和面向接口編程一樣,,是局部實(shí)現(xiàn)的技巧,整體結(jié)構(gòu)還是面向?qū)ο蟮摹?br>

后記

在上篇《架構(gòu)師之路-redis集群解析》最后我說到如果在看超過10,,我就寫篇架構(gòu)師三大難的文章,,只可惜周六發(fā)文一向閱讀量不高,雖然“在看率”較平時(shí)已經(jīng)提高很多了,,目前還沒達(dá)到,。但是“在看率”上來了,可以感受到大家的支持,,讓我充滿力量,。女孩子嘛,比較感性,,決定本周加更這篇,,表達(dá)一下自己的感恩~~

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多