-1
public void AccessPermissions(User user)
{
   if (user.Age >= 18)
   {
      if (user.IsRegistred)
      {
         if (user.IsPowerfull)
         {
             AcessGrantLevel3();
         }
         else
         {
             AccessGrantLevel2();
         }
      }
      else
      {
         AccessGrantLevel1();
      }
   }
   else
   {
       AcceessDenied();
   }
}

根据代码度量测量,此功能非常糟糕,根据干净代码开发,此功能不利于测试。我可以做些什么来让代码度量和 TDD 满意?嵌套的 If 语句总是不好的吗?

4

5 回答 5

3
public void AccessPermissions(User user)
{
    if(user.Age<18)
    {
        AccessDenied();
        return;
    }
    if(user.IsPowerfull && user.IsRegistered)
    {
        AccessGrantLevel3();
        return;
    }
    if(user.IsRegistered)
    {
        AccessGrantLevel2();
        return;
    }
    AccessGrantLevel1();
    return;
}
于 2013-09-06T18:51:55.560 回答
2

您可以像这样展平逻辑:

public void AccessPermissions(User user)
{
    if (user.Age < 18)
    {
        AcceessDenied();
    }
    else if (!user.IsRegistred)
    {
        AccessGrantLevel1();
    }
    else if (!user.IsPowerfull)
    {
        AcessGrantLevel2();
    }
    else
    {
        AccessGrantLevel3();
    }
}
于 2013-09-06T18:49:59.997 回答
2

它可以很容易地重写而无需嵌套。

public void AccessPermissions(User user)
{
   if (user.Age < 18)
   {
       AcceessDenied();
   }
   else if (!user.IsRegistred)
   {
       AccessGrantLevel1();
   }
   else if (user.IsPowerfull)
   {
       AcessGrantLevel3();
   }
   else
   {
       AccessGrantLevel2();
   }
}
于 2013-09-06T18:50:21.047 回答
0

这是一个偏好问题,但大多数人认为嵌套 if 语句的可读性较低且难以维护,因为要执行的代码与导致它的语句相距甚远。

通过反转 If 语句的条件,您可以将执行逻辑移近条件。考虑:

public void AccessPermissions(User user)
{
    if (!(user.Age >= 18))
    {
        AcccessDenied();
    }
    else if (!user.IsRegistered)
    {
        AccessGrantLevel1();
    }
    else if (!user.IsPowerfull)
    {
        AccessGrantLevel2();
    }
    else
    {
        AccessGrantLevel3();
    }
}

最终,此页面上其他方法的多个示例中的任何一个都可以进行一些调整......这个概念仍然认为您的目标应该是通过反转条件来减少或消除嵌套。

于 2013-09-06T18:47:18.873 回答
-1

这是一种方法

public void AccessPermissions(User user)
{
    int UserLevel = 0;

UserLevel += (user.Age>=18) ? 1:0;      // Add 1 if user is over 18
UserLevel += (user.IsIsRegistred) ? 1:0;    // If registered, add another 1
UserLevel += (user.IsPowerFull) ? 1:0;      // Add another 1 if powerful

AccessGrantLevel( UserLevel );
}
于 2013-09-06T18:57:00.797 回答