2010-10-02 14 views
1

J'ai le code suivant que j'essaie de consolider. (en voici deux exemples) mais avec ce modèle répété de vérification si les champs sont nuls alors s'ils sont différents et si oui, en définissant la nouvelle valeur dans l'ancienne valeur.quel est le meilleur modèle pour supprimer cette duplication

Quelle est la meilleure façon de réécrire ceci pour éviter la duplication?

if (String.IsNullOrEmpty(f.FirstName)) 
    { 
    if (exisingPerson.FirstName != f.FirstName) 
     { 
     change = true; 
     exisingPerson.FirstName = f.FirstName; 
     } 
    } 

if (String.IsNullOrEmpty(f.LastName)) 
    { 
    if (exisingPerson.LastName != f.LastName) 
     { 
     change = true; 
     exisingPerson.LastName = f.LastName; 
     } 
    } 
+0

Je pense que vous voulez un! before String.IsNullOrEmpty() – Les

+0

Vous pouvez simplement faire "change = (exisingPerson.LastName! = f.LastName);" et éliminer le if interne (à moins que ces propriétés FirstName et LastName ne compliquent quelque chose lors de l'affectation). En dehors de cela, je ne pense pas vraiment que cela nécessite un changement. – ollb

Répondre

1

Vous pouvez utiliser les délégués:

public static bool ChangeProperty(Func<Person, string> getter, Action<Person, string> setter, Person person, string value) 
    { 
     if (!String.IsNullOrEmpty(value) && !getter(person).Equals(value)) 
     { 
      setter(person, value); 
      return true; 
     } 
     return false; 
    } 

et l'appeler avec lambdas comme ceci:

var barneyRubble = new Person(); 
    change = ChangeProperty(p => p.FirstName, (p, v) => p.FirstName = v, barneyRubble, "Fred"); 

Une chose à faire encore mieux serait de mettre la méthode dans la classe Person et éliminer ce troisième paramètre au total, en le remplaçant par this.

Probablement trop, mais si vous faites beaucoup de ces changements de propriété, cela pourrait être utile, et je pense que c'est un modèle intéressant de toute façon.

2

Je ne pense pas que vous pouvez faire beaucoup pour éliminer la duplication (du moins pas sans introduire de réflexion qui sera probablement boueuse le code plutôt que de le rendre plus clair).

Cependant, vous pouvez regarder la mise en œuvre INotifyPropertyChanged qui est un modèle standard de notification des modifications apportées à un objet au lieu du booléen que vous utilisez actuellement:

Si vous regardez la exemple de code il y a aussi une certaine quantité de répétition.

0

Pour seulement quelques champs, votre code peut être le meilleur. Court et simple.

0

Si vous le faites souvent, peut utiliser pour réfléchir sur chaque champ de l'objet et effectuer l'opération s'il s'agit d'un String.

Cependant, le inconvénient est de lisibilité. Peut-être que vous êtes mieux d'être explicite, et de protéger contre les fautes de frappe grâce à copier/coller grâce à l'utilisation intensive de tests unitaires.