Refresh

This website coolshell.cn/articles/3005.html is currently offline. Cloudflare's Always Online™ shows a snapshot of this web page from the Internet Archive's Wayback Machine. To check for the live version, click Refresh.

代码重构的一个示例

代码重构的一个示例

还记得以前和大家提到过的《各种流行的编程风格》吗?有一些人问我那些编程风格具体是什么样子的。下面是一个代码重构的实例,让我们看看那个流行的编程风格是实践是什么样的。下面的这个实践不是虚构,如有雷同,请对号入座。

首先,我们有一个表达式如下所示:

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 ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (25 人打了分,平均分: 4.04 )
Loading...

代码重构的一个示例》的相关评论

  1. 最近在公司实习,才知道一个人编程和一群人开发的区别…
    这几天我也多少重构过自己的代码以迎合小组的需要,这是很有必要的,个人拙见… 从
    s = 7

    import widgetConstants;

    slots = widgetConstants.SLOTS_PER_WIDGET;
    都是非常有必要的,一个人负责开发widgetConstants(或者大家共同维护这个东西)的话,代码将非常具有易读性…
    但到了后面,我相信“不过,即然面向对象了,我们当然要学会使用Design Pattern,比如Factory啊,或是Singleton啊什么的”这句话仅仅是调侃。也就是说从这里开始到后面都是当笑话讲了… 没必要卖弄自己有多么多么懂得面向对象,这对小组开发是不利的… 重构是为其他开发者提供方便的,而不是让他们抓狂的。

  2. 陈皓 :那一坨代码代码在Java里到处都是,不用动脑也能整出来。另,不叫egg hurt,应该叫egg pain, ;-)

    专业点的应该叫 eggache

  3. 我赞成楼主,你用例子挺好

    让我立马知道 java里运用模式 是怎么回事

    下面的人跟你讨论争论技术上的细节,有点吹毛了

    不可能有完完整整百分百的技术

    希望你保持你的风格 行文方式不要受到影响

    我受教了

  4. 确实,不应该把手段和工具当成了终极目标!不能拿着锤子就满世界都是钉子!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注