-1
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 を満足させるにはどうすればよいですか? ネストされた 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 に答える