1

クラスでインスタンス化したいデータがたくさんあり、変数ごとに特定のメソッドのセットも定義されていることを確認したいと考えています。いいえ:

[TypeA] VarA
[TypeB] VarB
[TypeC] VarC

FA1() which is a function of VarA and VarB
FA2() which is a function of VarA and VarC

FB1() which is a function of VarB and VarA
FB2() which is a function of VarB and VarC
...

多数の変数 (したがってさらに多くの関数) が存在するため、ソース コードを管理しやすいチャンクに分割したいと考えています。したがって、各変数のすべての関数がインスタンス化されることを保証する自動方法を探しています。

私は自分のコードを整理するための 3 つの可能な方法を思いつきましたが、それぞれにあまり満足していません。どの方法が優れているかを調べたり、アドバイスしたりしています (または、完全に異なる実装方法を見逃していたとしても):

1. 部分授業

partial class Base
{
}

partial class Base 
{
  [TypeA] VarA;

  FA1 { .. };  // function of VarA and VarB
  FA2 { .. };  // function of VarA and VarC
}


partial class Base 
{
  [TypeB] VarB;

  FB1 { .. };  // function of VarB and VarA
  FB2 { .. };  // function of VarB and VarC
}

長所:

  1. 単純
  2. 変数には、クラス Base 内からのみアクセスできます。
  3. 同じ型の変数が 2 つある場合、各変数の関数は独自の関数を異なる方法で実装できます。

短所:

  1. 変数ごとにすべての関数が作成されることを自動的に保証できない
  2. 各関数名の間に名前の衝突がないことを手動で確認する必要があります。

短所は、ある種のコード ジェネレーターによって解決される可能性があることに注意してください (T4 を学習する時間でしょうか??)。


2.内部クラス

class Base 
{
  internal [ClassA] ObjA = new [ClassA]();
  internal [ClassB] ObjB = new [ClassB]();
}

class [BaseClassA]
{
  public [TypeA] VarA;

  public virtual F1 { .. };
  public virtual F2 { .. };
}

class [ClassA] : [BassClassA]
{
  public override F1 { .. };  // function of VarA and ObjB.VarB
  public override F2 { .. };  // function of VarA and ObjC.VarC
}
...

長所:

  1. クラス階層により、すべての関数が作成され、変数にアクセスできるようになります。
  2. 仮想関数を使用することで、関数のインスタンス固有の実装を作成できます

短所:

  1. Internalを使用すると、アセンブリ内のあらゆる場所でデータが表示されます。

3. 静的データ

abstract class Data
{
   static [TypeA] VarA;
   static [TypeB] VarB;
   ...
}

abstract class [BaseClassA] : Data
{
  public virtual F1 { .. };
  public virtual F2 { .. };
}

class [ClassA] : [BassClassA]
{
  public override F1 { .. };  // function of VarA and VarB
  public override F2 { .. };  // function of VarA and VarC
}

class Base 
{
 [ClassA] ObjA = new [ClassA]();
 [ClassB] ObjB = new [ClassB]();
}

長所:

  1. システムは、すべてのルーチンがインスタンス化されることを保証します
  2. アセンブリ全体でデータがブラストされない
  3. 各関数内で、「部分クラス」ソリューションに従って他の変数を直接参照できます

短所:

  1. 静的な匂いの使用は、グローバル データを再発明したようなものです。

私が望むのは、どういうわけか各方法の最良の点をチェリーピックすることです:

  1. 「部分クラス」および「静的」メソッドの変数に直接アクセスする方法
  2. 「部分クラス」メソッドのローカルデータ
  3. 「Internal」および「Static」メソッドの関数実装の自動実施。

そして、私は避けたい:

  1. 「部分クラス」での関数生成の強制の欠如
  2. 「内部」方式でのデータのグローバル アクセス
  3. 「静的」メソッドにおけるグローバル データの再発明

もし私がドラザーを持っているなら、私が望むのは、変数のインスタンスに何らかの形でインターフェースを適用することだと言います-のように:

[TypeA] VarA : IFunctions;
[TypeB] VarB : IFunctions;

そして、どういうわけか、インターフェイス名と使用可能な名前から最終的な関数名をコンパイラに自動生成させます。

3 つの方法のうちどれを実装したいか、または適切な他の方法を提案することもできます。

4

3 に答える 3

2

問題を説明できるように「単純な」バージョンと、問題を解決するための 3 つの「より良い」ソリューションの 4 つのコード サンプルを提示します。自明の唯一のバージョンは単純なバージョンでした。それで、私は来年メンテナンスに来なければならない貧しい開発者のことを考えています (それはあなたが何をしたかを忘れた後のあなたかもしれません)。

したがって、「各変数のすべての関数がインスタンス化されることを保証する」ために、まったく別のメカニズムを検討できますか。コンパイル時に T4 を使用してスタブを自動生成する意思があると述べました。Microsoft FxCopを使用して、何かを追加するのを忘れたインスタンスをキャッチするのはどうでしょうか。

慣れていない方のために説明すると、Microsoft FxCop (Visual Studio のいくつかのフレーバーにも組み込まれています) は、コンパイルされたアセンブリをスキャンし、適切なスペルや変数の大文字と小文字から未使用のローカル変数まで、コードに対して何百ものフレームワーク ルールを評価します。

個人的には、Microsoft が FxCop にバンドルしたルールのほとんどに同意しますが、FxCop の本当の美しさは、独自のルールを作成できることだと思います。CreateXxxメソッドがある場合はメソッドが必要であるなど、CRUD 原則を適用する FxCop に追加するルールを作成しましたDeleteXxx。そのため、希望するパターンに一致するクラスを特定すると、すべてのリストを取得できます。変数 {A, B, C} を指定し、FuncAB(A, B) が存在すること、FuncAC(A, C) が存在することなどを保証します。

その後、ジュニア開発者でさえ、次に IBiVariableFunction を実装し、ペアの関数を忘れたときに FxCop に捕まります。

乾杯、 エイドリアン

于 2009-09-22T03:40:14.753 に答える
0

内部の代わりに保護された提案2を使用できませんか?

于 2009-09-21T13:02:03.487 に答える
0

あなたの質問には、実際の文脈がほとんどなく、理解するのが困難です。明確な質問なしで3つの「回答」を提供しました(imo。)

率直に言って、呼び出す「変数」ごとにメソッドが関連付けられていることを確認したい場合は、インターフェイスの使用を検討し、フィールドの代わりにプロパティを使用する必要があります (インターフェイスはフィールドを指定できないため)。

interface IAStuff {
    TypeA AProp { get; }
    void DoSomethingToA();
}

interface IBStuff {
    TypeB BProp { get; }
    void DoSomethingToB();
}

public class Foo : IAStuff, IBStuff {
    TypeA AProp { get; private set; }
    TypeB BProp { get; private set; }

    void DoSomethingToA() { ... }
    void DoSomethingToB() { ... }
}

クラスがインターフェイスを実装することを宣言する場合、指定されたメンバーを提供する以外に選択肢がありません。そうしないと、コンパイルされません。

お役に立てれば、

-オイシン

于 2009-09-20T22:19:03.580 に答える