代码之家  ›  专栏  ›  技术社区  ›  Robert Hui

泛型回调机制重载成功处理程序作为流控制的一种手段-代码气味?

  •  1
  • Robert Hui  · 技术社区  · 14 年前

    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);
    

    示例用法显示了针对两种不同情况对该函数的两个不同调用—初始登录和重新登录(从技术上讲不是重新登录,而是使用不同的初始状态为当前登录的用户重新启动应用程序)。

    困扰我的是,这两种情况下的回调函数是不同的。我习惯于看到函数接受回调,以允许函数的用户在所调用函数的权限内提供自定义实现。

    不过,在上述情况下,回调函数会更改控制流。根据提供的回调函数,异步调用返回后的后续调用函数是不同的。这是一种代码味道还是仅仅是回调的一种创造性用途?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Stephen Cleary    14 年前

    我在解释 OnLogin 函数的作用是启动一个操作,该操作在完成时只调用回调一次。

    在这种情况下,代码实际上是非常正常的。这在异步编写程序时并不少见。考虑到另一种选择是在回调函数中使用(小型)状态机保持“状态”,我认为不同的回调实际上是更优雅的解决方案。它隐式地而不是显式地处理异步“状态”。