我在项目上相当新,并且遇到了一些有趣的设计范例,我们对数据库进行了一些异步调用(变量和函数名称已更改):
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);
示例用法显示针对两种不同情况对此函数的两个不同调用 - 初始登录和重新登录(技术上不是重新登录,但是对于具有不同初始值的当前登录用户重新启动应用程序状态)。
困扰我的是这两种情况下的回调函数是不同的。我习惯于看到一个函数接受回调,允许函数的用户在被调用函数的范围内提供自定义实现。
在上述情况下,回调函数会更改控制流程。根据提供的回调函数,异步调用返回后的后续调用函数是不同的。这是代码味道还是仅仅是回调的创造性用途?
答案 0 :(得分:2)
我正在将OnLogin
函数解释为启动一个操作,该操作将在完成时调用一次回调。
在这种情况下,代码实际上很正常。在异步编写程序时,这种情况并不少见。考虑到替代方案是在回调函数中使用(小)状态机保持“状态”,我认为不同的回调实际上是更优雅的解决方案。它隐式处理异步“状态”而不是显式处理。