6


2

私はさまざまな場所で、グローバルスコープを持つ変数を持つことを読みました。 静的メンバーを持つパブリック静的クラスは、オブジェクト指向の哲学に反すると考えられており、良い設計ではありません。 (たとえば、「グローバルを使用している場合は、正しく機能していません。」またはその意味の言葉です。)

ただし、Visual Studioが提供する設定メカニズムを使用すると、 "Settings.Default.MySetting"など、これはアプリ全体でグローバルに使用可能です。では、これはパブリック静的クラスの使用とどう違うのでしょうか。

また、シングルトンオブジェクトを使用しても同じ結果が得られますが、控えめに言っても、これはさまざまな意見を引き起こします。

グローバル変数はとても便利です(VBモジュール、誰か?)。しかし、私は自分自身にこのオブジェクト指向の不適切な使い方を教えようとしています。

私は特に '設定’機能の使用についての人々の意見に興味があります。 これは良いOO設計と見なされますか?

ご意見ありがとうございました。

5 Answer


14


静的メソッドや他のメンバは、それ自体が悪い方法ではありません。 オブジェクト指向の概念にあまり馴染みのない人々が、結果が何であるかを理解せずに、静的なメソッド、プロパティ、およびフィールドを使用してコードを散らす傾向があることだけです。

一般に、構成設定、ヘルパークラスおよびユーティリティクラス、抽象ファクトリ、シングルトンなどの場合、静的メンバーを持つことは完全に受け入れられます。


2


C#では、OOから抜け出すことができないため、優れたOO設計に対して苦労することになります。 C言語のように、オブジェクト指向プログラミングと構造化を組み合わせて組み合わせることはできません。これらの種類の引数が頻繁に発生する領域です。 クラスの静的メンバーはオブジェクト指向です。 Microsoftが生成したSettingsもそうだ。コード生成はそれらのためにオブジェクト指向のカプセル化、あるいは少なくともそれらの周りの "オブジェクトコンテナ"を生成するからだ。 C#には存在しないため、グローバル変数にはなりません。クラスの静的メンバーにすぎません。

引数がシングルトン対静的メンバーに関するものであるならば、それはあるOO引数を他のOO引数と対比させます。

そして、常に哲学的観点と実践的観点があります。 ほとんどの分野で、実装されている理想的な哲学的観点は、学術的な研究を除いて、それだけでは意味がありません。 現実の世界では、現実のソリューションと混合ソリューションが必要です。


1


パブリックスタティッククラスやメンバは、必ずしも悪い考えではありません(たとえそれが完全にオブジェクト指向でなくても)。 多くの優れたオブジェクト指向設計では、ロガーや設定などのためにパブリック静的メンバーを使用します(ご指摘のとおり)。 OOのやり方でこれをどのように行うかの良い例はhttp://codebetter.com/blogs/jean-paul_boodhoo/archive/2007/10 / 15 / the-static-gateway-pattern.aspx [静的ゲートウェイ]です。


1


ゴートのようなグローバル変数は、すべての初心者には避けなければならないものですが、上級プログラマにとっては非常に便利です。

私はあなたが自信を持っていないとあなたはそれがそれらの良いアプリケーションである理由、具体的な、正当な理由がない場合は、それらを使用しないでください。 グローバル変数に戻る前にオブジェクト指向をマスターしましょう。


0


設定メカニズム…​ うーん…​

私はそれらを主に環境の一部として見ています。 OSやTimeと似ていますが、アプリケーション用です。 あなたがINITの間に宣言するように、それらは本当に「変数」ではありません。

ただし、実行時にオブジェクトが必要になったときにそれらを読み取るのではなく、オブジェクトをラップしてそのオブジェクトを介してのみアクセスすることができます。 私はそれをテストしていませんが、おそらくパフォーマンスの低下です(または、良いメモリ管理をしていないのであれば、生のものを読むことに対して否定的です)。

最終的には、アプリケーションが成熟するにつれて、このようなことでオブジェクトがラップされてしまうことになります。 私の考えは、考え始めたときはいつでも、「いや、これはあまりにも単純すぎても、あまりにも原始的で、オブジェクトを必要としません…​」それがオブジェクトにするための私の手がかりです。