私はこれについて疑問に思っています。グローバル変数は悪いものであり、コードの保守性、使いやすさ、再利用性などを損なうと聞いています。しかし、この場合、他に何ができますか?つまり、私は「疑似乱数ジェネレータ」(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」を回避するよりもグローバルを回避するのは確かに難しいようです。