“一個設(shè)計模式引發(fā)的血案”
雖然作為一個菜雞虐呻,可能還談不上架構(gòu),但是就像說說自己的一些想法船殉。
01 一個設(shè)計模式引發(fā)的血案
事情要從 2018.8.30 晚上說起更振。
由于心血來潮炕桨,想想也沒事情干,就啃完了阮一峰的《ES6 入門》肯腕∠坠看到最后幾章中提到了 Decorator(修飾器),感覺很新奇实撒。好像 OC 中沒有類似的語法糖姊途,但是在 Java 中見過。但是心想知态,不就一個裝飾器模式么捷兰?有啥好特別的,當(dāng)時也沒有多想负敏,就合上書贡茅,睡覺去了。
第二天其做,也不知道哪根筋搭錯了顶考,就問起了大佬。
大佬妖泄,OC 中好像沒有裝飾器模式驹沿?Java 和 JS 中貌似都有語法糖的樣子?
cocoa touch 里面沒見過蹈胡。
(黑人問號渊季??审残?)
category 不算么梭域?裝飾器模式不就是對于類的方法或者變量的補(bǔ)充么?
category 跟典型的 decorator pattern 不太一樣搅轿,decorator 實例會有一個指向原實例的指針病涨,原實例沒有被改變,還可以獨(dú)立使用璧坟,category 的話既穆,就不是這樣,decorator 就像是消音器雀鹃,可以拆卸幻工,category 是把槍械的設(shè)計圖紙改了±杈ィ”
囊颅??? 難道是我記錯了
基于好奇心踢代,去 wiki 上查了下盲憎, wiki 的解釋如下。
What problems can the Decorator design pattern solve?
Responsibilities should be added to (and removed from) an object** dynamically at run-time**.
A flexible alternative to subclassing for extending functionality should be provided.
Emmmmm 好像不是胳挎。不死心的我饼疙,建了個工程試了下,好像還真不是慕爬。就算沒有引用 category file 也能正常通過 performSelector 直接調(diào)用窑眯。又記起 category 還像是在編譯期加入方法的,當(dāng)時的我
學(xué)藝不精医窿,告辭0跛Α!留搔!
02 “術(shù)”與“道”
當(dāng)然更胖,摸到大佬的腿肯定就不能這么輕易放開的。
那么隔显,怎么才能成為和大佬一樣的人呢却妨?對于那么多細(xì)節(jié)上的點(diǎn)就都熟記于心呢?
Emmmmmmm...... 實際上括眠,設(shè)計模式的書我都沒看過
實際上彪标,設(shè)計模式,算是“術(shù)”掷豺,你要是領(lǐng)會了“道”捞烟,術(shù)是很容易的。
不得不說当船,大佬就是大佬题画,有的話就是有深度。再細(xì)細(xì)體會了許久并和大佬繼續(xù)深入交流之后德频,終于有所領(lǐng)悟苍息。
03 “術(shù)”與“道”
何為術(shù)?何為道壹置?
說起術(shù)和道竞思,腦海中印象最深的,就屬動漫《一人之下》(原名異人)中的諸葛青和王也道長兩個人物了钞护。(一人之下作者米二對于整部作品注入了大量道家相關(guān)的元素盖喷,奇特的畫風(fēng),耳熟能詳?shù)目谝裟压荆屓税V迷不已课梳,強(qiáng)烈安利距辆。)諸葛青和王也道長均為術(shù)士,所用的呢都是術(shù)法惦界,說起術(shù)法就不可不談道家的奇門遁甲挑格。
奇門遁甲指的是奇門和遁甲。奇就是乙(日)沾歪、丙(月)、段硐(星)三奇灾搏,為天時×⑷螅“門”就是休狂窑、生、傷桑腮、杜泉哈、景、驚破讨、死丛晦、開八門(在排宮法中是八門,在飛宮法中九門:休提陶、死烫沙、傷、杜隙笆、中锌蓄、開、驚撑柔、生瘸爽、景),為方位铅忿。遁就是隱藏剪决,“甲”指六甲,即甲子辆沦、甲戌昼捍、甲申、甲午肢扯、甲辰妒茬、甲寅,“甲”是在十干中最為尊貴蔚晨,它藏而不現(xiàn)乍钻,隱遁于六儀之下肛循。
在中國傳統(tǒng)文化中,奇門遁甲被認(rèn)為是以易經(jīng)和八卦為基礎(chǔ)银择,結(jié)合星相歷法多糠、天文地理、八門九星浩考、陰陽五行夹孔、三奇六儀等要素的一門學(xué)問。
——以上內(nèi)容引自維基百科
而作為術(shù)析孽,奇門遁甲自古以來就是通曉天地的規(guī)律搭伤,了解世間萬的“道”理,從而做到真的趨吉避兇袜瞬×或者說我認(rèn)為,術(shù)實際上是人對于道的一種運(yùn)用邓尤。
那么如果把設(shè)計模式作為“術(shù)”拍鲤,他用于解決我們平常所遇到的業(yè)務(wù)模塊,那么道是什么汞扎?
深感迷惑的我被大佬的一句話點(diǎn)醒季稳。
道可道,非常道佩捞。
04 設(shè)計模式與兵法
俗話說:兵無常勢绞幌,水無常形。
我們?nèi)粘5臉I(yè)務(wù)場景就是一個個的難題一忱,很多時候莲蜘,我們會發(fā)現(xiàn),現(xiàn)有的架構(gòu)帘营,沒有辦法很好的契合到業(yè)務(wù)場景當(dāng)中票渠。真的是我們的架構(gòu)不對么?實際上并不是芬迄。那是因為我們的業(yè)務(wù)場景太多變么问顷?實際上也不是。那么問題究竟處在哪呢禀梳?
17世紀(jì)英國哲學(xué)家培根曾經(jīng)說過:“讀史可以明智”杜窄。既然想不出個所以然來,那就看看古人是怎么做的算途。
古時候天下分久必合合久必分塞耕,各個帝王能夠贏下各個城池,所需要考慮的東西嘴瓤,肯定比我們現(xiàn)在碰到的業(yè)務(wù)場景多得多扫外。那么當(dāng)時有什么精華可以讓我們學(xué)習(xí)的呢莉钙?想必唯有“陣法”可以一學(xué)。
而說到陣法筛谚,可能就要說一說《夢幻西游》玩家都知道的一個人磁玉,鬼谷子。鬼谷子在《夢幻西游》代表著各個陣法驾讲。而史書中記載蚊伞,鬼谷子是戰(zhàn)國時期縱橫家的鼻祖(讓我不禁聯(lián)想到了《秦時明月》),座下弟子無數(shù)蝎毡,而最為人所知的厚柳,可能就是兵家代表人孫臏。而孫臏所著的《孫臏兵法》中沐兵,將陣完整系統(tǒng)地分為八種陣型。既:“方便监、圓扎谎、錐行、雁行烧董、鉤行毁靶、玄襄、疏陣逊移、數(shù)陣预吆、火陣、水陣胳泉」詹妫”
那么陣法有什么可以學(xué)的呢?
陣法看似規(guī)整(只有這幾種)扇商,實則不然凤瘦。所有的陣法均看將領(lǐng)的指揮,對于不同的敵方的陣型案铺,有的時候不僅僅需要陣型的切換蔬芥,有的時候還需要對陣型進(jìn)行改造,進(jìn)行創(chuàng)新控汉,而設(shè)計模式也類似與此笔诵。
業(yè)務(wù)沒有永久的不變的業(yè)務(wù),而設(shè)計模式也沒有永久不變的設(shè)計模式姑子,所有的設(shè)計模式衍生出各種各樣的新的架構(gòu)乎婿,從而支持著各種各樣的業(yè)務(wù)場景,從 MVC壁酬,到 MVP次酌,到 MVVM 等等恨课,誰都不能說哪個好,哪個壞岳服。也沒有誰推翻了誰剂公,只是新的能夠支持當(dāng)前業(yè)務(wù)形態(tài)的形式被發(fā)現(xiàn)了,為的就是能夠更好的支持各種各樣的業(yè)務(wù)場景吊宋。
04 道可道纲辽,非常道
就如大佬所說:道可道,非常道璃搜。
這句話在我理解有兩層意思:
一拖吼、道可道,非“痴馕牵”道
道看似不變吊档,實際上一直在變,他永遠(yuǎn)不會以一種常態(tài)出現(xiàn)在你的面前唾糯。
業(yè)務(wù)場景是如此怠硼,架構(gòu)亦是如此。你永遠(yuǎn)不會觸碰到同一種業(yè)務(wù)移怯,每種業(yè)務(wù)都有自己的獨(dú)特點(diǎn)香璃。
二、道可道舟误,“非称厦耄”道
俗話說:道生一,一生二嵌溢,二生三眯牧,三生萬物,萬物歸一堵腹。萬物看似皆在變炸站,實則皆不變。道仍然是道疚顷,變得只是他的表象旱易。而現(xiàn)有的設(shè)計模式思路也是如此,說白了就是如何對于每個模塊進(jìn)行優(yōu)雅的拆分腿堤,從而更好的進(jìn)行組合阀坏。而為的就是每塊代碼能夠更好的對那一塊內(nèi)容進(jìn)行解釋。而這就是一種求極限的思路笆檀,如何讓設(shè)計模式產(chǎn)出的內(nèi)容能夠與業(yè)務(wù)形態(tài)進(jìn)行映射忌堂。
就像當(dāng)我們遇到問題的時候會有2個域,一個是 problem domain(待解決問題的領(lǐng)域)酗洒,一個是 solution domain(對問題提出解決方案的領(lǐng)域)士修。有的時候看到 problem domain枷遂,我們就能提出正確以及優(yōu)雅的解,那是因為我們看穿了這個問題的本質(zhì)和某種設(shè)計模式相類似棋嘲,直接套用即可酒唉。但是有的情況下我們并沒辦法提出最優(yōu)雅的解。而這個時候沸移,我們站在開發(fā)的角度痪伦,需要不斷的向產(chǎn)品提出自己的疑惑****,從而明白雹锣,產(chǎn)品真正需要的是什么网沾?當(dāng)弄清楚這個問題之后,我們所需要做的就是如何優(yōu)雅地將 problem domain 映射到 solution domain 上蕊爵。
05 映射與最優(yōu)解
那么有的時候我們會想辉哥,這些解決方案,從哪來呢攒射?
有人可能會說证薇,前輩們留下來的唄。
那么再往前呢匆篓?在沒有設(shè)計模式這個概念提出來的時候呢?
勞動人民日積月累的寶貴經(jīng)驗寇窑?
那再往前呢鸦概,在歷史的長河之中呢?
帝王甩骏?Emmmmmmm窗市??饮笛?
那個時候可能不叫解決方案咨察,可能叫做《帝王術(shù)》。就像前面說到福青,“讀史可以明智摄狱。”很多情況下无午,歷史已經(jīng)告訴了我們很多經(jīng)驗媒役。
以 JS 的數(shù)據(jù)存儲為例,一般情況下為人所熟知對于 Store 的存儲有兩個方向宪迟,一個是集中式——redux酣衷,一個是分布式——mobx。你說這兩個設(shè)計思路很新穎次泽?實則不然穿仪,redux 更像是中央集權(quán)制度的映射席爽,如果一個人修改了主要的 store,那么就會引入臟數(shù)據(jù)啊片,從而影響整個工程只锻;而 mobx 更傾向于權(quán)力的拆分,映射到數(shù)據(jù)而言钠龙,就是讓數(shù)據(jù)與數(shù)據(jù)之間彼此獨(dú)立(由于對于 JS 這幾個庫不怎么熟悉而且不是這次討論重點(diǎn)炬藤,只能點(diǎn)到為止)
那么具體哪個是最優(yōu)解呢?誰也說不出碴里,因為對于不同的業(yè)務(wù)場景沈矿,最終的結(jié)論都是不同的。
05 問題與本質(zhì)
所以說無論問題有多難咬腋,在對問題不斷拆解的過程羹膳,就是一個不斷探索問題本質(zhì)的過程。寫代碼是如此根竿,做產(chǎn)品亦是如此陵像。
說到這有人可能不信了?做產(chǎn)品還能有本質(zhì)這一說寇壳?
無論哪一款爆款的產(chǎn)品醒颖,最終能被眾人接受的原因就是滿足了人的“七大罪”—— 傲慢、貪婪壳炎、色欲泞歉、嫉妒、憤怒匿辩、暴食及怠惰腰耙。前五個可能風(fēng)險系數(shù)較高,所以一般容易出事情铲球,而最后兩個挺庞,一個是美食,也就是吃吃吃稼病。另一個就是懶选侨。
世間流傳著一句話:這個世界實際上是由懶人推動的。因為當(dāng)一個人想要變得懶惰的時候溯饵,他會想辦法找到各種更加快捷或者更加方便的事物進(jìn)行代替侵俗。機(jī)器人取代人,軟件操作系統(tǒng)取代日常文件的維護(hù)丰刊,移動端取代 PC 端逐漸成為時代的主流……
06 道與編程
扯了那么多隘谣,最后總結(jié)一些個人的想法:實際上編程和道是一樣的,包括大數(shù)據(jù)亦是如此。都是不斷得在追求事物的規(guī)則寻歧,甚至是本源掌栅,并將其進(jìn)行規(guī)則化或者說通過規(guī)則進(jìn)行描述。就像 05 中提到的码泛,世間萬物都是會隨著時代變遷朝著熵增(混亂度增加猾封,有序變成無序)的方向發(fā)展,而人為了能夠讓自己過得更加舒服(變得更懶)噪珊,就會不斷得將無序轉(zhuǎn)變成為有序晌缘。而作為一個程序員,有的時候不僅僅滿足于自己的能夠做出一個產(chǎn)品痢站,更能在處理問題的過程中磷箕,驚奇的發(fā)現(xiàn)一個個神奇的規(guī)律。那種對于規(guī)則的不斷探索所產(chǎn)生的 High 點(diǎn)阵难,可能這就是我還會繼續(xù)寫代碼的原因吧……
當(dāng)然有的時候我也會不斷思考如果強(qiáng)人工智能真的出現(xiàn)了(也就是人類真的發(fā)現(xiàn)了人這個東西中的所有規(guī)則)會怎么樣岳枷?那就是下一篇文章中的故事了。
歡迎關(guān)注我的公眾號:zkhCreatorPro
聊聊產(chǎn)品呜叫,談?wù)勅松辗保艺f的不一定是對的,但是都是我思考過的朱庆。