5

グローバル変数は良くないので、できる限り避けるべきであることはわかっています。ただし、たとえば MPI を使用して並列プログラムを作成する場合、一部の変数は一度だけ初期化され、変更されることはありません (このタスクの数、タスクの総数など)。これらの変数をグローバルとして使用することは、依然として悪い習慣と見なされていますか? これらの変数には常にアクセスする必要があるため、main でそれらのクラスを作成し、プログラム内のすべての関数の 99% にそのポインターを渡すのはばかげているように思えます。これまでの私のアプローチは、それらを名前空間 mpi_glob に隠すことでした (C++ の場合、それらを C の構造体に入れて名前空間をエミュレートする必要はないと思います)。単位系など、一度だけ設定される他の変数にも問題があると思います。

4

3 に答える 3

5

グローバル変数が「良くない」理由は、識別と追跡が困難な個別のソース ファイル間の結合を導入するためです。特に、グローバル変数がプログラムのある時点で予期しない状態になった場合、どこで変更されたかを把握するのが難しくなる可能性があります。

グローバル変数を、プログラム内のすべての関数への参照によって渡されるローカル変数に置き換えても、その問題は解消されません。設計用語でいうと、これは「トランプ データ」、つまり、必要のない場所でもさまよっているデータです。

ここでのポイントは、あなたが示唆するように、一度初期化されて変更されていないデータには、グローバル変数を「悪い」ものにする問題がないということです。問題が存在しないため、解決策は必要ありません。

于 2012-08-14T12:06:32.823 に答える
0

シングルトンは、より適切に管理するのに役立つはずなので、ポインターを渡す必要はありません。実際にmpi_globは、同じことを行いますが、Singletonより慣れた方法です。

あるいは、グローバル変数に頼ることもできます - それ自体は悪くありません。1 回限りの割り当てを強調したい場合は、それらを宣言しconst、次のように静的初期化子を介して設定できます。

const int number_of_tasks = get_preconfigured_number_of_tasks();

enumグローバル変数がコンパイル時の定数を保持するために使用されている場合は、それらをメンバーまたはプリプロセッサ定義に置き換えても問題ありません。そうすることで、メモリアクセスなしで即値をその場で使用できるため、コンパイラの負荷が軽減されます。


クレジットは、コメントでシングルトンの問題を指摘したピート・ベッカーに贈られます。これらの問題も気になる場合は、まったく異なるアプローチを取ることができます。

Java プログラムの実装方法を覚えていますか? メイン メソッドを持つメイン クラスがあり、すべてのプログラムの作業はそのメイン メソッド内から実行されます。Main は依然としてメンバー関数です。つまり、メイン クラスのいくつかのプライベート フィールドに排他的にアクセスできます (Java の場合、それらは静的である必要がありますが、これはここでの要点ではありません)。

この概念をCommandのような実装にさらに拡張できます。従来の Java との違いは、同等のメイン メソッドが静的ではなく、含まれるプログラムに固有の値を持つグローバル変数が非静的メンバー変数であることです。グローバル状態データへのアクセスが必要なすべての関数は、メンバー関数に変換されます。これは、main メソッドもメンバー関数であるため可能です。

このようにして、より優れたカプセル化とデータの安全性を実現できると思います。

于 2012-08-14T12:11:54.337 に答える
0

崖を越えて従うべき規則はありません。詳細は、作成しているプログラムの種類に完全に依存します。

あなたのプログラムが比較的小さい場合 (または、あなただけがプログラムを作成/保守している場合) は、「グローバル」変数を特別な名前空間に残してもおそらく問題ありません。少なくともそうすれば、どこかのローカルスコープで誤ってそれらをシャドウしたり踏みつけたりする可能性は低くなります。ただし、次のようなことをしていないと仮定しています。

using namespace mpi_glob;

これは、グローバルをファイルのどこかに置くこととほとんど変わらず、それらをあまり保護しません。

グローバル変数を使用することでプログラムがより明確で理解しやすくなる場合は、それらを使用してください。それらをローカルに保持できる場合は、ローカルに保持してください。通常、長期的にはメンテナンスが簡単になるからです。

于 2012-08-14T12:03:32.340 に答える