一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

放過(guò)設(shè)計(jì)模式吧

 ihacku 2015-05-30

太久不寫博客,都不知道咋開頭了。

主要是現(xiàn)在這設(shè)計(jì)模式的文章太多,而且各種爛各種曲解,看的人心煩,煩到忍不住想自己寫一個(gè)系列把它們說(shuō)清楚——但是呢,轉(zhuǎn)念一想,我寫的再怎么清楚能有GoF清楚呢,怎么能有GoF的影響力大呢,GoF明明白白地?cái)[著,還有這么多人亂搞,我又能做什么呢?所以想了半天,我覺(jué)得就寫一篇文章來(lái)吐槽好了。 - -!

說(shuō)設(shè)計(jì)模式這個(gè)東西呢,不少網(wǎng)友跟我說(shuō)起其實(shí)叫設(shè)計(jì)模式是很不對(duì)的,我也深有同感。pattern這個(gè)詞有紋理、花紋的意思,外國(guó)人買布買窗簾的時(shí)候可能會(huì)挑挑pattern,這東西說(shuō)成是模式就有點(diǎn)過(guò)了,所以我覺(jué)得這個(gè)東西其實(shí)翻譯成《面向?qū)ο笤O(shè)計(jì)23招》比較好,這樣也跟我朝的《網(wǎng)頁(yè)特效50例》等暢銷書比較對(duì)仗。

雖然一些同學(xué)對(duì)"設(shè)計(jì)模式"這個(gè)好聽的詞被搶感到不滿,認(rèn)為提到的時(shí)候應(yīng)該加些修飾詞,不過(guò)為了簡(jiǎn)單起見,咱們這里約定凡提到"設(shè)計(jì)模式"皆指GoF23模式。

設(shè)計(jì)模式針對(duì)的是面向?qū)ο?/span>的設(shè)計(jì)問(wèn)題 

設(shè)計(jì)模式的另外一個(gè)巨大的問(wèn)題就是它把面向?qū)ο蠛蛙浖@兩個(gè)重要的關(guān)鍵詞放進(jìn)副標(biāo)題里面了,兼之作者非常騷包地在里面扯了一通模式界、建筑學(xué)這等事情,搞得好像這書超脫了語(yǔ)言和場(chǎng)景限制,"是一種編程思想"(加引號(hào)的原因是我覺(jué)得大師們欺騙新手最常見的手段就是故弄玄虛地說(shuō)"語(yǔ)言都是浮云,編程思想最重要。"),只要寫程序就必須模式一下什么的。當(dāng)然GoF肯定不是故意騙大家了,其實(shí)也只能騙到那些只看正標(biāo)題連副標(biāo)題也不看的孩子,看了內(nèi)容的話就更不會(huì)搞錯(cuò)了。

但是令我驚訝的是連副標(biāo)題都不看的人確實(shí)不在少數(shù),非要用跟面向?qū)ο蠛翢o(wú)關(guān)系的方法實(shí)現(xiàn)設(shè)計(jì)模式的人真的很多啊......

說(shuō)了半天其實(shí)我這里想說(shuō)的是設(shè)計(jì)模式是面向?qū)ο缶幊讨刑赜械囊恍┘记?,是?yīng)用五大基本原則之后(單一職責(zé)、開放封閉、里氏代換、接口隔離、依賴倒置)產(chǎn)生的一些設(shè)計(jì)疑難問(wèn)題的解決手段。在一些非純的面向?qū)ο笳Z(yǔ)言里面可能根本就不需要設(shè)計(jì)模式。

一個(gè)非常明顯的例子就是,抽象工廠、工廠方法、原型三個(gè)模式要解決的是DIP應(yīng)用以后的創(chuàng)建對(duì)象難題。

很多文章根本就不管什么DIP,舉了一堆所謂"生活中的例子",神馬造零件做漢堡的copy作業(yè)之類的,尼瑪啊,這跟那些生活有毛關(guān)系啊,程序員的生活難道不就是寫程序么?寫程序難道不就必然要用到DIP么?用到DIP只依賴接口這東西不能new才需要這幾個(gè)模式的啊,人家模式名字里面帶工廠倆字沒(méi)聽說(shuō)實(shí)現(xiàn)的業(yè)務(wù)就一定要跟生產(chǎn)有關(guān)系啊。

基于這種不知所謂的邏輯,這幾個(gè)模式當(dāng)然也可以用在JS、C什么的里面啦,因?yàn)镴S也難免有描述鞋廠麥當(dāng)勞的時(shí)候嘛。于是這些模式就華麗麗地成為了一種思想,抽象工廠變成了"描述一個(gè)一種對(duì)象可以產(chǎn)生另外一種對(duì)象這樣的業(yè)務(wù)邏輯",原型變成了"描述一個(gè)對(duì)象可以copy自身這樣的業(yè)務(wù)邏輯",更加華麗地是,這些業(yè)務(wù)邏輯模式還能被扭來(lái)扭曲實(shí)現(xiàn)成完全符合GoF上UML圖的類結(jié)構(gòu)啊.....

說(shuō)到正經(jīng)事,既然是因?yàn)樽裱璂IP才引入的幾個(gè)模式,在JS這個(gè)沒(méi)有接口的面向?qū)ο笳Z(yǔ)言中,自然不存在使用的需求了。(但有趣地是,JS里面把原型作為幾乎是唯一地創(chuàng)建對(duì)象手段,與本文主題無(wú)關(guān),就不多說(shuō)了。)而C++有模板這樣強(qiáng)大的特性,很大程度上也不需要簡(jiǎn)單工廠和工廠方法(抽象工廠還是需要的)。同樣的道理,擁有delegate和Event的C#里面也沒(méi)有使用觀察者模式的必要。

語(yǔ)義比UML重要1000倍

設(shè)計(jì)模式里面最不容易誤解的就是UML了,凡講設(shè)計(jì)模式的文章,就算扯得再不靠譜,一般UML也是對(duì)的...... 好吧UML也是對(duì)的這件事實(shí)在太容易,甚至比如策略模式和狀態(tài)模式和橋接模式的UML都是基本一樣的。

嗯,于是囧的事情出現(xiàn)了,比如http://en./wiki/Strategy_pattern 在煞有介事地對(duì)比策略和橋接到底有何不同。尼瑪?。。。?!我怎么沒(méi)想明白一個(gè)叫"實(shí)現(xiàn)",一個(gè)叫"算法",這倆東西腫么就能有交叉呢?

只看UML是不少設(shè)計(jì)模式文章的通病,嗯,通常情況下這時(shí)候"生活中的例子"又會(huì)登場(chǎng)了,語(yǔ)義則會(huì)被華麗麗地?zé)o視。最為悲慘的兩個(gè)模式就是策略模式和橋接模式了,看來(lái)"算法"、"實(shí)現(xiàn)"、"抽象"這些詞實(shí)在不太好理解。為了夠"生活",譬如買油和買鹽這等完全不相干的功能就被戴上了算法的帽子,GoF說(shuō)的好"本模式使得算法可以獨(dú)立于使用它的Client而變化",Client表示很無(wú)奈啊,就換了個(gè)算法而已,連結(jié)果都變了是怎么回事啊,剛才算的還是a+b,尼瑪你一換算法結(jié)果變成a*b了?(嗯, 我在吐槽http://en./wiki/Strategy_pattern) 臥槽你想說(shuō)a+b和a*b都是calculate這件事么?你怎么不干脆把所有方法都叫dosomething啊,那樣全世界所有的事情都可以叫不同策略了??!

橋接模式更悲劇了,"抽象"和"實(shí)現(xiàn)"這倆詞怎么聽著這么像接口和具體類啊,難道說(shuō)......橋接模式其實(shí)就是LSP?再一看UML真簡(jiǎn)單啊,這不就是組合么?于是亂搞一個(gè)"生活中的例子"把UML對(duì)上就成了!我承認(rèn)英文里面這倆詞跟實(shí)現(xiàn)接口、抽象類有點(diǎn)像,翻譯成中文更沒(méi)區(qū)別了,但是GoF里面不是tmd還有例子呢么?不是還有解釋呢么?GoF那Window的例子是多么的明顯,抽象是業(yè)務(wù)相關(guān)的,實(shí)現(xiàn)是系統(tǒng)底層相關(guān)的。 

一些其它的模式和誤解

Flyweight經(jīng)常被以C#的字符串為例而搞成"神秘地節(jié)約內(nèi)存方案",或者以內(nèi)存池為例搞成只有外部狀態(tài)的假對(duì)象。辨識(shí)正確的Flyweight模式實(shí)現(xiàn)的關(guān)鍵要素是內(nèi)部狀態(tài)和外部狀態(tài)是否俱全。

Composite模式經(jīng)常被誤解為樹形結(jié)構(gòu),辨識(shí)Composite模式的關(guān)鍵在于語(yǔ)義,幾個(gè)X的組合是否仍然是X,而不是被X包含。舉例子來(lái)說(shuō),幾個(gè)幾何圖形的組合仍然是幾何圖形,而幾個(gè)HTML節(jié)點(diǎn)的組合就不是一個(gè)HTML節(jié)點(diǎn)。

Decorator模式經(jīng)常被搞成拼字符串用的(尼瑪,這活還是交給StringBuilder之類的東西吧......),辨識(shí)Decorator的關(guān)鍵一是被裝飾的是類而不是方法,二是語(yǔ)義上是否可以被再次裝飾。 

結(jié)語(yǔ) 

設(shè)計(jì)這件事情很難用語(yǔ)言表達(dá),因此要講清楚設(shè)計(jì)是一件非常困難的事情,在博客園出現(xiàn)的設(shè)計(jì)模式文章我經(jīng)常跑去給負(fù)面評(píng)論......但屢屢被教育"不要為了模式而模式"、"你對(duì)設(shè)計(jì)模式的理解,還僅限于GoF"、"只要遵循基本設(shè)計(jì)原則就可以"。(大約我朝受"無(wú)招勝有招"文化熏陶太久,導(dǎo)致大家還沒(méi)等學(xué)會(huì)招呢,先奔無(wú)招去了......)設(shè)計(jì)模式的本意之一是提供一套通用的設(shè)計(jì)詞匯,但是顯然時(shí)至今日(至少在我朝),它自身都被各種歪曲誤解。希望大家能夠一起努力,一是以身作則,寫文章的時(shí)候更嚴(yán)謹(jǐn),二是擦亮眼睛,看文章的時(shí)候多查資料,消滅設(shè)計(jì)模式的各種歪解。

附上一張我的設(shè)計(jì)模式書的照片,以證明我確實(shí)讀過(guò)GoF(挖咔咔咔咔)

 

看了朋友的一些評(píng)價(jià)覺(jué)得有必要提一下,

寫此文的意思絕對(duì)不是要初學(xué)者不寫設(shè)計(jì)模式的文章

我想表達(dá)的意思是(不限于設(shè)計(jì)模式)讀書寫文章的時(shí)候,應(yīng)該更加嚴(yán)謹(jǐn),不理解的地方,不能含糊代過(guò)甚至憑想當(dāng)然,這樣不論對(duì)人對(duì)己,都是更容易進(jìn)步。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    久久国产亚洲精品赲碰热| 亚洲中文字幕剧情在线播放| 欧美精品中文字幕亚洲| 尤物久久91欧美人禽亚洲| 午夜精品福利视频观看| 成人免费视频免费观看| 国产精品激情在线观看| 日韩成人高清免费在线| 日韩精品一级一区二区| 人妻一区二区三区多毛女| 91欧美视频在线观看免费| 国产成人亚洲欧美二区综| 果冻传媒精选麻豆白晶晶| 亚洲午夜av一区二区| 亚洲熟女一区二区三四区| 亚洲国产精品av在线观看| 国产又粗又猛又大爽又黄| 亚洲高清一区二区高清| 亚洲视频偷拍福利来袭| 一本色道久久综合狠狠躁| 人妻少妇系列中文字幕| 亚洲最大的中文字幕在线视频| 日本特黄特色大片免费观看| 日韩欧美精品一区二区三区| 国产精品久久香蕉国产线| 经典欧美熟女激情综合网| 欧美午夜一级艳片免费看| 中文字幕av诱惑一区二区| 国产欧美日韩精品成人专区| 国产精品亚洲综合天堂夜夜| 亚洲第一视频少妇人妻系列| 日韩夫妻午夜性生活视频| 正在播放玩弄漂亮少妇高潮| 日韩欧美国产三级在线观看| 中文字幕人妻日本一区二区| 少妇毛片一区二区三区| 粉嫩内射av一区二区| 亚洲国产性生活高潮免费视频 | 一个人的久久精彩视频| 成年男女午夜久久久精品| 中文字幕亚洲精品在线播放|