私はプロジェクトにかなり慣れていないので、データベースに対して行ういくつかの非同期呼び出し(変数と関数名が変更された)の興味深い設計パラダイムに出くわしました。
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);
使用例は、2つの異なるケース(初期ログインと再ログイン(技術的には再ログインではありませんが、現在ログインしているユーザーの初期状態が異なる場合のアプリケーションの再起動))に対するこの関数の2つの異なる呼び出しを示しています。
気になるのは、この2つの場合のコールバック関数が違うことです。私は、関数がコールバックを取得して、関数のユーザーが呼び出されている関数の範囲内でカスタム実装を提供できるようにするのを見るのに慣れています。
ただし、上記の場合、コールバック関数は制御フローを変更します。提供されているコールバック関数に応じて、非同期呼び出しが戻った後の後続の呼び出し関数は異なります。これはコードの臭いですか、それともコールバックの独創的な使用法ですか?