Je suis assez nouveau sur un projet et couru à travers un paradigme de conception intéressante pour certains appels asynchrones que nous faisons à la base de données (variables et nom fonction modifiée):Le mécanisme de rappel générique surcharge le gestionnaire de succès en tant que moyen de contrôle de flux - odeur de code?
private void OnLogin(object selectedInitialState,
AsyncEventCompletedCallback<EmptyAsyncEventArgs> userCallback,
object userState)
Exemples d'utilisation:
OnLogin(
null,
args =>
{
if (args.IsSuccess)
DetermineNextStep(); //When done, continue to this step
else
//NOTE: This probably means we couldn't connect to the DB
// Handle this case
},
null);
OnLogin(
newInitialState,
args =>
{
ReLoginUser(); //Was logged in; re-logging in user with different initial state
},
null);
Les exemples d'utilisation montrent deux appels différents à cette fonction pour deux cas différents - un login initial et un re-login (pas techniquement un re-login, mais un redémarrage de l'application pour l'utilisateur actuellement connecté avec un état initial différent) . Ce qui me dérange, c'est que la fonction de rappel dans ces deux cas est différente. J'ai l'habitude de voir une fonction prendre un rappel pour permettre aux utilisateurs de la fonction de fournir des implémentations personnalisées dans le champ de la fonction appelée.
Dans le cas ci-dessus, cependant, la fonction de rappel change le flux de contrôle. Selon la fonction de rappel fournie, les fonctions d'appel suivantes après les retours d'appel asynchrones sont différentes. Est-ce une odeur de code ou juste une utilisation inventive pour les rappels?