2009-08-30 10 views
0

Comment pensez-vous sur le code d'accès aux données comme ceci:Comment trouvez-vous la partie d'accès aux données (SQL Server) de principes Agile, modèles et pratiques en C#

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 
     ... 
    } 
    ... 
} 

Personnellement, je ne suis pas se sentir très bien avec des codes comme celui-ci (en utilisant "est" pour détecter le type pour décider quoi faire), mais Robert Martin l'auteur dit que c'est OK car c'est seulement dans DAL, donc une petite violation d'OCP est acceptable.

Comment pensez-vous?

Répondre

0

Le code comme ça ne sent pas bon pour moi.
Vous faites probablement votre propre O/R-M donc vous ne connaissez pas tous les détails. Mais l'utilisation d'interfaces peut aider (dans ce cas, l'entité de paiement sera polutet avec le code DAL) ... ne sent pas bon.

donc probablement l'enregistrement des classes ferait le travail:

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); 
} 

Et quelque part au démarrage de l'application, vous pouvez enregistrer les PaymentTypes:

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

Alors, quand vous aurez besoin d'ajouter un autre paiement tapez vous devrez implémenter persistor pour cela et l'enregistrer.
Cela semble beaucoup mieux que le code original pour moi.

Cheers.

+0

Oui, je me sens mieux avec votre solution aussi. – deerchao