同じビジネス エンティティを表すさまざまな種類のオブジェクトがあります。
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 は、検証目的で私が導入したコンストラクトです。