一种常用的重构方式

重构是一个程序员很好的编程习惯。有时候难免写出一些不好看的代码,空闲时候你就可以用重构这种方式来提升代码质量。

比如类似这种模式:

if (! pDev->m_IsInited)  pDev->Init();

这段代码从性能上来说没有什么问题,意思也很明显,如果“已经初始化”标记为false,则调用Init()这个初始化函数做一些动作。

但是代码实际上可以改进的更好,最大的问题是对于pDev的使用者来说,没有必要知道m_IsInited这个变量。我们可以推出第二版:

if (! pDev->IsInited() )  pDev->Init();

这时候类变量被函数调用替换,好处是你可以在IsInited()函数里面做更多的操作,或者把m_IsInited改个名字而不需要去修改每行类似上面的代码。

当然还有一种更简单的方案:

pDev->Init();

而IsInited()判断则放在Init()里面,这时候pDev的使用者更省事,我只要调用就好了,有没有初始化过,那是pDev自己的责任,跟使用者无关。

需要注意的是,Init()此类函数也许会有输入参数,那时候就需要比较复杂代码来保存状态以免出错。另外这个方式主要用于防止Init反复重入,如果某个函数需要反复调用且每次调用结果可能不同,那就不能使用类似手段了。

这属于非常非常基本但也是很常用的一种重构方式,在这里记录一下。

Tags :

Google Reader Yahoo Facebook Twitter Digg FriendFeed Delicious Google Translate
这篇日志发表于2010年06月9日 10:20 下午。 你可以订阅该日志的所有评论通过 RSS 2.0。 你可以发表评论,或者引用通告

2 条回应

评论(2)引用通告(0)

  1. 陌上清溪

    按你这个思路走,要担心别过度重构了。
    比如初始化这个,你先省略了变量,又省略了判断函数,全都放入初始化函数本体。
    但是还可以把初始化函数本体也省略,直接放到功能函数里,执行的开始去判断执行初始化即可了。这样,外界也不需要感知初始化这个动作了。粒度变得越来越大。要注意一个度的问题。

    2010年06月9日 11:31 下午 | #1 @
  2. admin

    我认为,重构的应用时机是代码有一定的成熟度,而不是刚刚开始起步阶段。这时候已经可以看出那些代码有一定的重复或者坏味道,可以着手做重构了。
    当然,这些重构也是一种感觉,比如有些时候用方案一有时候用方案二,只要看上去不是很臭或者有逻辑错误,我常常都是let it go。

    2010年06月10日 12:13 上午 | #2 @

发表评论

(Ctrl+Enter)

XHTML:你可以使用这些标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>