パフォーマンスとメモリについてあまり心配する必要はありません。特に非常に薄い関数の場合は、コンパイラがその大部分を処理する必要があります。
私の目標は、通常、特定の関数呼び出しを読者のメモリ内で完全に置き換えることができるようにすることです。つまり、開発者は抽象化を純粋に扱うことができます。これを取る:
// 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 行) よりも長い任意の関数から関数を抽出する機会を探すことです。短期記憶と一時的な理解の限界。