同じビジネス エンティティを表すさまざまな種類のオブジェクトがあります。
UIObject
、PowershellObject
、DevCodeModelObject
、WMIObject
すべて同じエンティティに対する異なる表現です。
エンティティがAnimal
、AnimalUIObject
、AnimalPSObject
、AnimalModelObject
などであるAnimalWMIObject
とします。
AnimalUIObject
、AnimalPSObject
、の実装AnimalModelObject
はすべて別のアセンブリに含まれています。
今私のシナリオは、Animal
それが元のアセンブリに関係なく、ビジネス エンティティの内容を確認したいということです。そこで、エンティティGenericAnimal
を表すクラスを作成しました。Animal
ここでGenericAnimal
、次のコンストラクターを追加しました。
GenericAnimal(AnimalUIObject)
GenericAnimal(AnimalPSObject)
GenericAnimal(AnimalModelObject)
基本的にGenericAnimal
、基礎となるすべてのアセンブリに依存するようにしたので、検証中にこの抽象化を処理しました。
これを行うもう 1 つの方法はGenericAnimal
、空のコンストラクターを使用して、これらの基になるアセンブリTransform()
にGenericAnimal
.
どちらのアプローチにも、いくつかの長所と短所があります。
第 1 のアプローチ:
長所: すべての構築ロジックは 1 つのクラスの 1 か所にありますGenericAnimal
。 短所:GenericAnimal
新しい表現形式があるたびに、クラスを変更する必要があります。
2 番目のアプローチ:
長所: 構築の責任は、基になるアセンブリに委任されます。
短所: 構築ロジックはアセンブリ全体に分散しているため、明日プロパティを追加する必要がある場合は、X
すべてGenericAnimal
のアセンブリに触れてTransform
メソッドを変更する必要があります。
どちらのアプローチが良いですか?
またはどちらがより少ない悪だと思いますか?
上記の2つよりも優れた代替方法はありますか?
私が受け取ったコメントに基づいてさらに詳しく説明します。基になるオブジェクトの構造を変更する余裕はありません。つまり、AnimalUIObject AnimalPSObject などを変更することはできません。GenericAnimal は、検証目的で私が導入したコンストラクトです。