6

コードでクラスを使用する正しい方法を学ぼうとしていますが、顧客のセット、動物から継承した犬などのような明白なものではない場合.

Installer.csコードの大部分を、Downloader.cs、などの「機能」に分割しましたUiManager.cs。これらのクラスが互いのプロパティやメソッドと相互作用するようにする唯一の方法は、それらをすべて静的にすることです。これは別の質問で言われましたが、これは間違った方法です。

だから私の問題は3つのことの1つです:

  1. 私がまだ理解していないクラス同士で会話させる方法があります。

  2. クラスは互いに通信しようとするべきではありませんが、1 回限りのアクションを実行してから何かを に返しますmain/form1。これをメイン クラスが使用して、1 回限りのアクションのために別のクラスに渡すことができます。

  3. クラスは、実際には多数のインスタンスを作成する場合にのみ役立ちます。また、メイン クラスから機能の大きな塊を抽象化するために完全に学ぶ必要がある構造が他にもあります。

私が見つけたすべてのチュートリアルと私が見た講義は、クラスがどのように機能するかを教えてくれるだけ、実際の製品でそれらをいつどのように使用するかについては教えていないようです.

編集 - より具体的な例:

アプリ全体の中心となる 1 つの文字列があり、すべてのクラスで表示および/または変更される可能性があるとします。すべてを 1 つのクラスにまとめたり、静的にしたりせずに、その情報をコード内で移動するにはどうすればよいでしょうか?

その文字列を静的にせずにライブにする方法がわかりませんForm1(すべてのフォームイベントと関数がそれをクラスに渡すためにそれを見ることができる必要があるためです)。

文字列とクラス全体を静的にすることなく、文字列を別のクラスに配置する方法がわかりません。そのため、他のクラスがそれを見ることができます。

クラスを実際にインスタンス化し、オブジェクトを互いに相互作用させることについて、私が見逃していることがあります。

4

2 に答える 2

3

あなたの直感はすべて正しいと思います。

  1. いいえ、ありません。静的またはインスタンス。

  2. それはデザインの選択です (そしてそこにはたくさんあります)。私は実用主義者なので、スパゲティ コードを生成するデザイン パターンは悪いデザイン パターンの選択だと考えています。しかし、あるプロジェクトの悪いデザイン パターンが、別のプロジェクトの良いデザイン パターンになることもあります。Head First Design Pattern の本を読んでみてください。

  3. はい、インターフェースと抽象クラスがあります。

さらにいくつかの考え:

静的メソッドやクラスの使用を避ける必要はないと思います。回避しなければならないのは、言語内のすべてを誤って使用するのと同様に、静的メソッドまたはクラスを誤って使用することです。しかし、static の誤った使い方を定義することは非常に難しく、static メソッドやクラスは特に危険であるため、static キーワードをまったく使用しないように言うのが好きです。アプリケーションを終了しない限り、静的メソッドはメモリ内にあるため、静的メソッド内で接続を破棄しないと、非常に悪い日になります。

ユーティリティ プロジェクトがあり、ユーティリティ プロジェクト内にデータ クラスがあります。データ クラスは、データベースへのアクセスを提供します。静的クラスです。なんで?

まず第一に、接続文字列は webconfig から取得されるため、静的です。したがって、webconfig を読み取り、静的プライベート メンバー変数に文字列を格納する静的コンストラクター (アプリケーションの起動時に一度実行され、クラスが言及される) があります。webconfig ファイルを読み込んで、スコープ付き変数を 1 日 100 億回作成するよりもはるかに優れていると思います。メソッドは十分に単純であるため静的です。つまり、機能するために多くの構成は必要なく、いくつかのパラメーターのみが必要であり、データ アクセス プロジェクトでのみ使用されます。私のウェブサイトのすべてのユーザーはメソッドの同じインスタンス (静的メソッド) を使用していますが、全員が異なるパラメーターで静的メソッドを使用しているため、異なる応答が得られます (パイプを共有していますが、飲む水は異なります)。これ' メソッド内で必要なのは、すべてをクリーンアップする (すべてのスコープ インスタンスを破棄する) ことだけです。そして最後に、私のビジネスはデータ操作に関するものです。非静的データ クラスは、静的データ クラスよりもはるかに多くのメモリ使用量を意味します (CPU 使用量は両方のパターンでほぼ同じです)。

public abstract class Data
{

    [...]

    static Data()
    {
        #if DEBUG
            _Connection = ConfigurationManager.AppSettings["debug"];
        #endif

        #if RELEASE
            _Connection = ConfigurationManager.AppSettings["release"];
        #endif

        [...]
    }

    [...]

}

結局のところ、次の場合に static を使用します。

  1. それが十分に単純である場合(すべての側面を制御できる場合);
  2. それが十分に小さい場合(検証に拡張メソッドを使用し、それらは静的です)および;
  3. 使用頻度が高い場合。

それに加えて、プロジェクトを整理するためにレイヤーを使用します (poco + factory パターン)。ユーティリティ プロジェクト、エンティティ モデル プロジェクト、アクセス プロジェクト、ビジネス ロジック プロジェクト、Web サイト、API、マネージャーなどがあります。ユーティリティ プロジェクト内のクラスは相互に対話しませんが、エンティティ モデル プロジェクト内のクラスは相互に対話します (クラスはその中に別のクラスのインスタンスを持つことができます)。エンティティ モデル プロジェクトはユーティリティ プロジェクトと対話しません。それらは同じレベルを持ち、アクセス プロジェクトの別のレベルで相互に対話するためですが、データ操作プロジェクトではより直感的です。

于 2012-09-06T18:39:57.457 に答える
1

A が B にメッセージを渡すためには、A が B への参照 (インスタンスまたは静的参照のいずれか) を必要とするため、クラスは参照を持っている場合に相互に対話します。

クラスは互いに通信するか、プロセス全体を制御する別のクラスに情報を返すことができます (これは実際には設計パターンです)。

メインクラス(または任意のクラス)から情報を抽象化するには、インターフェースと抽象クラスがあります

この場合、Gang of Four のデザイン パターンの本は必読です。他に心に留めておくべきことは、設計の単純さです。設計パターンに合わせようとすると、より多くのスパゲティ コードが作成されることがあります。経験則として、常にロジックからプレゼンテーション機能を分離しようとし、クラスを、互いに話したり仕事をしたりする人として考えてください (ちょっと変だと思いますが、時々このように考えるのに役立ちます)

于 2012-09-06T18:50:19.460 に答える