還記得以前和大家提到過的《各種流行的編程風格》嗎?有一些人問我那些編程風格具體是什麼樣子的。下面是一個代碼重構的實例,讓我們看看那個流行的編程風格是實踐是什麼樣的。下面的這個實踐不是虛構,如有雷同,請對號入座。
首先,我們有一個表達式如下所示:
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(); |
(全文完)