程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 反模式可以如何提高編程

反模式可以如何提高編程

編輯:關於JAVA

設計模式對軟件開發來說很重要,這一點從它在技術貿易新聞中所占的數量就可見一斑。不過,鑒於其在開發過程中的實用性,設計模式只解決了問題的一半。反模式 ― 描述“對產生絕對負面結果的問題的一種常用解決方案” ― 旨在通過向 Java 程序員展示如何避免常見的 Java 陷阱來解決問題的另一半。

  使用設計模式重復成功策略

  我在觀察周界瀑布上的漂流時,想起了我所了解的事情。從和別人的談話中,我了解到所有成功的漂流都是從第三個狹縫的右側過去的,而且我必須快速地沖過急流,以避免碰上瀑布下淺水上面的石塊。這些經驗增強了我的信心,我不再理會旋渦的危險,沖進了急流的主干道。

  雖然我在這些模式的術語中並沒有考慮到這一點,我還是在使用設計模式。我將自己的策略建立在那些在我之前成功地通過急流的漂流者的經驗之上。設計模式給予我信心,使我能夠通過一個原本超越我技能水平之上的急流。我經常將這些相同的原理應用到編程和體系結構中;您可以通過觀察一個策略反復的成功結果來學著解決給定的問題。有了設計模式,結果是肯定的。您可以利用自己的經驗、觀摩導師,或是從書上學習專家是如何做的。

  我們的編程技巧中很多最重要的先進之處就是來自於設計模式。模型-視圖-控制器(Model-VIEw-Controller)模式指導我們有效地分割代碼,在用戶接口和模型之間定義一個良好的邊界。發布-訂閱(Publish-Subscribe)設計模式指導我們如何在不廣播事件的情況下管理它們。其它的設計模式對各種 Java 框架產生了深遠影響:用於遠程通信的代理 EJB 接口、集合類、Swing 框架和很多其它框架。

  我非常喜歡構建可重復過程。從這一點來講,設計模式可以提供很多好處。設計模式強迫您考慮將問題分割成分立的子問題,其中有一些可以利用可重復解決方案來解決。設計模式還強迫您考慮如何正式地表示和傳達設計經驗,從而使其它人可以利用您的成果。

  但是設計模式還不是足夠的。如果您將編程問題想象成一個必須穿過的地區,那麼設計模式最多只是一張局部地圖。畢竟,如果已經存在一個完美的解決方案可以滿足您的需求,您可能就會直接去買,而不是自己構建了。此外,隨著支持的軟件不斷發展,基礎結構 ― 地圖上已有的道路 ― 也在迅速地改變。局部地圖可以指引您避開某些危險,但不是所有危險。您將必須在地圖之外的地區冒險,才能到達目的地。那麼,如果迷失了方向,您會怎麼做呢?

  使用反模式避免落入痛苦的陷阱

  我在急流中調整方向時,水流將我推向左邊。橡皮艇漂流者必須洞悉高難度急流中的危險之處,我在這點上完成了要求。我知道在我之前有一些漂流者漂到左邊並翻了船,而且我已經考慮過,並在腦海中練習了解決此問題的方法。經過此番准備,我奮力地劃漿,將橡皮艇恢復到原來的方向。現在我有了一步一步戰勝困難的機會。

  下面是在反模式中考慮這個問題的方式:我從一個很難的問題開始。根據其它成功的解決方案,我選擇一個計劃:我的設計模式。我的計劃出了問題,但我有所准備,通過在我的急流中分析其它失敗的漂流作出響應:我在使用反模式。因為我有所准備,所以看出了問題,並調整我的方法以回到正途:我在重構。在高難度的橡皮艇漂流和編程中,從自己的錯誤中學習都是很有價值的,但也很痛苦。我更寧願從別人的錯誤中學習。使用這種方法,我就能夠試著解決通常遠遠超越我能力范圍的問題了。

  Antipatterns: Refactoring Software, Architectures, and Projects in Crisis一書的作者這樣定義了反模式:

  反模式是描述對產生絕對負面結果的問題的一種常用解決方案的字面形式。

  這裡的關鍵詞是:

  字面形式:反模式是問題的描述,而不是代碼的描述。這非常重要,因為我們可以迅速和有效地傳遞消息,而客戶可以迅速地理解。

  常用:如果它不是模式,那它就不是反模式。您必須建立幾個不同的運行較差的行為實例,最好是在不同的環境中,這樣才能使錯誤上升到反模式的級別。

  負面結果:設計必須有可以觀察的、負面的效應。

  最著名的反模式 Y2K 向我們展示了這個激動人心的新領域的危機和出路。回想起以前,成千上萬的開發者將日期編碼成兩位數字而不是四位數字,錯誤地比較這些數字就會導致數以萬計的錯誤。很多傑出的研究者都預言這個問題將會泛濫成災,但是經過人們對問題的深入研究,新的標識和重構技術已經很有效地修正了代碼,以至於很少有人會碰到預言中那麼多的問題。反模式類似於設計模式,是重復使用的解決方案。區別在於反模式有負面結果。當您為反模式做文檔時,您將希望獲取至少下面這些元素:

  名稱:有時候反模式可能已經有一個或多個非正式的名稱,這是由開發社區給出的。其它情況下,您就會希望自己選擇一個名稱。這個名稱應該具有描述性,而且要簡單。

  問題:問題描述了反模式有缺陷的解決方案,以及驅使開發者走向有缺陷的解決方案的推動因素。這個描述指導其他人如何找到問題。

  重構的解決方案:反模式有用的范圍是:可以幫助我們從陷阱中解脫出來,或者完全避免這些陷阱。重構的解決方案是指導其它人如何修正問題的指南。

  其它成功使用反模式的行業

  很多其它行業 ― 最值得注意的是制造業 ― 使用某種形式的反模式,通常都是與設計模式相結合使用。當前的制造業者不遺余力地效仿其它同行成功的過程改進。例如即時(Just-in-Time)“設計模式”。即時制造是一種過程,它允許用減少庫存和快速修正來解決質量問題,從而提高質量。過程中每個連續的步驟都使用由前一步即時遞交的裝配件。所有主要的汽車制造業者現在都使用這種技術。制造業者還采用了其它設計模式進行裝配組織、測試以及數據收集。最好的制造業者並沒有在這裡停滯不前。他們還認識到對發現系統過程故障的需求。類似於 Zero Defects 和 Quality Circles 這樣的程序讓車間中的藍領工人周期性地花一點時間討論系統過程問題,以及如何盡可能地防止問題出現。一般的程序都能夠為雇主節省大量維護所需的時間。行業中反模式的其它示例還包括:

  保健行業,研究者在這裡查找和發布不良的飲食習慣,然後好的醫生會使用這些信息來指導病人如何改變引起疾病的根源,而不僅僅是症狀。

  法律執行,警官在這裡與社區合作,確定和預防治安不良地區中的犯罪根源。這些程序可以顯著地減少毒品服用和暴力犯罪的情況。

  出版行業,經過十多年對作者的忽略之後,最成功的出版商再次與作者以緊密地伙伴關系相互合作。這種伙伴關系有助於作者確定和改正不良寫作習慣,從而寫出更好的書。最成功的技術讀物出版商就使用這種方法,而其它出版商正在效仿。

Java 語言中反模式的示例

  如果反模式在其它行業中都很成功的話,那麼程序員能不能也從中受益呢?我相信程序員能得到的還不止這麼多。作為程序員,您如果想成功,只需要快速地識別出常見的陷阱就可以了。軟件開發所使用的是一套難以置信的相反的工具、語言、方法和策略。讓我們回頭想想地圖的類推。不同情況下的問題稍有不同。您需要具有歸納知識並將其轉用到其它情況的能力,這樣才能成功。設計模式傾向於定位在特定問題域上,而反模式就可以更具普遍性。實際上,您可能犯的很多錯誤以前就已經存在了。反模式有助於幫您在開發周期的早期識別出更多此類錯誤。如果您和多數程序員一樣,那麼花一點時間去理解當前環境中的陷阱可以為您節省大量時間和工作。Java 語言的發展向我們展示了很多有關錯誤的示例,這些錯誤是我們從其它編程的發展中借鑒的。

  早期的 EJB 實體 bean 實現慢如蝸牛,一部分原因是通信開銷過於高昂。 經過一段時間之後,人們開始認識到其中一個顯著問題是往返旅程。我們最終學會了使用類似於虛包的修正方法來重構這些解決方案。其它開發者在 EJB 組件問世很久之前就碰到了這個問題。早期個人電腦上的數據庫一直為性能問題所困擾,直到管理員學會了使用存儲  href="http://storage.it168.com/" target=_blank>存儲過程將多個數據庫通信鞏固為一體。早期的分布式系統開發者也發現了相同的問題,然後發布了虛包解決方案。

  常見的 Java 反模式的另一個示例是魔法 Servlet。這個非常基礎的反模式困擾了很多相對高級的客戶。在這個反模式中,一個單獨的 servlet 將處理視圖、模型以及控制器邏輯。這樣的設計使得維護幾乎不可能實現,因為無論視圖何時改變,您都必須改變模型邏輯,反之亦然。魔法 Servlet 也有比 Java 語言更早的淵源。此問題最常見的示例其實發生在 Visual Basic 中,程序員在 Visual Basic 中經常會向一個單獨的控件(如按鈕)附加 10K 大小的腳本。

  這些問題只是涉及到表面。在每個新的領域中,Java 開發者都會重新發現一些舊的錯誤,而這些錯誤具有某種規律性。如果我們抱著掃清障礙的目的研究這些陷阱,就一定會免受一些痛苦。

  使用反模式過程

  希望我已經使您相信反模式是值得注意的。那麼要將反模式與您每天的例行工作相結合,您又可以做些什麼呢?圖 1 展示了一個過程的大體步驟,它可以幫助您識別和解決反模式。我在 Bitter Java一書中(請參考 參考資料)更詳細地討論了這些問題。

  圖 1. 一個基本的反模式過程中的步驟

  

  識別問題。在 Java 編程中,問題可能是錯誤、性能問題、難於維護的類,或是不斷增大的內存占用量。

  建立模式。如果您是一名軟件工程專業的學生,那麼您就會知道,隨著您不斷深入開發周期,修正一個錯誤的開銷將呈指數上升。當您建立問題的模式時,您就給了自己在開發周期的更早階段識別和修正更多問題的機會,您的獲得也將數以倍計。使這個價值鏈向上移動的關鍵就在於建立模式,然後盡可能廣泛地根據反模式操作。

  重構代碼。在這一步中,您將重構導致問題的代碼。這一步是一個簡單的錯誤修正,它適用於您迄今為止識別出的所有問題實例。您應該花時間去做一個完整的修正,而不是僅僅打一個補丁了事,如果錯誤可能會出現在同一位置,您還應該添加文檔。您還會希望對各個步驟作出文檔,從而將解決方案分發給其它人。

  宣傳解決方案。您在這裡確保碰到問題的其它人懂得如何修正問題,並確保可能碰到陷阱的其它人知道要避開它。發布反模式可以更廣泛地傳播反模式的好處。

  修正過程。您在這裡構建一個隔開反模式保護性的屏障。修正可以采用很多不同的方式。改進測試案例可以快速地識別衰退。修正每日過程或通信渠道可以在問題發生之前預防它們。補充編碼標准幾乎能夠消除某些類型的編碼錯誤,如關於放置花括號或注釋的錯誤。

  這些步驟采用的方法是從特定到一般。您找到錯誤,然後建立模式、修正錯誤,最後修正過程。將其中某些步驟與您的日常例行工作相結合可以使您成為更好的程序員。但是,請不要在這裡停下來。請利用您的反模式知識來修正過程,繼續使價值鏈向上移動,並讓您整個公司的程序員都變得更棒。您還可以發布反模式幫助您甚至不認識的程序員。如果您是一名程序員,並且是設計模式的愛好者,我保證您會發現反模式能夠提供的不止這些。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved