2017-06-02 1 views
0

J'ai beaucoup de méthodes similaires avec différents paramètres. J'ai essayé de trouver une bonne et simple solution de refactoring mais sans résultat. Je peux utiliser un objet paramètre mais je pense que j'ai besoin de créer une autre classe d'aide, et cela rendra tout plus complexe et plus lent.Comment éviter les méthodes avec différents paramètres

void Foo(ref int test2) 
{ 
    Goo(test2); 
} 

void Foo(ref long test2) 
{ 
    Goo(test2); 
} 

void Foo(ref double test2) 
{ 
    Goo(test2); 
} 

void Foo(ref string test2) 
{ 
    if (!test2.IsNull()) 
     test2 = "sth"; 
    Goo(test2); 
} 
+0

Êtes-vous à la recherche de * génériques *? 'void Foo (ref T test2)' –

+5

Cela aiderait si vous fournissiez un exemple plus complexe. Nous n'avons aucune idée de ce que fait 'Goo', ou pourquoi vos trois premières méthodes acceptent les paramètres' ref', même si elles ne les modifient pas. –

Répondre

3

Utilisation generics:

void Foo<T>(ref T test2) 
{ 
    Goo(test2); 
} 
+2

Cela ne fonctionne que si 'Goo' est une méthode générique et pas une famille de surcharges dans le même était' Foo'. – Lee

+0

Comment cela aide-t-il dans le dernier scénario où il y a un traitement spécifique au type (c'est-à-dire '! Test2.IsNull()') en cours? –

2
  1. multiple surcharge de méthode est pas mauvaise chose qui doivent être évités ou refondus. Alors réfléchissez à deux fois avant de le refactoriser.
  2. Vos méthodes semblent égales, mais elles ne le sont pas. S'il vous plaît jeter un oeil à l'implémentation de la méthode Foo pour le paramètre de chaîne. Il y a un remplacement de valeur d'entrée en cas de null. En cas de générique le cas devrait Implémentation d'être encore couvert sur le type de vérification
  3. De votre exemple, je vois que vous avez une des méthodes imbriquées appel, mais réimplémenté type d'argument d'entrée accordantelly. S'il vous plaît trouvez-le peut-être que c'était fait par but? Il se pourrait que votre code fasse partie de l'API pour être référencé dans d'autres langages qui n'ont pas la notion de génériques.

Si vous toujours sûr que vous devez refactoriser alors les options suivantes sont possibles:

  • Générique
  • POO (polimorfism et virtualisation)
  • Utilisation dynamique ou objet type d'argument d'entrée (Soyez vraiment prudent sur la boxe et la comparaison de type)
  • Si vous voulez réduire l'amout de code vous devez maintenir, mais le code final avec beaucoup d'implémentations de la même méthode est ok pour vous, dans ce cas T 4 peut être une option
+0

Oui, je pense que tu as raison. En réalité, il y a beaucoup de lignes de code, mais dans l'ensemble ce n'est pas si mal. Les génériques ne sont pas bons dans mon cas en raison d'autres actions dans ces fonctions. J'ai pensé aux types d'objets, mais c'est dangereux, et ça peut être pire que ça. La POO peut être une réponse, mais je dois réfléchir davantage à ce cas. Je posterai réponse après un week-end, peut-être que je trouverai une bonne solution. –