留言与评论(共有 0 条评论) |
发布时间:2020-04-12 08:39:59
1.确定返回点
2.提炼内循环体:Extract Method
3.Replace goto with return
举个例子,再复杂化一下,在外层循环加一点其他操作,不然你的内部用break其实就可以直接让外层continue了。foo封装j的循环,遇到特殊条件返回true,否则返回false。
for i in (0,3){
if(foo(i))continue;
//如果用goto,这里是正常出口
do other;
//如果用goto,这里会有tag来跳过do other
}
这样的好处在于
1.封装了一层循环成一次函数调用,代码结构更清晰,也利于下一步重构。
2.return严格控制了返回点,避免了滥用goto的情况。(看上面的代码你会发现用goto程序流有两个出口)
3.return携带的返回值本身赋予了抽象含义(即内部要求外部进行continue)。
4.这个continue也成为外层循环的工作了,不会出现之前内层直接调用外层的情况。换而言之,内层不需要知道外层的存在,只需要知道自己什么时候返回什么,而对于返回值的逻辑处理则仅由外层进行,也就减少了耦合度。
题外话:
说goto不感觉题主本身的continue就是goto么…只是在重复吧。
留言与评论(共有 0 条评论) |
全站搜索