首页 > 解决方案 > 是否可以重构内部没有太多逻辑的嵌套 if 语句?

问题描述

是否可以重构以下代码?因为没有太多逻辑,但有很多if陈述。或者我无能为力,因为大多数代码都包含if/else语句?

public async Task<IActionResult> Login(string returnUrl) 
{
    if (User?.Identity.IsAuthenticated == true)
    {
        if (await _urlService.AccessCodeInUrlExistsAsync(returnUrl))
        {
            string accessCode = await _urlService.GetAccessCodeFromUrlAsync(returnUrl);

            if (await _authService.AccessCodeBelongsToAuthenticatedUserAsync(accessCode))
            {
                return RedirectToAction("Index");
            }
            else
            {
                await _authService.LogoutAsync(accessCode);
                return RedirectToAction("GetAccessCode");
            }
        }
        else
        {
            return RedirectToAction("Index");
        }                
    }
    else
    {
        if (await _urlService.AccessCodeInUrlExistsAsync(returnUrl))
        {
            string accessCode = await _urlService.GetAccessCodeFromUrlAsync(returnUrl);

            await _authService.LoginAsync(accessCode);
            return RedirectToAction("Index");
        }
        else
        {
            return RedirectToAction("GetAccessCode");
        }
    }
}

标签: c#

解决方案


首先,你需要观察类似的动作,你可以从if块中取出。这里:

if (await _urlService.AccessCodeInUrlExistsAsync(returnUrl))
{
    string accessCode = await _urlService.GetAccessCodeFromUrlAsync(returnUrl);

可以取出来。

此外,User?.Identity.IsAuthenticated可以存储在变量中,并if有望减少一个:

var userAuthenticated = User?.Identity.IsAuthenticated ?? false;
// This call exists in both branches of if, thus we could take it out.
var accessCodeInUrExists = await _urlService.AccessCodeInUrlExistsAsync(returnUrl);

string accessCode = accessCodeInUrExists ? await _urlService.GetAccessCodeFromUrlAsync(returnUrl) : null;

if ( userAuthenticated && accessCode != null)
{
    var accessCodeVerification = await _authService.AccessCodeBelongsToAuthenticatedUserAsync(accessCode);

    if(accessCodeVerification)
        return RedirectToAction("Index");

    await _authService.LogoutAsync(accessCode);
    return RedirectToAction("GetAccessCode");
}
else if( accessCode != null)
{
    await _authService.LoginAsync(accessCode);
    return RedirectToAction("Index");
}
else
{
    return RedirectToAction("GetAccessCode");
}

请记住,我只是为了演示目的而这样做的,您需要仔细测试,如果这可以正常工作。

我设法减少了条件指令的数量,并希望通过简单的 if 语句使代码更具可读性。


推荐阅读