1

私はプロジェクトにかなり慣れていないので、データベースに対して行ういくつかの非同期呼び出し(変数と関数名が変更された)の興味深い設計パラダイムに出くわしました。

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つの場合のコールバック関数が違うことです。私は、関数がコールバックを取得して、関数のユーザーが呼び出されている関数の範囲内でカスタム実装を提供できるようにするのを見るのに慣れています。

ただし、上記の場合、コールバック関数は制御フローを変更します。提供されているコールバック関数に応じて、非同期呼び出しが戻った後の後続の呼び出し関数は異なります。これはコードの臭いですか、それともコールバックの独創的な使用法ですか?

4

1 に答える 1

2

OnLoginこの関数は、完了時にコールバックを1回だけ呼び出す操作を開始するものとして解釈しています。

この場合、コードは実際には非常に正常です。これは、プログラムを非同期で作成する場合には珍しいことではありません。代替案がコールバック関数で(小さな)ステートマシンを使用して「状態」を維持することを考えると、実際には異なるコールバックがより洗練されたソリューションだと思います。非同期の「状態」を明示的にではなく暗黙的に処理します。

于 2010-07-07T00:38:56.883 に答える