`
kuwoleft
  • 浏览: 1075378 次
文章分类
社区版块
存档分类
最新评论

重构手法之——Extract Method

 
阅读更多

概述

你有一段代码可以被组织在一起并独立出来。将这段代码放进一个独立的函数中,并让函数名称解释该函数的用途。

以后的笔记要多些自己的理解。而不单单是对文中内容的摘要。

动机

适用情况:主要是为了提高可理解性。1 )函数过长; 2 )需要注释才能够理解——这两种情况下可以考虑使用此重构手法。

目标:简短而又有良好命名的函数。

好处:1 )函数复用性好。 2 )高层函数更容易理解(就像读注释一样阅读代码。但是,前提是函数有良好的命名)。 3 覆写更容易(??什么意思,是否是继承的覆写)。

前提条件:函数要有良好的命名,否则,使用此重构手法的效果会打折扣。

如何决定函数的长度:没有标准。 关键在于函数名和函数本体间的语义距离 (好好理解一下)。如果提炼代码可以使函数更清晰,则,即便是函数名比代码长度还长,也无所谓。

作法

这个作法有一个比较困难的地方,就是对局部变量的处理。

1、 构造一个新函数,并且以这个函数的意图命名(以做什么命名,而非怎么做命名)。如果提炼代码能更好的昭示代码意图,即便是一行代码,或这有一个函数调用,你也要提炼它。但如果你没有良好的命名,则不宜轻举妄动。

2、 将源代码拷贝到目标函数,处理因为拷贝代码需要处理的变量。

3、 在原函数中用此目标函数代替。

4、 编译,测试。

局部变量(包括原函数的参数和原函数的临时变量)的处理方法:

1、 只读取其值,可以作为函数参数。

2、 对局部变量赋值:分两种情况:1 )只在被提炼码中使用,则整个提取出来。 2 )如果内外都用通到,则可以让新的函数返回其值。 3 )如果变量在原函数中被复制,则可以作为参数传递进去。

一个函数最好一个返回值。多个返回值可以设定多个函数。

如果临时变量时此重构无法进行,则可以先使用其他的重构手法减少临时变量。

分享到:
评论

相关推荐

    重构——改善既有代码的设计

    某些项目如Extract Method和Move Field看起来可能很浅显,但不要掉以轻心,因为理解这类技术正是有条不紊地进行重构的关键。本书所提的这些重构准则将帮助你一次一小步地修改你的代码,这就减少了过程中的风险。很快...

    《重构改善既有代码的设计(中文版)》(Martin Fowler[美] 著,候捷、熊节 译)

    Martin Fowler和《重构:改善既有代码的设计...某些项目如Extract Method和Move Field看起来可能很浅显,但不要掉以轻心,因为理解这类技术正是有条不紊地进行重构的关键。点击进入该书更多详细信息。 ——《豆瓣读书》

    重构-改善既有代码的设计.chm

    某些项目如Extract Method和Move Field看起来可能很浅显,但不要掉以轻心,因为理解这类技术正是有条不紊地进行重构的关键。本书所提的这些重构准则将帮助你壹次壹小步地修改你的代码,这就减少了过程中的风险。很快...

    重建——改善既有代码的设计

    6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 IntroduceExplainingVariable(引入解释性变量)...

    重构-改善既有代码的设计

    某些项目如Extract Method和Move Field看起来可能很浅显,但不要掉以轻心,因为理解这类技术正是有条不紊地进行重构的关键。本书所提的这些重构准则将帮助你一次一小步地修改你的代码,这就减少了过程中的风险。很快...

    重构-改善既有代码的设计中文版

    某些项目如Extract Method和Move Field看起来可能很浅显,但不要掉以轻心,因为理解这类技术正是有条不紊地进行重构的关键。本书所提的这些重构准则将帮助你一次一小步地修改你的代码,这就减少了过程中的风险。很快...

    《重构改善既有代码的设计(2010年版)》(Martin Fowler[美] 著,熊节 译)

    6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 IntroduceExplainingVariable(引入解释性变量)...

Global site tag (gtag.js) - Google Analytics