代碼重構的一個示例

還記得以前和大家提到過的《各種流行的編程風格》嗎?有一些人問我那些編程風格具體是什麼樣子的。下面是一個代碼重構的實例,讓我們看看那個流行的編程風格是實踐是什麼樣的。下面的這個實踐不是虛構,如有雷同,請對號入座。

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

1
s = 7;

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

1
slots = 7;

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

 

1
2
3
SEVEN = 7;
...
slots = SEVEN;

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

1
2
3
SLOTS_PER_WIDGET = 7;
...
slots = SLOTS_PER_WIDGET;

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

1
2
3
import widgetConstants;
...
slots = widgetConstants.SLOTS_PER_WIDGET;

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

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

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

1
2
3
4
5
6
7
8
9
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,其二、我的程序裏沒有設計模式。(我才知道,編程原來是爲了測試和設計模式,而不是爲了原來的需求),今天,僅以此文獻給鍾愛於那些流行編碼風格的程序員們。

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

1
slots = thisWidget.getSlotCount();

(全文完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章