一种常用的重构方式

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

比如类似这种模式:

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反复重入,如果某个函数需要反复调用且每次调用结果可能不同,那就不能使用类似手段了。

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

《一种常用的重构方式》有2个想法

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

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

发表评论