代碼重構的一個示例

作者: 酷殼  發布時間: 2010-10-01 00:11  閱讀: 893 次  推薦: 0   原文鏈接   [收藏]  
摘要:還記得以前和大家提到過的《各種流行的編程風格》嗎?有一些人問我那些編程風格具體是什么樣子的。下面是一個代碼重構的實例,讓我們看看那個流行的編程風格是實踐是什么樣的。下面的這個實踐不是虛構,如有雷同,請對號入座。

  首先,我們有一個表達式如下所示:

 
s = 7;

  很明顯,這個表達式的變量名太沒意義了,很不利于程序的可讀性,所以,我們需要取一個有意義的變量名:

 
slots = 7;

  很好,不過,那個常量7是hard-code或是一個Magic number,而且,這常量沒有名字也不利于代碼的可讀性啊。再改:

 
SEVEN = 7;
...
slots = SEVEN;

 

  靠!上面,是這是哪門子的改法?(不過,我保證這是真實發生的),常量名也要有意義一點嘛,再改:

 
SLOTS_PER_WIDGET = 7;
...
slots
= SLOTS_PER_WIDGET;

  這還差不多,不過,名字可能會重名啊,最好放到一個類中:

 
import widgetConstants;
...
slots
= widgetConstants.SLOTS_PER_WIDGET;

  現在看起來好很多了,不過,即然面向對象了,我們當然要學會使用Design Pattern,比如Factory啊,或是Singleton啊什么的:

 
widgetModelFactory = WidgetModelFactory.getInstance();
widgetModel
= widgetModelFactory.getWidgetModel() ;
slots
= widgetModel.getSlotsPerWidget();

  當然,要是考慮到整體的類結構,上面的那些還不夠,下面是我們最終的重構代碼:(歡迎來到真實的Java世界)

 
context = Context.getCurrentContext();
serviceDirectoryFactory
= ServiceDirectoryFactory.getServiceDirectory(context);
serviceDirectory
= serviceDirectoryFactory.getServiceDirectory(context);
serviceDescriptor
= ServiceDescriptorFactory.getDescriptor("widgetModelFactory");
widgetModelFactoryServiceLocator
= serviceDirectory.getServiceLocator(serviceDescriptor,context);
widgetModelFactory
= (WidgetModelFactory)widgetModelFactoryServiceLocator.findService(context);
widgetModel
= widgetModelFactory.getWidgetModel(context);

slots
= widgetModel.getSlotsPerWidget();

  這就是我們的面像對象的編程模式,記得N年前在面試那家著名的以鼓吹敏捷方法論的公司時,在用程序實現一個程序題的時候,他們對我的程序很不屑一顧,原因有兩個,其一、我沒有使用TDD寫UT Case,其二、我的程序里沒有設計模式。(我才知道,編程原來是為了測試和設計模式,而不是為了原來的需求),今天,僅以此文獻給鐘愛于那些流行編碼風格的程序員們。

  其實,這段代碼也是如下而已罷了。

 
slots = thisWidget.getSlotCount();
0
0
 
標簽:重構
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()