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

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满意? 嵌套如果语句总是坏的?

这是一种方法

 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 ); } 
 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; } 

您可以像这样拼写逻辑:

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

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

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

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

通过反转If语句的条件,可以使执行逻辑更接近条件。 考虑:

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

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