たとえば、次のコードをリファクタリングすることには意味がありますか?
a = a * 2;
なので:
const int INT_TWO = 2;
// ...
a = a * INT_TWO;
私の質問は、新しい定数が(たとえば、FOOBAR_FACTORと呼ぶのではなく)追加の意味を伝えないという事実に依存しています。
いいえ、これはまったく無意味です。正当な理由なしに、リテラルを名前付き定数に抽出しないでください。
ただし、そのコンテキストでa
値を2倍にする必要がある理由を説明する方法を検討してください。これには以下が含まれます。
問題ドメインの用語を使用して、ダブリングの目的を説明する関数名。例えば:
function exponential_backoff(task, delay):
while task() is not success:
sleep(delay)
delay = delay * 2
倍増の理由を説明するコメント
// The backoff factor should increase the delay between retries.
// A factor of at least two guarantees that the total load stays roughly constant
// when the number of clients launching failing requests increases at a constant rate.
delay = delay * 2
因子の抽出2
が定数または変数である場合は、それが明らかに、そして常に常に2
。
const BACKOFF_FACTOR = 2
delay = delay * BACKOFF_FACTOR
変数や定数に名前を付けることによるリスクは、将来変更される可能性があることです。例えば:
const POINT_EIGHTEEN = 0.20 // actually a VAT rate but can't refactor
const TWO = 3
これは、偶発的に抽出される定数の場合は特に危険であり、コードの異なる部分で異なる意味を持つ可能性があります。一方、一部の定数は完全に固定されており、変更されません。 PI
、KIBIBYTE = 1024
、またはSPACE = ' '
。常識を働かせて、名前に意味のあるものとそうでないものを理解します。
依存
「クォートのパイントの数」などの意味がある場合、はい。 e g。
pints = quarts * PINTS_PER_QUART
それで、本当の質問は、なぜあなたは* 2を掛けているのですか? 2に意味のある名前を指定すると、コードの理解に役立つ場合は、そうする必要があります。