none
全画面で参照する変数をグローバル変数にすることはよくない? RRS feed

  • 質問

  • 現在開発中のシステムで、
    全画面で参照する従業員の情報(名前やIDなどの情報)があります。

    プログラムを起動して最初に開くログイン画面でログインが成功したら、
    従業員の情報をもった従業員クラスのインスタンスを生成し、全画面から参照できるようにグローバル変数にしようかなと思っています。
    一つ注意点があり、従業員情報を変更する画面があり、その画面では参照だけではなく、更新も行われます。

    あちこちの情報を覗いてみたのですが、グローバル変数は利用すべきではないという意見が主であったように思います。
    このような場合、やはりグローバル変数を利用せず新しいフォームを開くたびに引数として受け渡すようなプログラミングをすべきなのでしょうか?
    2010年1月4日 7:53

回答

  • システム規模や開発者のスキルやシステム寿命などにより状況は変わるかもしませんが、自分だったら、グローバル変数にせずに、そのインスタンス変数をパラメタで持ち回りします。


    http://blogs.wankuma.com/hatsune/
    2010年1月4日 11:12

  • あちこちの情報を覗いてみたのですが、グローバル変数は利用すべきではないという意見が主であったように思います。
    グローバル変数は一般的に嫌われますが、使ってはいけないものだとは思いません。例えばThread.CurrentPrincipalプロパティなど、.NET Frameworkに最初から提供されているものもあります。また、ASP.NETのSession変数もグローバル変数の一種でしょう。

    グローバル変数が嫌われる最大の理由は、どのクラスがどのタイミングでグローバル変数を更新するかわかりずらいという見通しの悪さだと思います。見通しの悪さはやっかいなバグの原因になります。しかし、更新するクラスを限定するなどの工夫により、見通しの悪さは軽減されます。例えば、更新はインターフェース経由のみに限定するなどです。


    このような場合、やはりグローバル変数を利用せず新しいフォームを開くたびに引数として受け渡すようなプログラミングをすべきなのでしょうか?

    フォームの引数で受け渡したとしても、前述した問題は解決しないのではないでしょうか? フォームの引数で参照を得たとしても、多くのフォームがそれを更新するのであれば、グローバル変数と同じように見通しが悪くなります。

    また、参照をグローバル変数ではなくCurrentPrincipalに持つ例を以下にご紹介しておきます。C#の例ですが、参考になるのではないかと思います。

    User Context
    http://blogs.msdn.com/ploeh/archive/2007/08/20/UserContext.aspx

    C# : So if a static class is bad practice for storing global state info, what’s a good alternative that offers the same convenience?
    http://stackoverflow.com/questions/1262806/c-so-if-a-static-class-is-bad-practice-for-storing-global-state-info-whats-a


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年1月5日 8:29
    モデレータ
  • グローバル変数にして、…グローバル変数だけの問題ではありませんが、どこかで行った変更が他の箇所にも直接伝播するように作ってある場合を考えます。

    グローバル変数にすると、この伝播が必ず起こります。インスタンス変数をパラメータで持ち回るのは、値のコピーを作っているので、伝播しません。

    さて、今、行うのは、ログイン画面で入力した従業員の情報です。ある画面に脆弱性があり、あることをすると従業員情報が書き換えられる(より権限の高い人の情報に上書きできる)とします。情報が伝播する場合、脆弱性のある画面で従業員情報を偽装して、他の画面の機能を使うことが出来ます。伝播しない場合、機能を使われるのは、脆弱性がある画面と、そこから起動される画面だけに抑えられます。

    今、「脆弱性」といいましたが、「必要な機能」かもしれません。あなたのケースではどちらになるのか、よく考えてお使い下さい。


    Jitta@わんくま同盟
    2010年1月5日 12:56

すべての返信

  • システム規模や開発者のスキルやシステム寿命などにより状況は変わるかもしませんが、自分だったら、グローバル変数にせずに、そのインスタンス変数をパラメタで持ち回りします。


    http://blogs.wankuma.com/hatsune/
    2010年1月4日 11:12

  • あちこちの情報を覗いてみたのですが、グローバル変数は利用すべきではないという意見が主であったように思います。
    グローバル変数は一般的に嫌われますが、使ってはいけないものだとは思いません。例えばThread.CurrentPrincipalプロパティなど、.NET Frameworkに最初から提供されているものもあります。また、ASP.NETのSession変数もグローバル変数の一種でしょう。

    グローバル変数が嫌われる最大の理由は、どのクラスがどのタイミングでグローバル変数を更新するかわかりずらいという見通しの悪さだと思います。見通しの悪さはやっかいなバグの原因になります。しかし、更新するクラスを限定するなどの工夫により、見通しの悪さは軽減されます。例えば、更新はインターフェース経由のみに限定するなどです。


    このような場合、やはりグローバル変数を利用せず新しいフォームを開くたびに引数として受け渡すようなプログラミングをすべきなのでしょうか?

    フォームの引数で受け渡したとしても、前述した問題は解決しないのではないでしょうか? フォームの引数で参照を得たとしても、多くのフォームがそれを更新するのであれば、グローバル変数と同じように見通しが悪くなります。

    また、参照をグローバル変数ではなくCurrentPrincipalに持つ例を以下にご紹介しておきます。C#の例ですが、参考になるのではないかと思います。

    User Context
    http://blogs.msdn.com/ploeh/archive/2007/08/20/UserContext.aspx

    C# : So if a static class is bad practice for storing global state info, what’s a good alternative that offers the same convenience?
    http://stackoverflow.com/questions/1262806/c-so-if-a-static-class-is-bad-practice-for-storing-global-state-info-whats-a


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年1月5日 8:29
    モデレータ
  • グローバル変数にして、…グローバル変数だけの問題ではありませんが、どこかで行った変更が他の箇所にも直接伝播するように作ってある場合を考えます。

    グローバル変数にすると、この伝播が必ず起こります。インスタンス変数をパラメータで持ち回るのは、値のコピーを作っているので、伝播しません。

    さて、今、行うのは、ログイン画面で入力した従業員の情報です。ある画面に脆弱性があり、あることをすると従業員情報が書き換えられる(より権限の高い人の情報に上書きできる)とします。情報が伝播する場合、脆弱性のある画面で従業員情報を偽装して、他の画面の機能を使うことが出来ます。伝播しない場合、機能を使われるのは、脆弱性がある画面と、そこから起動される画面だけに抑えられます。

    今、「脆弱性」といいましたが、「必要な機能」かもしれません。あなたのケースではどちらになるのか、よく考えてお使い下さい。


    Jitta@わんくま同盟
    2010年1月5日 12:56
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    初音玲さん、trapemiyaさん、Jittaさん
    いつもお世話になっております。

    ミドル英二開発者さん
    MSDNフォーラムのご利用有難うございます。

    今回、皆様からグローバル変数の使用について様々なご意見を頂いたのですが、如何でしょうか?
    皆様からの投稿が、フォーラムを閲覧している人にとっても有用な情報と思いましたので、
    勝手ながら、回答マークを付けさせてもらいました。
    もし、何かしら疑問点がありましたら、新たに投稿して頂きたいと思います。

    今後ともMSDNフォーラムを宜しくお願いします(^_^)


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2010年1月18日 9:17