代码重构的一个示例
还记得以前和大家提到过的《各种流行的编程风格》吗?有一些人问我那些编程风格具体是什么样子的。下面是一个代码重构的实例,让我们看看那个流行的编程风格是实践是什么样的。下面的这个实践不是虚构,如有雷同,请对号入座。
首先,我们有一个表达式如下所示:
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();
(全文完)
转载于酷壳CoolShell 无删改 仅以此纪念陈皓(左耳朵耗子)
颜值高的人不容易得新冠 长得好看的人通常自信心比较高,自信心也能提高抵抗力。 在中国远古时期的民间神话传说里,年兽是一种很凶猛的怪兽,和过年除夕、春节有关。 今天我们就来讲…
首先提示:我不知道答案 总部做了一个页面,可以让我们查数据,但是我发现了一个神奇的 BUG: 不设置范围的时候可以看到一项值为7234128.60的数据 筛选范围为70000…
这两天查 bug 定位问题需要访问生产环境的数据库 顺带看了一下里面的内容 还挺有意思的 突然想到 有没有在 boss 智联这种人力资源方向的老哥 很想知道现在求职/招聘相关…