グローバル変数を使用することはプログラミング設計が悪いことを読み続けていますが、それはグローバル定数も悪いことを意味しますか?
グローバル変数/定数の代わりにどのような選択肢があり、複数のソースファイルで必要な定数を宣言するための最良の方法は何ですか?
グローバル変数を使用することはプログラミング設計が悪いことを読み続けていますが、それはグローバル定数も悪いことを意味しますか?
グローバル変数/定数の代わりにどのような選択肢があり、複数のソースファイルで必要な定数を宣言するための最良の方法は何ですか?
グローバル変数が悪い背後にある主な理由は、共有状態への依存です。これにより、プログラムのさまざまな部分が、意図しない方法で共有状態を操作することにより、プログラムの他の部分との予期しない干渉を引き起こしやすくなります。よりエラーが発生しやすく、デバッグが難しく、保守が難しいプログラム。
一方、定数は、グローバル名前空間を汚染するという事実を除いて、ほとんど問題ありません(コンパイル時に、コンパイル単位のシンボルの意味を変更することにより、意図しない結果が生じる可能性があります)。特定の名前空間/スコープでそれらを宣言できる場合は、問題ありません。
グローバル変数の本当の問題は、コード内の多くのポイントからの変更を促進することです。何かを行う関数には、グローバル状態を変更するという副作用もあります(実際、関数型プログラミングでは、この落とし穴を回避するための副作用はまったく許可されていません)。
そのプログラミングスタイルは、適切にデバッグおよび保守するのが困難です。
データを変更するための明確に定義されたメカニズムがあるように、データを使用場所の近くに保持します。
グローバル定数は同じ問題に悩まされていません。
グローバル変数は、共有状態に依存する大量の(多くの場合不明な)コードからの実際的な問題につながります。これにより、理解やトレースなどが困難な相互作用が発生する可能性があります。つまり、多くのコードが緊密に結合され、問題が発生することがよくあります。
グローバル定数は、ほとんどの場合(潜在的な)哲学的問題です。それらは一定であるため、グローバル変数からの実際の問題のほとんどは発生しません。同時に、特定の定数が本当にグローバルである必要があるかどうかを疑問視することは完全に合理的です。(たとえば)物理学を扱っている場合、光速をグローバル定数として定義することは理にかなっているかもしれません。フィールドによっては、Pi、eなどがグローバルとしても意味をなします。一方、そのようなものの必要性をより少ないコードに合理的に制限できる場合は、それが一般的に望ましいことです。円周率の値は変わりませんが、
x = area(some_circle);
以下よりも読みやすく、理解しやすい傾向があります。
x = some_circle.radius * some_circle.radius * Pi;