自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

洞察設(shè)計模式的底層邏輯

開發(fā) 開發(fā)工具
設(shè)計模式是開發(fā)同學(xué)經(jīng)常聊到的話題,也經(jīng)常被用到實際的開發(fā)項目中,熟練的人可以做到信手拈來,不熟悉的人陷入苦思冥想中。

設(shè)計模式是開發(fā)同學(xué)經(jīng)常聊到的話題,也經(jīng)常被用到實際的開發(fā)項目中,熟練的人可以做到信手拈來,不熟悉的人陷入苦思冥想中。筆者認(rèn)為,不僅僅要掌握設(shè)計模式的用法,更要洞察設(shè)計模式的底層邏輯,只有那樣,才能做到遇到實際的問題可以使用合適的設(shè)計模式去解決。

一 你應(yīng)該關(guān)注底層邏輯

1 設(shè)計模式的段子

段子一:你讓他給你講設(shè)計模式,他給你講故事,聽完后,又蹦又跳,樂壞了;看原著設(shè)計模式和實際寫代碼時,又是又蹦又跳,那是瘋了。

段子二:你讓他給你講設(shè)計模式,他給你講架構(gòu);你和他講架構(gòu),他和你講建筑學(xué);你和他講建筑學(xué),他和你講哲學(xué)……

上面兩個典型的段子,可以看到大家平時學(xué)習(xí)設(shè)計模式的無奈,故事聽懂了,但依然沒有掌握設(shè)計模式,甚至設(shè)計模式的類圖大家也畫得出,卻還是不能靈活掌握設(shè)計模式。究其根本的原因是沒有掌握設(shè)計模式的內(nèi)核思想,只是知道設(shè)計模式的外在形式,相當(dāng)于只學(xué)到了“招式”,沒有學(xué)到“內(nèi)功”。

2 底層邏輯的本質(zhì)

很多事物都有底層邏輯,當(dāng)掌握了事物的底層邏輯之后,很多事就好辦了,如果你已經(jīng)洞察到了最核心的規(guī)律,在實際工作中就只需要按照規(guī)律去執(zhí)行就可以。例如,我們看到很多營銷文案讓人眼前一亮、嘆為觀止,如果要讓我們?nèi)戇@些營銷文案,一開始還找不到門道,寫出來的標(biāo)題平平淡淡,不夠吸引人。那營銷文案背后的底層邏輯是什么呢?我們看到很多文案如“激發(fā)學(xué)習(xí)潛能的四大策略”、“如何在10天內(nèi)記憶5000+單詞”、“一文提示為什么你比別人差”……這些文案有的使用陳述手法,有的使用疑問手法,有的使用對比手法,有的使用感嘆手法……再往下挖掘,不管使用哪種手法,本質(zhì)來講是命中了人的爽點或痛點,再用這個底層邏輯去看各種文案,有的命中你的痛點,比如你想記憶更多的單詞,現(xiàn)實記不住單詞;比如你想成功,但努力了很久還沒有效果……有的命中你的爽點:你花更少的錢就能獲得更好的服務(wù);你不用出門就能賺到錢……當(dāng)你洞察到了營銷文案背后的底層邏輯,你現(xiàn)在也可以寫出吸引眼球的文案,這就是底層邏輯的力量!

我們學(xué)習(xí)23種設(shè)計模式,它們被劃分成創(chuàng)建型設(shè)計模式、結(jié)構(gòu)型設(shè)計模式、行為型設(shè)計模式,這就像營銷文案的寫作手法一樣,那么設(shè)計模式的底層邏輯到底是什么呢?

??

??

二 設(shè)計模式的底層邏輯

1 設(shè)計模式的基石

平時我們在寫代碼的時候,經(jīng)常見到如下三種類型的代碼:面條型的代碼、過程式的代碼和面向?qū)ο蟮拇a,這里以一個例子來說明這三種類型的編碼特點。

  • 面條型代碼就是所有邏輯堆砌在一起,就像寫一篇文章,不怎么分段落。比如古代雕刻文字,在一塊木板上雕刻一首詩,如果詩人要把其中的一個修改下,那得重新雕刻這首詩。非常容易發(fā)現(xiàn)這種模式的缺點:耦合太嚴(yán)重,牽一發(fā)而動全身。
  • 過程式代碼在面條型代碼基礎(chǔ)上有了很大的進(jìn)步,它遵循“自頂向下,逐步求精”的思想,把一個大問題劃分成若干個小問題,分而治之。對應(yīng)上面雕刻詩的例子,詩是由若干個行組成的,如果每塊木板上只雕刻一行詩,萬一要改某個字,只用重新雕刻那一行就行,不用重新雕刻整首詩。但如果要修改多個字,而且在不同的行時,這種極端情況下整個首詩又得重新雕刻了。
  • 面向?qū)ο蟠a換了一種思考方式,詩是由行組成的,行又是由一個個字組成的,這也即是活字印刷的思想,這些字還可以復(fù)用于其它不同的詩,復(fù)用性非常強(qiáng)。

從上面的例子可以看到,核心還是洞察到事物的結(jié)構(gòu)和關(guān)系,首先回答的是what,而不是how。過程式就是過分強(qiáng)調(diào)了how,一開始就思考怎么去做,過程式思維是以自己為中心,導(dǎo)演了整個功能流程,自己承擔(dān)了太多自己不應(yīng)該承擔(dān)的職責(zé),整個設(shè)計就顯得不靈活。面向?qū)ο笫菑膶ο蟮慕嵌热タ磫栴},解決問題是由各個對象協(xié)作完成,設(shè)計模式的基石就是面向?qū)ο?,脫離了面向?qū)ο笕フ勗O(shè)計模式那是耍流氓。

2 設(shè)計模式的鼻祖

設(shè)計模式有一本經(jīng)典的書籍:《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》,在書中作者提到了一句話:“找到變化,封裝變化”,這才是設(shè)計模式的底層邏輯。很多人忽視了這句話,反而去追尋各種模式的招式,遇到實際的問題又找不到合適的設(shè)計模式去解決了?!罢业阶兓?,封裝變化”非常精練地提示了設(shè)計模式的本質(zhì),細(xì)細(xì)品味這句話,再去看23種設(shè)計模式,每種設(shè)計模式都在應(yīng)對變化的事,比如策略模式,具體的策略在變化;工廠模式,創(chuàng)建的對象在變化;模板模式,具體模板算法實現(xiàn)在變化……這就好比營銷文案的底層邏輯:命中了你的痛點或爽點,具體痛點和爽點是什么需要去尋找。在實際問題中,需要我們?nèi)タ词裁丛谧兓?,選擇哪種設(shè)計模式比較合適。

3 再談底層邏輯

再回過頭看底層邏輯,平時我們看到的現(xiàn)象只是現(xiàn)象層,核心是要洞察到事物的底層邏輯,只有那樣才能真正理解現(xiàn)象、運用規(guī)律,如果你不懂營銷文案背后的底層邏輯,你所有的勤奮都是低水平的重復(fù),很難寫出高質(zhì)量的營銷文案,偶爾一兩次起得了良好的效果你也不知道為什么能吸引人。設(shè)計模式也是一樣,你能熟悉地畫出各種模式的UML圖,可你依然還是用不好設(shè)計模式,本質(zhì)還是沒有掌握設(shè)計模式的底層邏輯,只看到了設(shè)計模式的現(xiàn)象層的招式。設(shè)計模式的底層邏輯是“找到變化,封裝變化”,這里就有兩個問題:什么在變化,如何封裝變化,大師以為我們都知道,所以并沒有講具體怎么去尋找變化,怎么去封裝變化。接下來具體談?wù)勗趺慈ミ\用設(shè)計模式的底層邏輯。

??

??

三 設(shè)計模式要回答的兩個問題

1 什么在變化

“找到變化,封裝變化”這句話,首先要回答的是什么在變化,如果變化沒有找到,就不可能封裝變化。筆者這里以對象生命周期的視角去看待對象的變化,對象是由創(chuàng)建而產(chǎn)生,然后被使用,最后是消亡。對象有三個不同維度的變化:對象結(jié)構(gòu)的變化、對象規(guī)格的變化、對象行為的變化。以對象結(jié)構(gòu)變化為例,對象的關(guān)系劃分成兩類:線性關(guān)系和非線性關(guān)系(樹和圖),在線性關(guān)系中,如何解決一個對象的變化不會影響到關(guān)聯(lián)的對象?在樹型結(jié)構(gòu)中,如何解決不斷新增加對象的問題?在圖型結(jié)構(gòu)中,如何解決用戶方便使用復(fù)雜系統(tǒng)的問題?

找到變化是最為關(guān)鍵,不同的業(yè)務(wù)問題,遇到的變化問題也是不一樣的,核心是要找到這些變化。比如對象規(guī)格的變化,有數(shù)量的變化、類型的變化、外觀的變化,在實際編碼的過程中就要有這種思考,比如創(chuàng)建一個對象,再深入思想下,有沒有其它類型的對象?數(shù)量有沒有變化?……只有找到了這些變化,具體怎么去封裝變化就是技術(shù)的問題,接下來討論如何封裝變化。

2 如何封裝變化

從封裝的類型上看,有數(shù)據(jù)的封裝、方法的封裝、類型的封裝等。就具體的封裝方法而言,常見的有配置項、接口、抽象方法、類、注解、插件等具體的手段,再往上看主要使用了繼承、組合的方法,再往上看封裝的原則,常見的原則有單一職責(zé)、開閉原則、依賴倒置、隔離原則……大部分人平時更多地關(guān)注如何封裝變化,并沒有深入去思考什么在變化。

??

??

四 用底層邏輯推導(dǎo)結(jié)構(gòu)型設(shè)計模式

1 尋找對象結(jié)構(gòu)的變化

從UML看,對象之間的關(guān)系有依賴、泛化、組合、聚合,但就結(jié)構(gòu)關(guān)系上看只有兩種,線性關(guān)系和非線性關(guān)系。線性關(guān)系比較簡單,就是一對一的關(guān)聯(lián)關(guān)系,非線性關(guān)系分成兩種:樹型關(guān)系和圖型關(guān)系。

關(guān)系結(jié)構(gòu)有變化,意味著依賴發(fā)生了變化,比如線性關(guān)系中的變化,A依賴的B發(fā)生了變化,此時B變化了就會影響A,怎么做到B的變化不影響A就是要考慮的問題。

2 應(yīng)對線性變化

如上面所講,如果B發(fā)生了變化,由于A依賴B,則對象A也要改變化,如何減少對A的影響呢?這里有兩種方法:一種是通過增加適配來解決,另一種是通過代理來解決。這兩種方法的要點都是一個對象不與變化的對象直接關(guān)聯(lián),不管是適配還是代理,都是引入了第三方來與B關(guān)聯(lián),第三方負(fù)責(zé)與B進(jìn)行交互,B對A是沒有感知的。有的人馬上發(fā)現(xiàn)了一個問題,這不是把問題轉(zhuǎn)移到第三方上了嗎?乍一看,還真是這么回事,如果我們再發(fā)散思考,如果除了A要與B關(guān)系,還有E、F……,如果B一改就關(guān)聯(lián)的所有對象就要變化,這種代價就比較高,如果只與第三方關(guān)系,只用改一個地方,成本要少得多。

3 應(yīng)對非線性變化

非線性關(guān)系比線性關(guān)系要復(fù)雜,常見也有兩種方法:一種是通過注冊機(jī)制,另一種通過抽象層屏蔽復(fù)雜性。當(dāng)一個對象包含多個對象時,如果直接去管理,需要承擔(dān)的職責(zé)太多,通過注冊機(jī)制就比較好解決,增加一個對象,是通過注冊機(jī)制主動告知對象。另外一種方法就是通過抽象層屏蔽復(fù)雜性,比如門面模式,在門面內(nèi)把所有的復(fù)雜度都規(guī)避,對外提供簡潔的接口。

??

??

五 業(yè)務(wù)變化之道

設(shè)計模式還是要應(yīng)用到實際的業(yè)務(wù)中才能發(fā)揮它的價值, Alan Shalloway 提到一個觀點:無法預(yù)測哪里有變化,但能知道哪里可能有變化。平時我們在做業(yè)務(wù)需求開發(fā)時,要有這種識別變化的意識,先不要陷入面向過程的思維中,不要一上來就考慮如何去實現(xiàn),而是思考它是什么,會有哪些變化,比如對象的數(shù)量、對象的外觀、對象的種類……當(dāng)把這些思考清楚之后,才能設(shè)計得更合理。

比如筆者之前做清結(jié)算業(yè)務(wù)時,投資人理財?shù)狡诤?,會將本息金額的錢打給投資人,剛開始只有大華支付通道,這里就要想到一個問題,大華支付只是一種具體的實現(xiàn)方式,還會有沒有其它的支付方式,如果有就要做抽象設(shè)計,設(shè)計一個通用的支付模板類,每接一種新的支付通道時,只用重寫模板類中的幾個方法即可,后續(xù)又接了民生銀行支付、連連支付。

??

?
?

六 對象設(shè)計之道

有了前面所講內(nèi)容的鋪墊,這里再深入總結(jié)下對象設(shè)計的一些思考。對象設(shè)計有三個問題:有哪些對象?對象之間的關(guān)系是怎樣的?對象的職責(zé)有哪些?當(dāng)把這三個問題梳理清楚了,對象設(shè)計也就容易得多,也是面向?qū)ο蠓治雠c設(shè)計的核心。正常來講,我們知道結(jié)構(gòu)決定功能,功能決定行為,這是非常符合人的邏輯認(rèn)識,但要想了解清楚對象的結(jié)構(gòu)又是非常難的,就像新冠病毒的分子結(jié)構(gòu)也不是那么容易破解的,尤其是復(fù)雜業(yè)務(wù),它所包含的業(yè)務(wù)對象并不那么容易弄清楚它的結(jié)構(gòu)。

我們可以反過來思考,當(dāng)有一種業(yè)務(wù)場景時,先思考它的職責(zé)是什么,再去思考應(yīng)該由哪些業(yè)務(wù)對象去承擔(dān),這也是典型的歸納思維。比如在優(yōu)惠券業(yè)務(wù)中,它的業(yè)務(wù)活動就三個:建券、發(fā)券、用券,也就是任何一個優(yōu)惠券系統(tǒng),它要提供這三個最為基礎(chǔ)的能力,這三個能力又對應(yīng)到兩個業(yè)務(wù)對象:券批次和券實例,券批次相當(dāng)于是券的模板,告知優(yōu)惠券的預(yù)算有多少、券面額是多少、使用條件是什么……,具體發(fā)放到用戶手上的才是券實例。

當(dāng)有了業(yè)務(wù)對象之后,就要通過用例去思考對象模型的所包含的屬性和方法有哪些,這個過程并不是一次就能完美完成的,而是通過多次打磨才行,這里面就要遵循一些原則,比如單一職責(zé)、開閉原則、依賴倒置的原則……,讓整個模型的可擴(kuò)展性更好。

??

??

七 一個案例

最后拿一個案例來講,店鋪類目是賣家為了方便買家有針對性地選購商品而對商品做出的歸類,比如上新類目,把最近30天上架的商品歸類在一起,方便買家查找。遇到的挑戰(zhàn)就是怎么用一套業(yè)務(wù)模型去支持不同業(yè)務(wù)方高度定制化的需求,有的需求方要求有三級類目,有的業(yè)務(wù)方要求浮動的兩級類目,同時圈品方式也不一樣,有的業(yè)務(wù)方要求有自動圈選商品,圈選商品的條件還不一樣,如按價格圈選、按商品上架時間圈選、按評價圈選……

怎么去設(shè)計這套模型呢,還是從店鋪類目的定義去看,店鋪類目至少包含兩個關(guān)鍵的要素:類目結(jié)構(gòu)和類目圈品,因為歸類產(chǎn)生了結(jié)構(gòu),商品產(chǎn)生了圈品,考慮到類目有不同的層級和圈品條件,所以第一版模型就很快設(shè)計出來了,從模型中可以看到能支撐業(yè)務(wù)的訴求,尤其是圈品條件中業(yè)務(wù)方可以自定義各種條件注冊到平臺上,看到這個設(shè)計,筆者內(nèi)心還是欣慰的。

但在實現(xiàn)的過程中,發(fā)現(xiàn)了一些問題,如根類目和子類目,在業(yè)務(wù)模型中有這兩個概念,在代碼上也要有這兩個概念,正是引入了這兩個概念,代碼寫起來就比較麻煩,本身它們并沒有什么區(qū)別,現(xiàn)在人為地把它們區(qū)分開來,很多邏輯都要寫兩遍。筆者又進(jìn)模型進(jìn)行了優(yōu)化,變成了第二版模型,這個模型就更簡單了。

這里想談的兩點是要保證模型的簡潔性和降低技術(shù)復(fù)雜度,技術(shù)人喜歡鉆研技術(shù),喜歡把一些學(xué)到的技術(shù)應(yīng)用到項目中,這實際上是一種技術(shù)偏見,以為這樣才能體現(xiàn)出技術(shù)復(fù)雜度和技術(shù)能力。復(fù)雜并不見得有技術(shù)含量,就像設(shè)計模式的底層規(guī)律,作者并沒有長篇大談,而是只有8個字"找到變化,封裝變化",大道至簡就是這個道理,我們學(xué)習(xí)設(shè)計模式,不要為了用設(shè)計模式而用,一定要思考為什么用,解決了什么問題,這樣才有價值。

??

??

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2022-08-26 08:35:59

對象設(shè)計底層

2021-12-24 10:39:33

軟件開發(fā) 技術(shù)

2023-12-14 15:01:04

數(shù)字化轉(zhuǎn)型數(shù)據(jù)智能數(shù)字化

2019-11-22 08:23:57

程序設(shè)計底層

2023-10-31 15:08:56

WorkBoxServiceWorker

2022-01-13 13:24:16

工具底層邏輯

2021-02-02 05:41:16

底層設(shè)計頂層

2022-02-25 00:04:35

智能推薦產(chǎn)品

2024-01-03 09:03:40

MySQL索引數(shù)據(jù)庫

2025-04-27 09:52:49

2021-01-07 10:30:23

設(shè)計模式

2024-12-29 19:36:04

2020-04-23 18:24:40

戴爾

2024-04-10 10:47:46

底層邏輯SFunction

2021-04-19 21:25:48

設(shè)計模式到元

2021-02-01 10:01:58

設(shè)計模式 Java單例模式

2022-04-29 08:17:38

RPC遠(yuǎn)程代理代理模式

2020-11-09 09:50:45

MySQL數(shù)據(jù)恢復(fù)

2023-09-25 15:13:57

數(shù)字化轉(zhuǎn)型

2022-05-26 00:58:56

安全市場產(chǎn)品
點贊
收藏

51CTO技術(shù)棧公眾號