C#嵌套如果TDD和代码度量标准中的语句

时间:2013-09-06 18:43:51

标签: c# .net

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

根据代码指标测量,这个功能非常糟糕,根据干净的代码开发,这个功能不利于测试。 我能做些什么来使Code Metrics和TDD满意?嵌套如果语句总是坏的?

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

你可以像这样拼写逻辑:

public void AccessPermissions(User user)
{
    if (user.Age < 18)
    {
        AcceessDenied();
    }
    else if (!user.IsRegistred)
    {
        AccessGrantLevel1();
    }
    else if (!user.IsPowerfull)
    {
        AcessGrantLevel2();
    }
    else
    {
        AccessGrantLevel3();
    }
}

答案 2 :(得分:2)

无需嵌套即可轻松重写。

public void AccessPermissions(User user)
{
   if (user.Age < 18)
   {
       AcceessDenied();
   }
   else if (!user.IsRegistred)
   {
       AccessGrantLevel1();
   }
   else if (user.IsPowerfull)
   {
       AcessGrantLevel3();
   }
   else
   {
       AccessGrantLevel2();
   }
}

答案 3 :(得分: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();
    }
}

最终,本页其他方法中的任何一个例子都可以进行一些调整......这个概念仍然表明你的目标应该是通过颠倒你的条件来减少或消除嵌套。

答案 4 :(得分:-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 );
}