2012-09-06 6 views
6

私はコード内でクラスを使用する正しい方法を学びたいと思っています。顧客の集合、動物から継承する犬などのような明白なものではないときにです。main/form1以外のクラスを試してみるのは悪いフォームですか?

コードの大部分をInstaller.cs,Downloader.cs,UiManager.csなどの「機能」。私がこれらのクラスをそれぞれのプロパティとメソッドと相互作用させるために見つけることができる唯一の方法は、それらをすべて静的にすることです。別の質問で言われたことは間違った方法です。

  1. クラスは、私はまだ理解していないことをお互いに話すようにする方法があります:

    だから、私の問題は、3つの事の一つです。

  2. クラスは決してお互いに話してはいけませんが、一度だけのアクションを実行してから、main/form1に何かを戻します。メインクラスは一度限りのアクションのために別のクラスに渡すことができます。

    クラスは本当にたくさんのインスタンスを作成するのに役立ちます。クラスは、メインクラスから大量の機能を抽象化するために必要なものです。

私が見つけることができると私は見ての講義だけでどのようにクラス作業を教えてくれているように見えるすべてのチュートリアルではなく、いつ、どのように実際の製品にそれらを使用します。

EDIT - より具体的な例:

私はアプリケーション全体の中心であり、見および/またはすべてのクラスによって、潜在的に変更する必要が1つの文字列を持っていると言います。 1つのクラスにすべてを持たせたり、静的にすることなく、その情報をコードの周りに移動するにはどうすればよいですか?

静的にすることなく、その文字列をForm1に保存する方法はありません(フォームのすべてのイベントと関数は、それをクラスに渡すためにはそれを見る必要があるため)。

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

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

+5

これは大きな質問です、簡単には答えられないものがあります。 OOPと[Design Patterns](http://www.amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124/ref=sr_1_fkmr0_1?ie=UTF8&qid=1346955994&sr=8)に関するいくつかの書籍を読むことを検討してください。 -1-fkmr0)。 –

+0

「本に答えるように書くことができたら...」と投票してください。もう1組の本はTDDに関する本です。私。いくつかここに参照されてhttp://stackoverflow.com/questions/880401/what-book-on-tdd-for-c-sharp-with-treatment-of-mocks。 –

+1

本当に大きな質問です。うまくいけば少なくともあなたの_classes_はお互いに話すべきではないと考えていますが、それらのクラスからインスタンス化された_objects_は確​​かに可能です。もちろん、サポート性の理由から、オブジェクト間の依存関係を最小限に抑えたいと思うでしょう。 「要求する、インスタンス化しない」のような経験則に従えば、クラスAの関数がクラスBのインスタンスを必要とする場合、そのクラスに内部で作成するのではなく、クラスBのインスタンスを作成する必要があります。もちろん、これ以上のものはありません。 – David

答えて

3

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

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

  2. これは設計上の選択です(そこにはたくさんの部分があります)。私は実用的なので、私はスパゲティコードを生成するデザインパターンを悪いデザインパターンの選択とみなします。しかし、プロジェクトのデザインパターンが悪い場合は、別のプロジェクトのデザインパターンが良いかもしれません。ヘッドファーストデザインパターンの本を読んでみてください。

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

いくつかの考え:

私は静的メソッドまたはクラスの使用は避けなければならないと思います。避けなければならないことは、言語内のすべてのものを逃したような、静的なメソッドやクラスの使い方が間違っていることです。しかし、静的な方法やクラスが特に危険なので、静的なキーワードを避けるように言いたいからです。静的メソッドは、アプリケーションを終了しない限りメモリに格納されるため、静的メソッド内で接続を破棄しないと、非常に悪い一日になります。

私はユーティリティプロジェクトを持っており、ユーティリティプロジェクト内にはデータクラスがあります。データクラスは、データベースへのアクセスを提供します。これは静的なクラスです。どうして?

まず、接続文字列がwebconfigから来ているため、静的です。だから私は静的なコンストラクタ(アプリケーションが起動し、クラスが記述されているときに一度だけ実行されます)がwebconfigを読み込み、その文字列を静的privateメンバー変数に格納します。私はそれがwebconfigファイルを読んで、scoped変数を作成するよりもずっと良いと思います。メソッドは静的なので、単純なので、多くの構成を必要とせず、いくつかのパラメータが必要であり、データアクセスプロジェクトでのみ使用されます。私のウェブサイトのすべてのユーザーは、メソッドの同じインスタンス(静的なもの)を使用していますが、誰もが異なるパラメータで静的メソッドを使用するので、パイプの内容が異なる(パイプを共有します。メソッド内で必要なのは、スコープされたインスタンスをすべて破棄する方法です。スコープのないインスタンスを削除すると、メモリ内に残ります。最後に、私のビジネスはデータ操作に関するもので、非静的データクラスは静的なものよりも多くのメモリ使用量を意味します(CPU使用率は両方のパターンでほぼ同じです)。私は、静的な使用一日の終わりには

public abstract class Data 
{ 

    [...] 

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

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

     [...] 
    } 

    [...] 

} 

  1. それは、単純な十分な(私はあらゆる側面を制御できること)である場合には、
  2. 十分小さい場合(私はバリデーションに拡張メソッドを使用し、それらは静的です)。
  3. 重い場合は使用してください。

それ以外にも、レイヤーを使用してプロジェクト(poco + factoryパターン)を整理します。私は、ユーティリティプロジェクト、次にエンティティモデルプロジェクト、次にアクセスプロジェクト、そしてbussinessロジックプロジェクト、そしてウェブサイト、api、マネージャーなどを持っています。ユーティリティー・プロジェクトのクラスは相互に作用しませんが、エンティティー・モデル・プロジェクト内のクラスはクラス内の別のクラスのインスタンスを持つことができます。エンティティモデルプロジェクトは、同じレベルを持ち、アクセスプロジェクトで別のレベルで相互に作用するため、ユーティリティプロジェクトと対話しませんが、データ操作プロジェクトでは直感的です。これらは参照を有する場合

+2

あなたの投稿の[revisions](http://stackoverflow.com/posts/12306400/revisions)ページで、編集に満足できない場合は、古いバージョンにロールバックできます(*編集を繰り返す必要はありません) )。マークアップエディタが番号付きリストの適切な書式設定にしか対処できないときに、なぜ 'a、b、c 'を使用することを主張するのかは私を驚かせるものです。 – Adam

1

クラスは、AがBにメッセージを渡すために、Aは

クラスがお互いに話すことができるいずれかのBを参照(インスタンスまたは静的参照のいずれか)を必要とする、お互いに話します、またはあなたがインターフェイスや抽象クラス

デザインパターンの本を持っているメインクラス(または任意のクラス)から情報を抽出するため

(これは実際にはデザインパターンである)プロセス全体をcontrolls別のクラスに情報を返します4人のギャングからは、この場合に読む必要があります。 他にも留意すべき点は、デザインのシンプルさです。デザインパターンに合わせようとすると、より多くのスパゲティコードが作成される可能性があります。経験則として、論理からプレゼンテーションの機能を分離し、クラスをお互いに話し合い、仕事をする人物と考えてください(これはちょっと変わっていますが、それは私がこのように考えるのに役立ちます)。

+0

ありがとうカルロス。時々、私は何か悪いことをすることと、やりたくないことをやろうとすることの違いを教えてくれません。 私は実際に授業を受けて仕事をすることができるのが本当の問題だと思っていますが、どうして私は彼らにお互いに話すことができません。私はそれを掘り下げ、その本を確かにチェックします。 – appski

関連する問題