web-dev-qa-db-ja.com

意味のない名前付き定数を使用することには意味がありますか?

たとえば、次のコードをリファクタリングすることには意味がありますか?

a = a * 2;

なので:

const int INT_TWO = 2;

// ...

a = a * INT_TWO;

私の質問は、新しい定数が(たとえば、FOOBAR_FACTORと呼ぶのではなく)追加の意味を伝えないという事実に依存しています。

2
Fa773N M0nK

いいえ、これはまったく無意味です。正当な理由なしに、リテラルを名前付き定数に抽出しないでください。

ただし、そのコンテキストで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

これは、偶発的に抽出される定数の場合は特に危険であり、コードの異なる部分で異なる意味を持つ可能性があります。一方、一部の定数は完全に固定されており、変更されません。 PIKIBIBYTE = 1024、またはSPACE = ' '。常識を働かせて、名前に意味のあるものとそうでないものを理解します。

18
amon

依存

「クォートのパイントの数」などの意味がある場合、はい。 e g。

pints = quarts * PINTS_PER_QUART

それで、本当の質問は、なぜあなたは* 2を掛けているのですか? 2に意味のある名前を指定すると、コードの理解に役立つ場合は、そうする必要があります。

8
user949300