专业编程基础技术教程

网站首页 > 基础教程 正文

一起来看看C#的圈复杂度 c# :?

ccvgpt 2024-12-26 12:11:01 基础教程 1 ℃

简介

圈复杂度是一种用于衡量程序控制流程复杂性的代码度量。在C#中,它代表了通过一个方法的代码的独立执行路径的数量,通常由诸如if-else语句、循环和switch case等分支结构决定。圈复杂度越高,代码就越难理解、测试和维护。较低的复杂度表示代码更简单、更易读。

C#方法中的圈复杂度的定义

C#方法的圈复杂度具体为 1 + {在方法体中找到的以下表达式的数量}:

一起来看看C#的圈复杂度 c# :?

if  while  for  foreach  
case  default  continue  
goto  &&  ||  catch  
ternary operator ?:  ??
and or

以下表达式不计入圈复杂度(CC)的计算:

else  do  switch  try  using  
throw  finally  return  
object creation  
method call
field access

C#中圈复杂度影响的例子

一个复杂的方法

这里展示一个复杂的方法,其中的if和else相互嵌套。关键字if使用了六次,&&使用了一次。因此,它的圈复杂度得分是8:

public static class OrderLogic {
   public static void ProcessOrder(
         int orderId, 
         bool isPriority, 
         bool isInternational, 
         bool isGift, 
         bool isCouponApplied, 
         decimal orderTotal) {
      if (orderId <= 0) {
         Console.WriteLine("无效订单号。");
         return;
      }

      if (isPriority) {
         Console.WriteLine("处理高优先级订单。");
         if (isInternational) {
            Console.WriteLine("处理国际高优先级订单。");
            if (isGift) {
               Console.WriteLine("这是一个礼物订单。");
            }
         }
      } else {
         Console.WriteLine("处理标准订单。");
         if (isInternational) {
            Console.WriteLine("处理国际标准订单。");
         }
      }

      if (isCouponApplied && orderTotal > 100) {
         Console.WriteLine("订单总金额>100,使用优惠");
      } else {
         Console.WriteLine("没有合适的优惠。");
      }
   }
}

将复杂方法重构为几个简单的方法

上述方法可以被重构为几个较不复杂的方法。在代码中,我们使用CC来指代每个方法的圈复杂度得分:

public static class OrderLogic {
   public static void ProcessOrder(
         int orderId,
         bool isPriority,
         bool isInternational,
         bool isGift,
         bool isCouponApplied,
         decimal orderTotal) { // CC 2
      if (!IsValidOrder(orderId)) return;
      ProcessOrderType(isPriority, isInternational, isGift);
      ApplyDiscountIfEligible(isCouponApplied, orderTotal);
   }
   private static bool IsValidOrder(int orderId) { // CC 2
      if (orderId <= 0) {
         Console.WriteLine("无效订单号。");
         return false;
      }
      return true;
   }
   private static void ProcessOrderType(
         bool isPriority, 
         bool isInternational, 
         bool isGift) { // CC 5
      if (isPriority) {
         Console.WriteLine("处理高优先级订单。");
         if (isInternational) {
            Console.WriteLine("处理国际高优先级订单");
         }
      } else {
         Console.WriteLine("处理标准订单。");
         if (isInternational) {
            Console.WriteLine("处理国际标准订单。");
         }
      }
      if (isGift) {
         Console.WriteLine("这是一个礼物订单。");
      }
   }
   private static void ApplyDiscountIfEligible( // CC 3
       bool isCouponApplied, 
       decimal orderTotal) {
      if (isCouponApplied && orderTotal > 100) {
         Console.WriteLine("订单总金额>100,使用优惠");
      } else {
         Console.WriteLine("没有合适的优惠。");
      }
   }
}

重构的好处:

  • 更简单的控制流:现在主方法将特定任务委托给更小、更专注的方法。
  • 更易于测试:我们可以独立测试每个较小的方法。
  • 较低的圈复杂度:复杂性分散在多个方法中,使得每个方法更容易独立理解和维护。

在C#中测量圈复杂度

如果我们不度量,就无法提高,所以使用工具评估代码复杂性是必要的。计算这个指标有助于我们识别可能需要重构以提高代码质量的区域。 如果我们是用Visual Studio,其本身就自带了此功能,就可以测量C#代码中方法的圈复杂度。如下图所示:

结论

总的来说,理解C#中的圈复杂度对于维护代码质量和管理技术债务是必要的。通过使用工具测量这个复杂度,我们可以识别需要关注的区域,并提高他们应用程序的整体健壮性。在代码中强调简洁明了将在长期内导致更易维护和更高效的软件。

Tags:

最近发表
标签列表