8 votes

Passer une méthode en tant qu'argument

J'ai une méthode SaveChanges(T objet) qui est fréquemment appelée dans mon code, sauf qu'en fonction de l'action appelant la méthode, il y aurait une méthode différente appelée depuis SaveChanges. Quelque chose comme ça...

protected void SaveChanges(T objetMla, SomeFunction(arg))
    where T : WebObject
{
    try { this._db.SaveChanges(); }
    catch (Exception e)
    {
        Console.WriteLine("Erreur : " + e);
        SomeFunction(arg);
    }
}

Exemples d'utilisation :

SaveChanges(article, article.Authors.Remove(person)) //person est un objet de type MlaPerson
//OU
SaveChanges(article, article.RelatedTags.Remove(tag)) //tag est un objet de type Tag
//OU
SaveChanges(article, article.RelatedWebObjects.Remove(location)) //location est un objet de type MlaLocation

J'ai lu sur les méthodes déléguées mais je suis un peu confus sur la façon de les mettre en œuvre avec mes exigences ou si mes exigences nécessitent l'utilisation de délégués.

ÉDIT : Serait-il également possible de passer plusieurs Actions ?

0voto

Kirk Broadhurst Points 13093

si mes exigences justifient l'utilisation de délégués.

Si vous voulez que la méthode SaveChanges effectue une fonction, vous avez deux options

  • de lui faire effectuer directement la fonction (code à l'intérieur de la méthode, ou appeler une deuxième méthode depuis l'intérieur de la méthode); ou
  • fournir la fonction à la méthode SaveChanges en tant que délégué.

Quand les utiliser est un choix de conception qui vous revient et dépendra du scénario, de la solution globale et de vos préférences.

Avantages de la première option

  • Capable de voir tous les résultats possibles de la méthode SaveChanges au même endroit
  • Moins déroutant pour quelqu'un qui ne sait pas comment les délégués fonctionnent

Avantages de la seconde option

  • Capable d'exclure toutes les fonctions possibles de la méthode SaveChanges (pas besoin d'un énorme bloc case ou if else if else if)
  • Les fonctions qui sont passées à la méthode SaveChanges peuvent être au-dessus d'elle dans la pile d'appels, elle n'a pas besoin de savoir ce qu'elles sont ou comment elles fonctionnent, elles peuvent faire des choses qu'elle ne comprend pas, et elles peuvent être réutilisées - appelées ailleurs ou utilisées comme délégués dans d'autres fonctions.

Je pense que le principal point ici est le premier. Si vous ne gérez que quelques scénarios, alors il est acceptable d'avoir un if else if else if, mais si vous avez plus d'une poignée d'options et que vous préférez une méthode SaveChanges plus générique psdd ce délégué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X