亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        設(shè)計(jì)模式:反模式可以如何提高編程

        字號(hào):

        設(shè)計(jì)模式對(duì)軟件開發(fā)來說很重要,這一點(diǎn)從它在技術(shù)貿(mào)易新聞中所占的數(shù)量就可見一斑。不過,鑒于其在開發(fā)過程中的實(shí)用性,設(shè)計(jì)模式只解決了問題的一半。反模式 ― 描述“對(duì)產(chǎn)生絕對(duì)負(fù)面結(jié)果的問題的一種常用解決方案” ― 旨在通過向 Java 程序員展示如何避免常見的 Java 陷阱來解決問題的另一半。
            使用設(shè)計(jì)模式重復(fù)成功策略
            我在觀察周界瀑布上的漂流時(shí),想起了我所了解的事情。從和別人的談話中,我了解到所有成功的漂流都是從第三個(gè)狹縫的右側(cè)過去的,而且我必須快速地沖過急流,以避免碰上瀑布下淺水上面的石塊。這些經(jīng)驗(yàn)增強(qiáng)了我的信心,我不再理會(huì)旋渦的危險(xiǎn),沖進(jìn)了急流的主干道。
            雖然我在這些模式的術(shù)語中并沒有考慮到這一點(diǎn),我還是在使用設(shè)計(jì)模式。我將自己的策略建立在那些在我之前成功地通過急流的漂流者的經(jīng)驗(yàn)之上。設(shè)計(jì)模式給予我信心,使我能夠通過一個(gè)原本超越我技能水平之上的急流。我經(jīng)常將這些相同的原理應(yīng)用到編程和體系結(jié)構(gòu)中;您可以通過觀察一個(gè)策略反復(fù)的成功結(jié)果來學(xué)著解決給定的問題。有了設(shè)計(jì)模式,結(jié)果是肯定的。您可以利用自己的經(jīng)驗(yàn)、觀摩導(dǎo)師,或是從書上學(xué)習(xí)專家是如何做的。
            我們的編程技巧中很多最重要的先進(jìn)之處就是來自于設(shè)計(jì)模式。模型-視圖-控制器(Model-View-Controller)加入收藏模式指導(dǎo)我們有效地分割代碼,在用戶接口和模型之間定義一個(gè)良好的邊界。發(fā)布-訂閱(Publish-Subscribe)設(shè)計(jì)模式指導(dǎo)我們?nèi)绾卧诓粡V播事件的情況下管理它們。其它的設(shè)計(jì)模式對(duì)各種 Java 框架產(chǎn)生了深遠(yuǎn)影響:用于遠(yuǎn)程通信的代理 EJB 接口、集合類、Swing 框架和很多其它框架。
            我非常喜歡構(gòu)建可重復(fù)過程。從這一點(diǎn)來講,設(shè)計(jì)模式可以提供很多好處。設(shè)計(jì)模式強(qiáng)迫您考慮將問題分割成分立的子問題,其中有一些可以利用可重復(fù)解決方案來解決。設(shè)計(jì)模式還強(qiáng)迫您考慮如何正式地表示和傳達(dá)設(shè)計(jì)經(jīng)驗(yàn),從而使其它人可以利用您的成果。
            但是設(shè)計(jì)模式還不是足夠的。如果您將編程問題想象成一個(gè)必須穿過的地區(qū),那么設(shè)計(jì)模式最多只是一張局部地圖。畢竟,如果已經(jīng)存在一個(gè)完美的解決方案可以滿足您的需求,您可能就會(huì)直接去買,而不是自己構(gòu)建了。此外,隨著支持的軟件不斷發(fā)展,基礎(chǔ)結(jié)構(gòu) ― 地圖上已有的道路 ― 也在迅速地改變。局部地圖可以指引您避開某些危險(xiǎn),但不是所有危險(xiǎn)。您將必須在地圖之外的地區(qū)冒險(xiǎn),才能到達(dá)目的地。那么,如果迷失了方向,您會(huì)怎么做呢?
            使用反模式避免落入痛苦的陷阱
            我在急流中調(diào)整方向時(shí),水流將我推向左邊。橡皮艇漂流者必須洞悉高難度急流中的危險(xiǎn)之處,我在這點(diǎn)上完成了要求。我知道在我之前有一些漂流者漂到左邊并翻了船,而且我已經(jīng)考慮過,并在腦海中練習(xí)了解決此問題的方法。經(jīng)過此番準(zhǔn)備,我奮力地劃漿,將橡皮艇恢復(fù)到原來的方向?,F(xiàn)在我有了一步一步戰(zhàn)勝困難的機(jī)會(huì)。
            下面是在反模式中考慮這個(gè)問題的方式:我從一個(gè)很難的問題開始。根據(jù)其它成功的解決方案,我選擇一個(gè)計(jì)劃:我的設(shè)計(jì)模式。我的計(jì)劃出了問題,但我有所準(zhǔn)備,通過在我的急流中分析其它失敗的漂流作出響應(yīng):我在使用反模式。因?yàn)槲矣兴鶞?zhǔn)備,所以看出了問題,并調(diào)整我的方法以回到正途:我在重構(gòu)。在高難度的橡皮艇漂流和編程中,從自己的錯(cuò)誤中學(xué)習(xí)都是很有價(jià)值的,但也很痛苦。我更寧愿從別人的錯(cuò)誤中學(xué)習(xí)。使用這種方法,我就能夠試著解決通常遠(yuǎn)遠(yuǎn)超越我能力范圍的問題了。
            Antipatterns: Refactoring Software, Architectures, and Projects in Crisis一書的作者這樣定義了反模式:
            反模式是描述對(duì)產(chǎn)生絕對(duì)負(fù)面結(jié)果的問題的一種常用解決方案的字面形式。
            這里的關(guān)鍵詞是:
            字面形式:反模式是問題的描述,而不是代碼的描述。這非常重要,因?yàn)槲覀兛梢匝杆俸陀行У貍鬟f消息,而客戶可以迅速地理解。
            常用:如果它不是模式,那它就不是反模式。您必須建立幾個(gè)不同的運(yùn)行較差的行為實(shí)例,是在不同的環(huán)境中,這樣才能使錯(cuò)誤上升到反模式的級(jí)別。
            負(fù)面結(jié)果:設(shè)計(jì)必須有可以觀察的、負(fù)面的效應(yīng)。
            最的反模式 Y2K 向我們展示了這個(gè)激動(dòng)人心的新領(lǐng)域的危機(jī)和出路?;叵肫鹨郧埃汕先f的開發(fā)者將日期編碼成兩位數(shù)字而不是四位數(shù)字,錯(cuò)誤地比較這些數(shù)字就會(huì)導(dǎo)致數(shù)以萬計(jì)的錯(cuò)誤。很多杰出的研究者都預(yù)言這個(gè)問題將會(huì)泛濫成災(zāi),但是經(jīng)過人們對(duì)問題的深入研究,新的標(biāo)識(shí)和重構(gòu)技術(shù)已經(jīng)很有效地修正了代碼,以至于很少有人會(huì)碰到預(yù)言中那么多的問題。反模式類似于設(shè)計(jì)模式,是重復(fù)使用的解決方案。區(qū)別在于反模式有負(fù)面結(jié)果。當(dāng)您為反模式做文檔時(shí),您將希望獲取至少下面這些元素:
            名稱:有時(shí)候反模式可能已經(jīng)有一個(gè)或多個(gè)非正式的名稱,這是由開發(fā)社區(qū)給出的。其它情況下,您就會(huì)希望自己選擇一個(gè)名稱。這個(gè)名稱應(yīng)該具有描述性,而且要簡單。
            問題:問題描述了反模式有缺陷的解決方案,以及驅(qū)使開發(fā)者走向有缺陷的解決方案的推動(dòng)因素。這個(gè)描述指導(dǎo)其他人如何找到問題。
            重構(gòu)的解決方案:反模式有用的范圍是:可以幫助我們從陷阱中解脫出來,或者完全避免這些陷阱。重構(gòu)的解決方案是指導(dǎo)其它人如何修正問題的指南。
            其它成功使用反模式的行業(yè)
            很多其它行業(yè) ― 最值得注意的是制造業(yè) ― 使用某種形式的反模式,通常都是與設(shè)計(jì)模式相結(jié)合使用。當(dāng)前的制造業(yè)者不遺余力地效仿其它同行成功的過程改進(jìn)。例如即時(shí)(Just-in-Time)“設(shè)計(jì)模式”。即時(shí)制造是一種過程,它允許用減少庫存和快速修正來解決質(zhì)量問題,從而提高質(zhì)量。過程中每個(gè)連續(xù)的步驟都使用由前一步即時(shí)遞交的裝配件。所有主要的汽車制造業(yè)者現(xiàn)在都使用這種技術(shù)。制造業(yè)者還采用了其它設(shè)計(jì)模式進(jìn)行裝配組織、測試以及數(shù)據(jù)收集。的制造業(yè)者并沒有在這里停滯不前。他們還認(rèn)識(shí)到對(duì)發(fā)現(xiàn)系統(tǒng)過程故障的需求。類似于 Zero Defects 和 Quality Circles 這樣的程序讓車間中的藍(lán)領(lǐng)工人周期性地花一點(diǎn)時(shí)間討論系統(tǒng)過程問題,以及如何盡可能地防止問題出現(xiàn)。一般的程序都能夠?yàn)楣椭鞴?jié)省大量維護(hù)所需的時(shí)間。行業(yè)中反模式的其它示例還包括:
            保健行業(yè),研究者在這里查找和發(fā)布不良的飲食習(xí)慣,然后好的醫(yī)生會(huì)使用這些信息來指導(dǎo)病人如何改變引起疾病的根源,而不僅僅是癥狀。
            法律執(zhí)行,警官在這里與社區(qū)合作,確定和預(yù)防治安不良地區(qū)中的犯罪根源。這些程序可以顯著地減少毒品服用和暴力犯罪的情況。
            出版行業(yè),經(jīng)過十多年對(duì)作者的忽略之后,最成功的出版商再次與作者以緊密地伙伴關(guān)系相互合作。這種伙伴關(guān)系有助于作者確定和改正不良寫作習(xí)慣,從而寫出更好的書。最成功的技術(shù)讀物出版商就使用這種方法,而其它出版商正在效仿。
            Java 語言中反模式的示例
            如果反模式在其它行業(yè)中都很成功的話,那么程序員能不能也從中受益呢?我相信程序員能得到的還不止這么多。作為程序員,您如果想成功,只需要快速地識(shí)別出常見的陷阱就可以了。軟件開發(fā)所使用的是一套難以置信的相反的工具、語言、方法和策略。讓我們回頭想想地圖的類推。不同情況下的問題稍有不同。您需要具有歸納知識(shí)并將其轉(zhuǎn)用到其它情況的能力,這樣才能成功。設(shè)計(jì)模式傾向于定位在特定問題域上,而反模式就可以更具普遍性。實(shí)際上,您可能犯的很多錯(cuò)誤以前就已經(jīng)存在了。反模式有助于幫您在開發(fā)周期的早期識(shí)別出更多此類錯(cuò)誤。如果您和多數(shù)程序員一樣,那么花一點(diǎn)時(shí)間去理解當(dāng)前環(huán)境中的陷阱可以為您節(jié)省大量時(shí)間和工作。Java 語言的發(fā)展向我們展示了很多有關(guān)錯(cuò)誤的示例,這些錯(cuò)誤是我們從其它編程的發(fā)展中借鑒的。
            早期的 EJB 實(shí)體 bean 實(shí)現(xiàn)慢如蝸牛,一部分原因是通信開銷過于高昂。經(jīng)過一段時(shí)間之后,人們開始認(rèn)識(shí)到其中一個(gè)顯著問題是往返旅程。我們最終學(xué)會(huì)了使用類似于虛包的修正方法來重構(gòu)這些解決方案。其它開發(fā)者在 EJB 組件問世很久之前就碰到了這個(gè)問題。早期個(gè)人電腦上的數(shù)據(jù)庫一直為性能問題所困擾,直到管理員學(xué)會(huì)了使用存儲(chǔ) target=_blank>存儲(chǔ)過程將多個(gè)數(shù)據(jù)庫通信鞏固為一體。早期的分布式系統(tǒng)開發(fā)者也發(fā)現(xiàn)了相同的問題,然后發(fā)布了虛包解決方案。
            常見的 Java 反模式的另一個(gè)示例是魔法 Servlet。這個(gè)非?;A(chǔ)的反模式困擾了很多相對(duì)高級(jí)的客戶。在這個(gè)反模式中,一個(gè)單獨(dú)的 servlet 將處理視圖、模型以及控制器邏輯。這樣的設(shè)計(jì)使得維護(hù)幾乎不可能實(shí)現(xiàn),因?yàn)闊o論視圖何時(shí)改變,您都必須改變模型邏輯,反之亦然。魔法 Servlet 也有比 Java 語言更早的淵源。此問題最常見的示例其實(shí)發(fā)生在 Visual Basic 中,程序員在 Visual Basic 中經(jīng)常會(huì)向一個(gè)單獨(dú)的控件(如按鈕)附加 10K 大小的腳本。
            這些問題只是涉及到表面。在每個(gè)新的領(lǐng)域中,Java 開發(fā)者都會(huì)重新發(fā)現(xiàn)一些舊的錯(cuò)誤,而這些錯(cuò)誤具有某種規(guī)律性。如果我們抱著掃清障礙的目的研究這些陷阱,就一定會(huì)免受一些痛苦。
            使用反模式過程
            希望我已經(jīng)使您相信反模式是值得注意的。那么要將反模式與您每天的例行工作相結(jié)合,您又可以做些什么呢?它可以幫助您識(shí)別和解決反模式。我在 Bitter Java一書中(請參考 參考資料)更詳細(xì)地討論了這些問題。
            識(shí)別問題。在 Java 編程中,問題可能是錯(cuò)誤、性能問題、難于維護(hù)的類,或是不斷增大的內(nèi)存占用量。
            建立模式。如果您是一名軟件工程專業(yè)的學(xué)生,那么您就會(huì)知道,隨著您不斷深入開發(fā)周期,修正一個(gè)錯(cuò)誤的開銷將呈指數(shù)上升。當(dāng)您建立問題的模式時(shí),您就給了自己在開發(fā)周期的更早階段識(shí)別和修正更多問題的機(jī)會(huì),您的獲得也將數(shù)以倍計(jì)。使這個(gè)價(jià)值鏈向上移動(dòng)的關(guān)鍵就在于建立模式,然后盡可能廣泛地根據(jù)反模式操作。
            重構(gòu)代碼。在這一步中,您將重構(gòu)導(dǎo)致問題的代碼。這一步是一個(gè)簡單的錯(cuò)誤修正,它適用于您迄今為止識(shí)別出的所有問題實(shí)例。您應(yīng)該花時(shí)間去做一個(gè)完整的修正,而不是僅僅打一個(gè)補(bǔ)丁了事,如果錯(cuò)誤可能會(huì)出現(xiàn)在同一位置,您還應(yīng)該添加文檔。您還會(huì)希望對(duì)各個(gè)步驟作出文檔,從而將解決方案分發(fā)給其它人。
            宣傳解決方案。您在這里確保碰到問題的其它人懂得如何修正問題,并確??赡芘龅较葳宓钠渌酥酪荛_它。發(fā)布反模式可以更廣泛地傳播反模式的好處。
            修正過程。您在這里構(gòu)建一個(gè)隔開反模式保護(hù)性的屏障。修正可以采用很多不同的方式。改進(jìn)測試案例可以快速地識(shí)別衰退。修正每日過程或通信渠道可以在問題發(fā)生之前預(yù)防它們。補(bǔ)充編碼標(biāo)準(zhǔn)幾乎能夠消除某些類型的編碼錯(cuò)誤,如關(guān)于放置花括號(hào)或注釋的錯(cuò)誤。
            這些步驟采用的方法是從特定到一般。您找到錯(cuò)誤,然后建立模式、修正錯(cuò)誤,最后修正過程。將其中某些步驟與您的日常例行工作相結(jié)合可以使您成為更好的程序員。但是,請不要在這里停下來。請利用您的反模式知識(shí)來修正過程,繼續(xù)使價(jià)值鏈向上移動(dòng),并讓您整個(gè)公司的程序員都變得更棒。您還可以發(fā)布反模式幫助您甚至不認(rèn)識(shí)的程序員。如果您是一名程序員,并且是設(shè)計(jì)模式的愛好者,我保證您會(huì)發(fā)現(xiàn)反模式能夠提供的不止這些。