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