c# - 是否可以重构内部没有太多逻辑的嵌套 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");
}
}
}
解决方案
首先,你需要观察类似的动作,你可以从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 语句使代码更具可读性。
推荐阅读
- javascript - 如何检查数组中的特定键在每个索引处是否为空?
- javascript - 通过用字母对替换所有出现的单词来创建新单词
- java - 如何设计享元模式?
- python - Python:将数据导入 Access 表时,除了 pyodbc 或解决方法之外的其他方法
- android - android 应用在 Rxjava2 之上使用 Flow/coroutine
- next.js - Next JS 中的 Font Awesome 6 (beta) 和动态图标名称
- python - cmd控制台在后台运行
- c# - Bot Framework Composer Skill Host Endpoint 401 Unauthorized
- nested - (Wald)比较两个嵌套的 feols/plm 模型的测试
- javascript - 更改其中的变量而不重新定义函数