不要太担心性能和内存。您的编译器应该为您处理大部分内容,尤其是对于非常薄的函数。
我的目标通常是确保可以在读者的记忆中完全替换给定的函数调用——开发人员可以纯粹地处理抽象。拿着这个:
// Imagine here that these are real variable/function names as written by a
// lazy coder. I have seen code like this in the wild.
void someFunc(int arg1, int arg2) {
int val3 = doFirstPart(arg1, field1);
int val4 = doSecondPart(arg2, val3);
queue.push(val4);
}
doFirstPart 和 doSecondPart 的重构给你带来的收益很少,而且可能会让事情变得更难理解。但是,这里的问题不是方法提取:问题是糟糕的命名和抽象!您将不得不阅读doFirstPart
,doSecondPart
或者整个功能的重点都丢失了。
考虑一下,而不是:
void pushLatestRateAndValue(int rate, int value) {
int rateIndex = calculateRateIndex(rate, latestRateTable);
int valueIndex = caludateValueIndex(rateIndex, value);
queue.push(valueIndex);
}
在这个人为的例子中,你不必阅读calculateRateIndex
,或者calculateValueIndex
除非你真的想深入挖掘——你只要阅读就知道它做了什么。
除此之外,这可能是个人风格的问题。我知道有些程序员喜欢将每个业务“声明”提取到不同的函数中,但我发现这有点难以阅读。我个人的偏好是寻找机会从任何长于一个“屏幕”(约 25 行)的函数中提取一个函数,这具有使整个函数一次可见的优点,而且因为 25 行发生在我的个人心理上短期记忆的限制和暂时的理解。