2013-04-15 24 views
9

pythonのドキュメントとさまざまなメーリングリストを読んでいるとき私はいつもドグマのようなものを読んでいます。グローバル変数は地獄のように避けなければなりません、彼らは貧しいデザインです... OK、なぜですか?しかし、私はそのようなパターンを避ける方法がない現実の生命の状況があります。グローバル変数を避ける方法

メインメニューからいくつかのファイルをロードできるGUIがあるとします。 ロードされたファイルに対応するファイルオブジェクトは、すべてのGUI(例えば、画像を表示する画像ビューア、および様々なダイアログ/プラグインを介して様々なアクションを実行することができる)を超えて使用することができる。 >ロードされたファイルオブジェクトを使用することができます - >ファイルはここに

  • Main.pyからロードされます -

    • Menu.py:

      は、次のような設計を構築すると、本当に間違って何かがありますここ

    • Dialog1.py - >またはここ
    • Dialog2.py - >またはそこ
    • Dialog3.py - >またはそこ
    • ...
    • Globals.py Globals.pyは、キーロードされたファイルの名前と値を、対応するファイルオブジェクトである辞書を格納する

    。そこから、それらのデータを必要とするコードのさまざまな部分が弱い参照を介してアクセスします。

    申し訳ありません私の質問が愚かに見えますが、エレガントでグローバルな選択肢はありませんか? 1つの方法は、ロードされたデータ辞書をMain.pyのメインアプリケーションクラスに、GUIの中央アクセス部分とみなしてカプセル化することです。しかし、このクラスは、必要な直接の子どもであっても、データを必要とするすべてのダイアログから簡単にアクセスできるようにするために、いくつかの複雑な問題もあります。

    は、彼らがコードの再利用を阻害するので

  • +1

    グローバル変数は悪ではありません。変数として悪を使っているのは悪です。グローバル変数は静的であり、可能な限り「不変」でなければなりません。 globals.pyで辞書の内容を変更する必要がある場合は、うまくいきません。それ以外は、読書は大丈夫です。 – CppLearner

    +0

    はい、グローバルな「定数」は大丈夫ですが、グローバルな「変数」は避けるべきです。 – monkut

    +1

    OK、私は両方の意味を持っていますが、ロードされたデータディクショナリが時間の経過と共に進化する可能性のあるpythonの代替案が表示されません。(新しいロードファイル、削除されたファイル) – Eurydice

    答えて

    11

    グローバル変数は避けるべきであるあなたの助けのために多くのことを感謝します。複数のウィジェット/アプリケーションは、同じメインループ内にうまく生きることができます。これにより、あなたが今考えているものを単一のGUIとして要求に応じて作成するライブラリに抽象化することができ、(例えば)単一のランチャが同じプロセスを共有する複数のトップレベルGUIを起動できるようになります。

    グローバル変数を使用する場合は、複数のGUIインスタンスが互いの状態を越えるため、これは不可能です。

    グローバル変数の代わりに、必要な属性をトップレベルのウィジェットに関連付け、同じトップレベルのウィジェットを指すサブウィジェットを作成することができます。次に、メニューアクションは、トップレベルのウィジェットを使用して、現在開いているファイルを操作して操作します。

    +0

    私は静的メンバー変数/属性(ただし、定数の場合は、読み込み目的の場合はインスタンスごとの属性として必ずしも必要ではありません)。しかし、要件に応じて、いくつかの定数を持つことはそれほど悪くはありません。 p – CppLearner

    +0

    もしあなたが正しいとすれば、そのようなデザインは、ロードされたデータ辞書がルートトップレベルウィジェットの属性として格納されるツリーのようなものになるでしょう。その後、アプリケーションのすべてのウィジェットは、 "topLevelParent"メソッドの呼び出しを介してアプリケーションにアクセスできます。 – Eurydice

    +0

    ファイル名とトップレベルのデータを格納する 'MainModel'を持つことができます。 QTを使用すると、メインウィンドウが開き、ファイル名とトップレベルのデータが保存されます。ファイルを開いたり書き込んだりするイベントは、通常最上位のオブジェクトで処理され、下位のオブジェクトはファイル名を知る必要がありません。 – Eike

    -1

    私は1つ以上のクラスにデータをカプセル化し、これらのクラスのborgパターンを実装することによってグローバルデータを管理します。 Why is the Borg pattern better than the Singleton pattern in Python

    +1

    Borgパターンを広告しないでください。シングルトンの全体のポイントは、あなたが**単一**インスタンスを持っていることです。つまり、メモリを節約し、同じ動作を保証します。異なるサブクラスに異なるインスタンスを持つことが本当に必要な場合は、クラスごとに1つのインスタンスを持つための基本的なシングルトン要件を損なうことなくこれを行う方法があります。 – user4815162342

    +3

    BorgもSingletonパターンも、グローバル変数の主な問題を緩和しません。これは、グローバルな単一の状態を持つことです。実際、シングルトンパターンは共有されたグローバルな状態への単なる素晴らしいOOスタイルのインターフェースです。これは、OPが回避する理由を適切に説明していない文章です。 – user4815162342

    +1

    私は実用的なアプローチを好んでいます。グローバル変数aka singleton aka borgパターンは、コードがそれらから読み書きする場合にのみ危険です。グローバルロガー(すべてのクライアントが書き込む)は、データベース接続用のプール(すべてのクライアントが読み取る)と同様に危険ではありません。開発者が本をたどってもバックグラウンドを忘れるべきではない。 – rocksportrocker

    関連する問題