code-smell-3-长方法

那些存活的很好并且很长久的面向对象的程序都是那些有着短方法的。


那些刚接触面向对象编程的程序员通常都会感觉从来没有计算发生,面向对象编程总是无穷无尽的一系列的委托。然而当你和这些程序相处几年之后,你会明白所有这些短小的方法是多么有价值。所有这些间接的收益,比如说解释、分享以及选择,都是由这些短小的方法所支撑的。


因为在早期的编程世界,人们就已经意识到一个流程越长那么理解它就会变得越困难。早期的程序语言在调用子程序的时候会有高额的开销,这阻止了人们写出小的方法。现代的面向对象语言已经通过进程内调用相当多的消除了那些高额的开销。但是对于这些代码的阅读者仍然是一笔开销,因为你必须切换上下文来看看它的子流程在做什么,虽然开发环境的限制,你一次也就能看两个方法,这也许会帮助消除这个步骤,但是真正让代码变得更加容易理解的关键点在于被很好命名的小方法。如果你的方法有一个很好的名字,你根本不需要去看它的内部实现。


你应该更加激进的去分解方法。我们遵循的一个启发就是每当我们觉得有必要写下一些注释的时候,我们都用写一个方法来代替。这样一个方法包含了被注释的那段代码,但是它的名字是这段代码的意图而不是它怎么做的。我们可能会对好几行代码这么做也可能对一行代码这么做。甚至这个方法的调用比它替换掉的代码还要长,但是方法的名字会向我们解释这行代码的目的是什么。这里的关键不是方法有多长,而是这个方法做了什么和它怎么做的之间在语义上的差别。


百分之九十的情况下,要把长方法变短你需要做的就是Extract Method。找到这个方法中每一小块儿代码,如果它们分别放在一起会不错,那就分别抽成一个个小方法。


如果你有一个方法有很多的参数以及临时变量,这些元素会成为抽取方法的阻碍。如果你试图使用Extract Method,结果就是你传了很多参数和临时变量作为参数传给了抽取出来的方法,结果比起原来的代码几乎没有更好的可读性。通常你可以使用Replace Temp with Query来消除临时变量。很长的参数列表可以通过Introduce Parameter Object以及Preserve Whole Object来给它瘦身。


如果你已经尝试了前面提到的方法,但是还是有很多临时变量和参数,那就要拿出杀手锏了:Replace Method with Method Object。


那么你是怎么识别出要抽取的一团代码的呢?一个很好的技术就是寻找注释。它们通常标示着这种语义上的距离。如果一块儿代码上有注释,那就是告诉你它做的事情可以被一个方法替代,而它的名字就是基于它的注释。甚至一行代码也是值得抽出来一个新方法的,如果它有需要被解释一下的话。


条件分支和循环也是给出了可以抽取的信号。通过Decompose Conditional来处理条件表达式。对于循环,把循环和它里边的代码抽取进它自己的方法中。


原文链接:https://sourcemaking.com/refactoring/long-method

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值