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

為什么要學(xué)設(shè)計模式:本質(zhì)、價值與收益

開發(fā) 前端
時隔三年,我再次刷了一遍設(shè)計模式相關(guān)知識,這次我對設(shè)計模式有了更深刻的認識。所以今天我們就來聊聊:設(shè)計模式的本質(zhì)是什么?它的存在有什么價值?學(xué)了設(shè)計模式有什么好處?

 [[379656]]

01 設(shè)計模式的本質(zhì)

說起設(shè)計模式,就不得不說起重構(gòu)。在 2017 年,當(dāng)我還是一個工作 3 年的菜鳥,我重構(gòu)了公司一個十幾年的老系統(tǒng),弄得心力交瘁。為了能深刻吸取這次重構(gòu)的教訓(xùn),我寫了一篇文章記錄這次重構(gòu)的心得:淺談重構(gòu)中踩過的坑 - 陳樹義的博客。

時隔三年,我再次刷了一遍設(shè)計模式相關(guān)知識,這次我對設(shè)計模式有了更深刻的認識。所以今天我們就來聊聊:設(shè)計模式的本質(zhì)是什么?它的存在有什么價值?學(xué)了設(shè)計模式有什么好處?

在這篇文章中,我對設(shè)計模式的總結(jié)是:設(shè)計模式用于承載復(fù)雜的業(yè)務(wù)邏輯,使寫出的代碼簡潔、易擴展。 簡單地說,你需要去了解業(yè)務(wù)中哪些是變化的,哪些是不變的。這些變化的東西就是復(fù)雜的業(yè)務(wù)邏輯,你需要思考如何用一種合適的設(shè)計模式去承載它,使得當(dāng)它發(fā)生變化的時候,能具有很好的擴展性。這時候如果你學(xué)過設(shè)計模式,對每種設(shè)計模式的使用場景都諳熟于心,那你做起來會更加得心應(yīng)手。

有些人說,我看有些人也沒學(xué)過設(shè)計模式,但他們代碼也寫得挺好啊。這里我想表達我的第二個觀點:抽象思維才是設(shè)計模式的內(nèi)核。 有些人接觸的項目多了,其在項目中不知不覺地就用到了一些設(shè)計模式。這些人一般都具有一個共同點:抽象總結(jié)能力強。他們接觸到了東西多了,會不斷思考他們的共同之處,然后試圖總結(jié)出經(jīng)驗。如果你具有這種抽象的思維,那即使你沒看過設(shè)計模式,你也能寫出類似于設(shè)計模式的代碼。甚至到最后,你也可以設(shè)計出一種獨特的設(shè)計模式。到時候你可能就成為了自創(chuàng)門派的「一代宗師」了。

02 設(shè)計模式的價值

對于設(shè)計模式,不少人也有很多見解。有的人覺得設(shè)計模式名過其實,實際編程中遠遠沒有那么重要。在我看來,設(shè)計模式存在即合理,至少它有下面三點實在的意義。

設(shè)計模式是經(jīng)驗沉淀,便于后來者快速學(xué)習(xí)。 人類之所以能一代更比一代強,靠的就是用文字符號實現(xiàn)經(jīng)驗傳承。而在編程領(lǐng)域,我們的設(shè)計模式其實就是前人在實戰(zhàn)中的經(jīng)驗總結(jié),他們將這些經(jīng)驗歸納出來成為設(shè)計模式。

對于經(jīng)驗不是很多的人來說,學(xué)習(xí)設(shè)計模式可以讓他們有個初步的印象,等到他們有對應(yīng)的項目經(jīng)驗時,他們可以更好地應(yīng)用上。而對于項目經(jīng)驗豐富的人來說,設(shè)計模式可以豐富他們的項目場景,進一步提高他們對于復(fù)雜場景的掌控。

設(shè)計模式可以方便交流。 有些同學(xué)會覺得一些設(shè)計模式自己都用過,只不過先輩們給它起了個名字而已,沒什么大不了的。但不知道這位同學(xué)是否有思考過:為什么要給各個設(shè)計模式起一個名字?

我們的知道有顯性知識和隱形知識之分。顯性知識就是大家一說,我們都能聽得懂的。例如錘子可以用來釘釘子,例如搜索引擎可以用來搜索知識。而隱形知識則是指那些我們做事的經(jīng)驗,我們很難描述出來的東西。

我們這里說的設(shè)計模式,落地下去其實就是對應(yīng)的代碼結(jié)構(gòu)。但我們?nèi)绾螌⑦@種實戰(zhàn)中的經(jīng)驗描述出來呢?一個最直接的方法是:我每次跟別人交流的時候,我都說:你這個創(chuàng)建一個接口,然后這個類繼承這個接口,然后 bla bla …… 可能你說了半天,人家也還沒聽懂。即使聽懂了,你下次還是得嘰里呱啦說半天,別人才能聽得懂。

怎樣才能讓別人一下子領(lǐng)會到我們的意思呢?很簡單,就是給這種代碼結(jié)構(gòu)起個名字嘛!這也才有了工廠方法、策略模式、模板模式這些名詞。當(dāng)你跟別人一說這個名字,別人就知道是怎么回事,這不就大大提高了溝通效率嘛!

生活中其實也有很多類似的例子。我們?yōu)槭裁磿泻芏嗨伎寄P停纾篠MART 模型、PDCA 模型?本質(zhì)上就是用來幫助記憶,以及便于溝通的。

想想看「搜索引擎」這個詞,在 50 年前還不存在,那為什么有搜索引擎這個詞呢?不就是為了便于交流,讓別人知道是怎么回事嗎?假設(shè)沒有「搜索引擎」這個詞,我們要描述百度,我們得怎么描述?我們試一下:就是你打開一個網(wǎng)頁,輸入詞語,然后會挑出來一大堆相關(guān)的信息。這樣還是挺麻煩的吧。

想想「五花肉」這個詞,可能在古代還真沒這個詞。那我們要怎么形容?古代人說:就是那種一點肥、一點瘦的豬肉?,F(xiàn)代人三個字搞定:五花肉!多高效啊!

03 學(xué)設(shè)計模式的好處

聊完了設(shè)計模式的本質(zhì)和意義,最后我們聊聊設(shè)計模式的好處。

提高系統(tǒng)設(shè)計能力,代碼更簡潔,更易于擴展。 在互聯(lián)網(wǎng)公司干過的都知道,研發(fā)流程里最確定的東西就是變化本身。需求是不可能一成不變的,唯一不變的就是需求會一直變。這就對研發(fā)人員提出了更高的要求,需要在系統(tǒng)設(shè)計的時候考慮到后續(xù)的擴展。

設(shè)計模式本質(zhì)上就是對變化的封裝,用結(jié)構(gòu)化的代碼結(jié)構(gòu)去承載變化的需求。 當(dāng)你明白這一點后,你需要做的就是去分析出系統(tǒng)中變化的部分,之后采用合適的設(shè)計模式(代碼結(jié)構(gòu))去實現(xiàn)。只要變化的部分拆解得好,那你就有足夠強大的結(jié)構(gòu)去應(yīng)付變化的需求。

在這一個層次上,考驗的其實是你對業(yè)務(wù)的理解,還有你掌握的設(shè)計模式的數(shù)量。這些將直接決定你是否能抽離出變化的部分,而抽離出變化的部分之后,你能不能找到合理的設(shè)計模式去承載。如果找不到,那你的「抽象思維」層次決定了你是否能自我創(chuàng)造一種設(shè)計模式。

設(shè)計模式可以幫助閱讀源碼、寫框架。 在我們現(xiàn)在使用的不少框架中,都使用了很多的設(shè)計模式。越是底層的系統(tǒng),他們就需要越抽象,他們使用到的設(shè)計模式就越多。例如:Spring 框架中使用到的設(shè)計模式就多達十幾種,有工廠模式、代理模式、模板模式等等。

當(dāng)你理解了這些設(shè)計模式之后,你再去閱讀源碼,你就能夠更快速地領(lǐng)會框架作者的意思。否則你看源碼只會像看天書一樣,完全看不懂,還吐槽這代碼怎么這么垃圾。

設(shè)計模式有利于你面試。 這點可以說是挺功利的一點,但也確實是最實在的一點。工作三年以上的工程師,至少要會學(xué)習(xí)一些設(shè)計模式。只有掌握了合理的設(shè)計模式,你寫的功能才能更易于擴展。這也是我們這些工作多年的老碼農(nóng),和剛畢業(yè)的小年輕的區(qū)別。

如果你工作了好幾年,寫代碼的時候還是從頭寫到尾短平快,不考慮一點擴展性,那么你可能真的很容易被替代。現(xiàn)今的面試中,也越來越考察面試者的代碼編寫能力了。掌握設(shè)計模式的思維方式,可以幫助你在面試中拿到更多的籌碼、贏得更高的薪資。

04 小結(jié)

設(shè)計模式本質(zhì)上是用于承載變化的業(yè)務(wù)邏輯,使寫出的代碼簡潔、易擴展。它們就像武功中的招式,但具體的招式并不是目的,抽象思維才是設(shè)計模式的內(nèi)核。掌握了抽象的思維,你也能設(shè)計出屬于自己的模式。

設(shè)計模式是前人經(jīng)驗的總結(jié),便于后來者快速學(xué)習(xí)。設(shè)計模式與菜名、標(biāo)簽一樣,是對代碼結(jié)構(gòu)的一種描述,便于我們交流。掌握了設(shè)計模式,能夠讓我們提高系統(tǒng)設(shè)計能力,使系統(tǒng)更易于擴展。同時也能讓我們讀源碼、寫框架時事半功倍。

 

圖片

 本文轉(zhuǎn)載自微信公眾號「陳樹義」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系陳樹義公眾號。

 

責(zé)任編輯:武曉燕 來源: 陳樹義
相關(guān)推薦

2022-11-28 09:58:58

C++開發(fā)

2021-03-26 10:04:38

數(shù)據(jù)結(jié)構(gòu)技術(shù)

2010-11-03 09:22:00

C語言

2020-10-14 08:33:23

Prometheus監(jiān)控體系

2022-06-02 08:48:39

Go枚舉器Iota

2019-03-11 08:36:11

Python代碼Flask

2009-09-07 16:45:54

.NET代碼設(shè)計

2022-01-19 22:51:57

設(shè)計匿名用戶

2012-04-16 15:14:47

web設(shè)計

2017-11-21 14:41:29

編程語言Python

2024-12-31 11:05:07

2015-08-06 10:14:15

造輪子facebook

2022-08-15 08:27:02

基站網(wǎng)絡(luò)

2013-03-12 14:30:09

Ubuntu操作系統(tǒng)

2023-10-09 18:39:13

Python代碼

2021-11-19 09:49:00

CC++語法糖

2017-09-08 08:35:16

Android代碼API設(shè)計

2024-10-17 16:41:57

KafkaZooKeeper

2014-08-25 10:00:18

開源

2015-05-12 11:04:42

Java EE學(xué)習(xí)Java EE
點贊
收藏

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