実装工場を使用する仕様を決定する型のオブジェクトの作成
-
05-09-2019 - |
質問
これは、主として思考実験です。このすべてのサンプルコード。私の目標を使用した仕様のパターンを巨大なブロックの条件付きコード内の工場です。なのでこのサンプルしていStatusDataオブジェクト用していただきたいと思い、実施IStatusUpdateに適用します。
私は、以下の設定の試験:
[TestMethod]
public void Factory_Interface_Should_Return_IStatusUpdate()
{
var factory = MockRepository.GenerateMock<IUpdateFactory<StatusData>>();
var obj = MockRepository.GenerateStub<IStatusUpdate>();
var data = new StatusData();
factory.Stub(x => x.Get(data)).Return(obj);
var item = factory.Get(data);
Assert.IsInstanceOfType(item, typeof(IStatusUpdate));
}
[TestMethod]
public void StatusUpdateFactory_Should_Return_IStatusUpdate()
{
var factory = new StatusUpdateFactory();
var data = new StatusData();
var item = factory.Get(data);
Assert.IsInstanceOfType(item, typeof(IStatusUpdate));
}
[TestMethod]
public void StatusUpdateFactory_Should_Return_NewStatusUpdate_When_Status_Is_New()
{
var data = new StatusData(Status.New);
var factory = new StatusUpdateFactory();
var item = factory.Get(data);
Assert.IsInstanceOfType(item, typeof(NewStatusUpdate));
}
工場内の実装はこれまでのようになります。
public class StatusUpdateFactory:IUpdateFactory<StatusData>
{
public IStatusUpdate Get(StatusData item)
{
IList<ISpecification<StatusData>> specs = GetSpecifications();
foreach (var spec in specs)
{
if (spec.IsSatisfiedBy(item))
//how do I do this?
return new NewStatusUpdate();
}
return null;
}
private IList<ISpecification<StatusData>> GetSpecifications()
{
var returnList = new List<ISpecification<StatusData>>();
var specTypes = this.GetType().Assembly.GetTypes()
.Where(z => z.IsInstanceOfType(typeof(ISpecification<StatusData>)))
.ToList();
specTypes.ForEach(x => returnList.Add(Activator.CreateInstance(x) as ISpecification<StatusData>));
return returnList;
}
}
私の落下がって発見された仕様を満たした状態オブジェクト、どうやって地図の仕様aタイプを実装するIStatusUpdate..私stumped.
誰かを正しく示唆されていただいたマッピングの仕様IStatusUpdate体.このマッピングはこの責任を掛けで、仕様の匂いに反SRP.私のようなマッパークラスがその責任がないなどの見所も汎用のものを問い直すい地図にマッパーの仕様
あさすがに調度品等は古くなっ飛躍して、私はここに足りない。
解決
だから私たちは本当にラインのこのセットに焦点を当てていると仮定しています:
if (spec.IsSatisfiedBy(item))
return new NewStatusUpdate();
と私は、この現在の形でこれを行うことができますどのようにあなたが求めていると仮定します。項目は、
のように支援すべきであるように思えますinterface ISpecSupport<T>
{
bool ItemSpecsContain(ISpecification<T> spec);
}
次にspec.IsSatisfiedByメソッドは、このインターフェイスタイプに取ると、メソッドを実行することができます。
私は、オブジェクトが(スペックの面で)それが何であるかの説明のいくつかの並べ替えを運ぶ必要があることを言っていると思います言い換えれば。私はそれがある種のリストだ推測しているが、私はよく分かりません。私はあなたが役に立つだろう何かを追加することができますので、もしあなたが、おそらくこの考えてきたと確信しています。
また、代わりに上記の多分あなたがそうのようにそれを並べ替えることができます:
if (item.Satisfies(spec))
return new NewStatusUpdate();
次に、この方法は、あなたは多くの悪口のたたかビジターパターンを使用する必要はありません(私はそれが私がこの前に記述したものだと思います)。それはスペックを所有するのと同じよう項目はようで、この方法は、あなたはそれが仕様を満たしている場合、項目が決定できるようにしているので、それはより直接的です。
あなたは(私は理解するであろう)オブジェクト内に保持され、このロジックを望んでいない、あなたはいくつかの並べ替えのプロパティバッグを使用している(またはあなたが反射してクールだ)あなたがオブジェクトの詳細を掘り下げることができれば独立したスペックのバリ。実際には、独立したバリデータはそもそも悪い考えではないかもしれません。私はスペックがアイテムに一致するかどうかを知るための能力は、個々のスペックで残るべき責任であるようにはよく分からない。
他のヒント
している場合は理解し正しく使い、オブジェクトの実施ISpecificationしたいオブジェクトの実施IStatusUpdate?
お試しなのでこれらの種類が定義されていないわからない場合が関係していきます。
はがきのいずれかが必要であ工場にコード、または法ISpecification.GetUpdate()のオブジェクト。