0

次のようなデータ アクセス コードについてどう思いますか。

public void AddCusotmer(Cusotmer customer)
{
   //save customer into database
   ...

   // save payment type
   SavePaymentType(customer);

   //save other data
   ...
}

private void SavePaymentType(Customer customer)
{
   if(customer.PaymentType is XXXPayment)
   {
      var payment = customer.PaymentType as XXXPayment;
      //save payment to XXXPayments table in db
      ...
   }
   else if(customer.PaymentType is YYYPayment)
   {
      var payment = customer.PaymentType as XXXPayment;
      //save payment to YYYPayments table in db
      ...
   }
   ...
}

個人的には、このようなコード (「is」を使用して型を検出し、何をすべきかを決定する) はあまり気分が良くありませんが、作者の Robert Martin は、DAL だけなので問題ないと言っているので、OCP の少しの違反は許容できる。

あなたはどのように思いますか?

4

1 に答える 1

0

このようなコードは私にはいいにおいがしません。
あなたはおそらく独自の O/RM を行っているので、すべての詳細を知っているわけではありません。

しかし、インターフェイスを使用すると役立つ場合があります (この場合、Payment エンティティは DAL コードで polutet になります)... いい匂いがしません。

したがって、おそらくクラスの登録は仕事をするでしょう:

private void SavePaymentType(PaymentType )
{
   if (paymentType == null)
       throw new NotSupportedException("Handle nulls too");
   IClassPersister persister;
   if (!paymentType2Persister.TryGetValue(paymentType.GetType(), out persister))
      throw new ORMException(string.Format("Cannot find persister for {0}", paymentType.GetType().Name))
   persister.Save(paymentType);
}

アプリの起動中のどこかで、PaymentTypes を登録できます。

paymentType2Persister.Add(typeof(XXXPayment), new XXXPaymentPersistor);
paymentType2Persister.Add(typeof(YYYPayment), new YYYPaymentPersistor);
// etc

したがって、別の支払いタイプを追加する必要がある場合は、そのための永続化を実装して登録する必要があります。
これは、元のコードよりもはるかに優れています。

乾杯。

于 2009-08-30T03:25:43.477 に答える