Я довольно новичок в проекте и натолкнулся на интересную парадигму проектирования для некоторых асинхронных обращений к базе данных (переменные и имя функции изменены):
private void OnLogin(object selectedInitialState,
AsyncEventCompletedCallback<EmptyAsyncEventArgs> userCallback,
object userState)
Примеры использования:
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);
Примеры использования показывают два разных вызова этой функции для двух разных случаев - начальный вход в систему и повторный вход в систему (технически это не повторный вход в систему, а перезапуск приложения для текущего вошедшего в систему пользователя сдругое начальное состояние).
Меня беспокоит то, что функция обратного вызова в этих двух случаях различна.Я привык видеть, что функция принимает обратный вызов, чтобы позволить пользователям функции предоставлять пользовательские реализации в рамках вызываемой функции.
Однако в вышеприведенном случае функция обратного вызова изменяет поток управления,В зависимости от того, какая функция обратного вызова предоставлена, последующие вызывающие функции после асинхронного вызова возвращаются.Это запах кода или просто изобретательное использование для обратных вызовов?