クラスでインスタンス化したいデータがたくさんあり、変数ごとに特定のメソッドのセットも定義されていることを確認したいと考えています。いいえ:
[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
}
長所:
- 単純
- 変数には、クラス Base 内からのみアクセスできます。
- 同じ型の変数が 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
}
...
長所:
- クラス階層により、すべての関数が作成され、変数にアクセスできるようになります。
- 仮想関数を使用することで、関数のインスタンス固有の実装を作成できます
短所:
- 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]();
}
長所:
- システムは、すべてのルーチンがインスタンス化されることを保証します
- アセンブリ全体でデータがブラストされない
- 各関数内で、「部分クラス」ソリューションに従って他の変数を直接参照できます
短所:
- 静的な匂いの使用は、グローバル データを再発明したようなものです。
私が望むのは、どういうわけか各方法の最良の点をチェリーピックすることです:
- 「部分クラス」および「静的」メソッドの変数に直接アクセスする方法
- 「部分クラス」メソッドのローカルデータ
- 「Internal」および「Static」メソッドの関数実装の自動実施。
そして、私は避けたい:
- 「部分クラス」での関数生成の強制の欠如
- 「内部」方式でのデータのグローバル アクセス
- 「静的」メソッドにおけるグローバル データの再発明
もし私がドラザーを持っているなら、私が望むのは、変数のインスタンスに何らかの形でインターフェースを適用することだと言います-のように:
[TypeA] VarA : IFunctions;
[TypeB] VarB : IFunctions;
そして、どういうわけか、インターフェイス名と使用可能な名前から最終的な関数名をコンパイラに自動生成させます。
3 つの方法のうちどれを実装したいか、または適切な他の方法を提案することもできます。