代碼重構的一個示例
摘要:還記得以前和大家提到過的《各種流行的編程風格》嗎?有一些人問我那些編程風格具體是什么樣子的。下面是一個代碼重構的實例,讓我們看看那個流行的編程風格是實踐是什么樣的。下面的這個實踐不是虛構,如有雷同,請對號入座。
首先,我們有一個表達式如下所示:
s = 7;
很明顯,這個表達式的變量名太沒意義了,很不利于程序的可讀性,所以,我們需要取一個有意義的變量名:
slots = 7;
很好,不過,那個常量7是hard-code或是一個Magic number,而且,這常量沒有名字也不利于代碼的可讀性啊。再改:
SEVEN = 7;
...
slots = SEVEN;
...
slots = SEVEN;
靠!上面,是這是哪門子的改法?(不過,我保證這是真實發生的),常量名也要有意義一點嘛,再改:
SLOTS_PER_WIDGET = 7;
...
slots = SLOTS_PER_WIDGET;
...
slots = SLOTS_PER_WIDGET;
這還差不多,不過,名字可能會重名啊,最好放到一個類中:
import widgetConstants;
...
slots = widgetConstants.SLOTS_PER_WIDGET;
...
slots = widgetConstants.SLOTS_PER_WIDGET;
現在看起來好很多了,不過,即然面向對象了,我們當然要學會使用Design Pattern,比如Factory啊,或是Singleton啊什么的:
widgetModelFactory = WidgetModelFactory.getInstance();
widgetModel = widgetModelFactory.getWidgetModel() ;
slots = widgetModel.getSlotsPerWidget();
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();
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();
全站熱搜