1

このトピックに関するいくつかのSOスレッドを読んだ後、グローバル変数/シングルトンが悪い理由を思いついた。

  1. グローバル状態の関数を理解することはますます難しくなり、コードが大きくなるにつれて、ますます多くの関数がそのグローバル状態を変更します。
  2. ユニットテストが難しくなります。
  3. 依存関係を非表示にします。
  4. グローバル変数が実際には単一のオブジェクト/変数ではないことがいつか判明した場合は、コードを書き直す必要があります。

C ++でゲームを作りたいのですが、ゲーム内の世界の風景をハイトマップとして表す「ハイトマップオブジェクト」があります。このハイトマップ変更される可能性があります。グローバルオブジェクトを使用したい。(このハイトマップオブジェクトを参照する他の静的変数がないため、静的初期化順序の問題が発生することはないと思います)。

上記の理由により、グローバル状態が悪く、グローバル可変状態がさらに悪いことがわかりました。しかし、別の方法を実行するのは本当に本当に面倒なようです。main()スコープでハイトマップオブジェクトを作成し、そのハイトマップオブジェクトをそれを使用するすべての関数に渡します。

アプリケーションにハイトマップが1つしかないことを100%確信している場合はどうなりますか?また、これは小さなソロプロジェクトなので、各機能がグローバルな状態に対して何をしているのかを理解できると確信しています。そして、この場合のグローバル変数の使用が単体テストにどのように影響するかはわかりません。globalHeightmap = generateMockHeightmap();モックハイトマップを使用したい場合、テストしたい関数を呼び出す前に使用できませんか?

4

1 に答える 1

1

現在のプロジェクトの特徴については確かですが、将来的には、このグローバル変数に依存するコードを変更する必要があることはほぼ間違いありません。その時点で、グローバル変数が戻ってきて、状態が非表示になっていないため、必要な変更を理解するのが難しくなる可能性があります(たとえば、状態を読み取る代わりに誤って状態を変更した場合は、プログラム全体が影響を受けます)将来のあるランダムな時点で)。状態の変化点を最小限に抑えることがプログラムの保守とデバッグにとってどれほど重要であるかを誇張することはできません。グローバル変数は、その目標とは正反対です。

単体テストのグローバル状態マップをオーバーライドするだけでは、壊れやすいようです。古い状態を復元する必要がある場合、またはテストで状態間で変更する必要がある場合はどうなりますか?次に、一連の保存/設定/復元コードが表示されます。

アプリケーションにスレッドモデルを追加したい場合はどうなりますか?グローバル状態を使用すると、その移行がはるかに複雑になります。

1年後、他の誰かがプロジェクトを手伝ってくれたらどうしますか?彼らはコードを理解することができますか?1年後に理解できるでしょか(私は常に明白なコードを書いてコメントを追加しようとしていることを知っています。それは、私が1年後に戻ってきて、メカニズムについてのことを覚えていない可能性があるためです。 )。

最後に、非グローバル変数アプローチがあまりにも多くの作業または複雑すぎるように思われる場合、それはおそらくあなたの代替アプローチがあまりにも複雑であるか、別のアイデア/やり直しが必要であることを意味します。適切な高レベルのゲームオブジェクトで作成され、必要に応じて低レベルのオブジェクトに渡されたり保存されたりするオブジェクトにハイトマップを格納できない理由はありません。

于 2012-07-08T05:03:26.120 に答える