3

私はこれについて疑問に思っています。グローバル変数は悪いものであり、コードの保守性、使いやすさ、再利用性などを損なうと聞いています。しかし、この場合、他に何ができますか?つまり、私は「疑似乱数ジェネレータ」(PRNG)を持っており、ご存知のように、新しい乱数が生成されるたびに変化する内部状態が関係しています。しかし、これはグローバルである必要があるようなもののようです!または、RNGクラスの「静的」メンバーですが、これは本質的にグローバルです。そして、グローバルは悪いです!

それで、なにかお手伝いできますか?明らかなことは、このようなものを持っていることです(実際に削除されます):

class RNG {
      private:
          StateType state;              // this is the thing one may be tempted
                                        // to make "static", which ruins the
                                        // whole idea
      public:
          RNG();                        // constructor seeds the RNG
          ~RNG();
          int generateRandomInt();
};

しかし、関数やクラスで乱数が必要になるたびにこのインスタンスを作成する場合は、それをシードする必要があります。タイプ「RNG」の2つのインスタンスが近すぎて作成された場合はどうなるので、クロックの使用は機能しない可能性があります。次に、同じシードを取得し、同じランダムシーケンスを生成します。悪い。

また、1つのマスターRNGオブジェクトを作成し、それをポインターで渡すこともできます(グローバルにするのではなく、正方形1に戻します)。これにより、乱数を必要とするクラスは、その中のRNGオブジェクトへのポインターを取得します。しかし、ディスクとの間でこれらのオブジェクトを保存/ロードするという問題が発生しました。RNGオブジェクトが1つしかないため、インスタンスごとに「RNGを保存」することはできません。代わりに、RNGをロードルーチンに渡す必要があります。これにより、これらのルーチンに、RNGを使用しない他のオブジェクトとは異なる引数リストが与えられる可能性があります。これは、たとえば、ロード/保存できるすべてのものに共通の「保存可能」基本クラスを使用したい場合に問題になります。じゃあ何をすればいいの?一般的な「保存可能」ベースを排除し、ロード/保存ルーチンの作成方法に関する規則を採用するだけです(ただし、そうではありません)。それ自体が悪いですか?オイ!)?

グローバルの保守性に対する敵対的な問題を回避しながら、これらの新しい問題に遭遇しない、これに対する最善の解決策は何ですか?

それとも、ここでグローバルを使用しても大丈夫ですか?結局のところ、「rand()」ビルトインはとにかくそのように機能しますか?しかし、それから私は私の心の後ろに「しかし...しかし、しかし、しかし、グローバルは悪いです!悪い!」と言っているその小さなことを聞​​きます。そして、私が読んだことから、それらを悪いと考えるかなりの理由があるようです。しかし、それらを回避することは、このような新しい種類の困難を生み出すように思われます。たとえば、「goto」を回避するよりもグローバルを回避するのは確かに難しいようです。

4

3 に答える 3

4

あなたの気が進まないことにはいくつかのメリットがあります。たとえば、いくつかのエッジケースを含む決定論的シーケンスを吐き出す、テストの代わりに別のジェネレーターを使用することもできます。

依存性注入は、グローバルを回避するための一般的な方法の1つです。

于 2012-05-18T21:53:15.493 に答える
1

乱数ジェネレーターは、グローバルであっても問題ないものの 1 つです。次のように考えることができます。

- グローバル ファクトリを使用する設計パターンである RandomNumberFactory で、乱数を作成します。もちろん、ファクトリは意味的に一定です (C++ では、「可変」というキーワードを内部で使用することができます。それが何かを意味する場合)。

- グローバル定数 randomNumber への読み取り専用アクセスを提供するグローバル定数 (グローバル定数は問題ありませんよね?)。randomNumber はたまたま非決定論的ですが、もちろんアプリケーションがそれに書き込むことはないという点で一定です。

-さらに、起こりうる最悪の事態は何ですか? マルチスレッド アプリケーションでは、RNG は非決定論的な動作をもたらしますか? あえぎ。@Mark Ransomが上で指摘したように、テストが難しくなるため、実際には欠点です。これが懸念事項である場合は、これを書き出す設計パターンを検討してください。

于 2012-05-18T22:03:41.307 に答える
0

グローバルを使用することが理にかなっている場合があります。コードにグローバル変数を含めるべきではないと断言できる人は誰もいません。

必要のは、グローバル変数から発生する可能性のある問題を認識することです。アプリケーションのロジックにグローバル変数が必要で、マルチスレッド環境から呼び出される可能性がある場合、本質的に問題はありませんが、ロック、ミューテックス、および/またはアトミックな読み取り/書き込みを使用するように注意する必要があります正しい動作を確保するため。

于 2012-05-18T22:06:04.623 に答える