2016-09-20 9 views
1

以下の2つの例の長所と短所を特定することができません。空派生クラスVs型プロパティ

例1(タイププロパティ):

public abstract class Animal : /* all relevant interfaces*/ 
{ 
    /* 
    All necessary implementations 
    */ 
} 

Public class Dog : Animal 
{ 
    Public string Name {get; set;} 
    Public Breed Type {get; set;} 

    /* 
    All necessary implementations 
    */ 
} 

Public Type Breed 
{ 
    Bulldog, 
    Chihuahua, 
    Labrador, 
    /* 
    So on…… 
    This can grow without limitation, 
    you dno't know how much it will grow into, or 
    what breed you will have tomorrow e.g BulldogChihuahuaCross, 
    or BulldogLabradorCross. 
    */ 
} 

例2(空の派生クラス):

public abstract class Animal : /* all relevant interfaces*/ 
{ 
    /* 
    All necessary implementations 
    */ 
} 

Public class Dog : Animal 
{ 
    Public string Name {get; set;} 

    /* 
    All necessary implementations 
    */ 
} 

Public class Bulldog : Dog 
{ 
    /* Empty Class */ 
} 

Public class Chihuahua: Dog 
{ 
    /* Empty Class */ 
} 

Public class Labrador: Dog 
{ 
    /* Empty Class */ 
} 

理想的には私は最高のデザインと高い重どの知っていただきたいと思います編集:

例1では、Dogのインスタンスが作成され、その型がプロパティとして割り当てられます。例2では、​​その特定の型のインスタンスが作成されます。

私はいくつかのindepth引数、スケーラビリティ、maintainablity、1000種類の品種がある場合はCPUのコスト、実行クエリのコストなどを探しています。

+0

これは実際にはほとんどの人が尋ねることを気にしない非常に良い質問です。私はあなたのために良い答えだと思っているものを持っていますが、今日まではそれを正しく書くための時間がありません。乞うご期待。 –

+0

@ JimL.私はあなたの答えを楽しみにしています。 – Jegan

+0

@ JimL。または、フェルマーが言ったように:私は優れた証拠を持っていますが、ここのマージンはそれを書き留めるにはあまりにも狭いです;-) –

答えて

2

スペクトルには2つの極端なものがあります。一方では、単なる情報であり、列挙されたインスタンスへのテキスト、数値、または参照として扱われる一連のものがあります。たとえば、犬のサロンアプリケーションでは、ペットの名前、色、品種などを識別目的のテキストとして記録する場合があります。スペクトルの反対側には、異なるプロパティ、操作、またはメソッドを持つ必要のある一連のものがあります。例えば、ビデオゲームでは、吠えたときに犬の品種ごとに異なる音を出すことができます。

デザイナーとして決定しなければならない決定は、「談話の領域」と特定のアプリケーションのショートカットをいつどの程度正確に反映させるかです。談話の領域では、各品種に独特の特性がありますが、犬のサロンアプリケーションの目的では、気にしません。その場合、詳細をデザインすることができ、将来必要としないことを希望することができます。

問題は、誰かが間違った決定をするスペクトルの真ん中にあります。大規模なエンタープライズ・システムでは、継承階層を1つまたは複数のデータベース列の値として明示的にエンコードされた型に圧縮していました。これは恐ろしいことでした。なぜなら、エンコードされたすべてのタイプに対して他のどの列が有効かを知ることがプログラマーの問題になったからです。このシステムには、時間の経過と共に進化したビジネスルールを実装するためのスイッチ文がすべて、非常に複雑なものになっていました。システムには多くのバグがありました。

そのため、スペクトルの途中で、物事が明確にカットされていないところでは、私は多くのクラスの面で間違っていました。その理由は、ドメインを正確に反映することで、要件が満たされているかどうかを簡単に伝えることができ、コードをより直観的に維持することができます(DDDと仮定します)。ドメインを反映する鍵は、物事を正確に表現することです。たとえば、「Fido」はDogセットとAnimalスーパーセットのメンバーです。 "シルベスター"は、キャットセットとアニマルスーパーセットのメンバーです。これは人々が理解しやすく、各クラスは外部から隠された異なる実装を持つことができます。文字列、整数、または列挙型のリテラル参照として明示的にコード化された型の解釈を開始したら、switch文が必要です。多くのオブジェクト指向言語はすべてのことからあなたを救うことができますが、タイプの完全なリストを含むファクトリを作成する必要があります。ランタイムオーバーヘッドは無視できます(特に、一定時間で実行するようにファクトリを実装する場合)。リレーショナルデータベース内の値に型をマップして、それらを照会してレポートすることができます。また、あなたが指摘しているように、ジェネリック医薬品を利用できるかもしれません。

犬のサロンアプリケーションの場合のように、クラスが常に空であることが分かっている場合は、クラスを気にしないでください。異なるプロパティ、操作、およびメソッドを持つことがわかっている場合や、わからない場合は、クラスを使用してください。

+0

ありがとうございます。これはまさに私の問題です。私が与えた例は、私が実際に持っているものよりはるかに単純です。私は非常に複雑なエンタープライズシステムに取り組んでいます。「Event sourcing」とDAG(有向非循環グラフ)を使用するため、システムには2つの部分があり、部分1はオブジェクトのインスタンス2を作成し、ジェネリックの使用量が多いイベントソーシングに登録されます。ジェネリック医薬品の使用に適応するために、時間の経過とともに、空のクラスが引き継がれました。 – Jegan

+0

プロジェクトが始まった時点では、多くの不明な点がありましたが、今は多少解決しています。私の質問は、談話の領域から移動する価値があると同時に、スイッチのステートメントやどこにでもあるような大混乱で終わるべきではないと慎重にしたいと思う。 – Jegan

+0

なぜこの時点で列挙型に変更する可能性がありますか?私は道のりの無気力の可能性を指摘した。私は、授業が本当に面倒だとは思っていませんが、彼らは迷惑です。 –

1

最初の方法では、どの品種が犬であるかを判断できますが、2番目の方法ではサブクラスの特定の実装を行うことができます。

犬種別ごとに異なるメソッドやプロパティを持つオブジェクトが必要な場合は、派生クラスを参照してください。それ以外の場合は、typeプロパティと単一クラスを持つ方が簡単です。

+0

私は両方のデザインの賛否両論について、一貫性のない議論を探しています。例えば、これは100万匹の犬と1000匹の品種を持つエンタープライズシステムです。 – Jegan

+1

ユーザーKasper Holdumによって既にかなり長い議論があります:[http://stackoverflow.com/questions/1338391/when-to-subclass-instead-of-differentiating-the-behaviour](http://stackoverflow。 com/questions/1338391/when-to-subclass-of-differentiating-the-behaviour) – SilentLupin

+1

実際、これはあなたの質問とほぼ同じで、かなりうまく答えています:[http://stackoverflow.com/questions/4254182 /inheritance-vs-enum-properties-in-the-domain-model(http://stackoverflow.com/questions/4254182/inheritance-vs-enum-properties-in-the-domain-model) – SilentLupin

1

これは私の2セントです:何かへの高速アクセスを探しているなら、それを連想配列にします。どちらの実装でも、同じ速度でアクセスできるハッシュコード(オブジェクトアドレス)を使用します。サブクラス化は、機能を追加する場合にのみ意味があります(基本的に)。分類子から型を取得することは、列挙から型を取得することと変わりありません。巧妙なクエリが必要な場合は、巧妙な連想配列を作成します。

+0

これは非常に良い点です。私は、空のサブクラスから型のリストへの道を移そうとしていますが、デザインに混乱を生み出さないようにしたいと思います。 – Jegan

+0

入力用のサブクラスのみを作成し、その実際の目的である機能性を追加しないため、列挙型は設計上の(言いたように)より良い選択です。 –