必须知道的 10 个 C# 代码异常以及如何修复它们

作者:微信公众号:【架构师老卢】
8-29 13:17
8

概述:编写干净且易于维护的 C# 代码是一项需要时间来培养的技能。开发人员面临的一个常见障碍是处理 “代码异味”。这些迹象表明代码中可能存在问题。以下是 10 个必须了解的 C# 代码异味以及如何修复它们。1. 长方法**问题:**太长的方法很难理解和维护。他们经常同时做太多事情。溶液:将方法分解为更小、更集中的方法。这也称为单一责任原则 (SRP)。例:public void ProcessOrder(Order order) {     ValidateOrder(order);     CalculateShipping(order);     SaveToDatabase(order

编写干净且易于维护的 C# 代码是一项需要时间来培养的技能。开发人员面临的一个常见障碍是处理 “代码异味”。这些迹象表明代码中可能存在问题。以下是 10 个必须了解的 C# 代码异味以及如何修复它们。

1. 长方法

**问题:**太长的方法很难理解和维护。他们经常同时做太多事情。溶液:将方法分解为更小、更集中的方法。这也称为单一责任原则 (SRP)。

例:

public void ProcessOrder(Order order)  
{  
    ValidateOrder(order);  
    CalculateShipping(order);  
    SaveToDatabase(order);  
}

2. 重复代码

**问题:**复制粘贴代码是一个常见的错误。它可能会导致错误并使更新更加困难。**溶液:**使用函数或方法封装重复的代码。

例:

public void PrintCustomerDetails(Customer customer)  
{  
    Console.WriteLine($"Name: {customer.Name}, Age: {customer.Age}");  
}  
  
public void PrintOrderDetails(Order order)  
{  
    Console.WriteLine($"Product: {order.Product}, Quantity: {order.Quantity}");  
}

修复:

public void PrintDetails(string label, string value)  
{  
    Console.WriteLine($"{label}: {value}");  
}

3. 大班授课

**问题:**试图做太多事情的大班级变得难以管理和理解。**溶液:**将类拆分为多个具有重点职责的较小类。

例:

public class OrderManager  
{  
    public void CreateOrder() { /* ... */ }  
    public void UpdateOrder() { /* ... */ }  
    public void DeleteOrder() { /* ... */ }  
}

修复:

public class OrderCreator  
{  
    public void CreateOrder() { /* ... */ }  
}  
  
public class OrderUpdater  
{  
    public void UpdateOrder() { /* ... */ }  
}  
  
public class OrderDeleter  
{  
    public void DeleteOrder() { /* ... */ }  
}

4. 评论

**问题:**依靠注释来解释复杂的代码是一种不好的做法。代码本身应该足够清晰。**溶液:**使用有意义的变量和方法名称编写一目了然的代码。

例:

// This method is used to add two numbers  
public int Add(int a, int b)  
{  
    return a + b;  
}

修复:

public int CalculateSum(int firstNumber, int secondNumber)  
{  
    return firstNumber + secondNumber;  
}

5. 魔术数字

**问题:**直接在代码中使用数字(如 4、8、42)而不加以解释是令人困惑且容易出错的。**溶液:**将幻数替换为命名常量。

例:

public double CalculateCircleArea(double radius)  
{  
    return 3.14 * radius * radius;  
}

修复:

private const double Pi = 3.14;  
public double CalculateCircleArea(double radius)  
{  
    return Pi * radius * radius;  
}

6. 长参数列表

**问题:**参数过多的方法很难读取和使用。**溶液:**使用参数对象或构建器模式来简化参数处理。

例:

public void CreateOrder(int userId, int productId, int quantity, int shippingMethod, DateTime orderDate)  
{  
    // ...  
}

修复:

public class OrderRequest  
{  
    public int UserId { get; set; }  
    public int ProductId { get; set; }  
    public int Quantity { get; set; }  
    public int ShippingMethod { get; set; }  
    public DateTime OrderDate { get; set; }  
}  
  
public void CreateOrder(OrderRequest orderRequest)  
{  
    // ...  
}

7. 临时字段

**问题:**仅在方法的某些部分使用但始终占用内存的临时字段。**溶液:**将临时字段移动到专门需要它们的局部变量或类。

例:

public class CustomerProcessor  
{  
    private string temporaryNote;  
  
    public void ProcessCustomer(Customer customer)  
    {  
        temporaryNote = "Processing customer";  
        Console.WriteLine(temporaryNote);  
    }  
}

修复:

public class CustomerProcessor  
{  
    public void ProcessCustomer(Customer customer)  
    {  
        string temporaryNote = "Processing customer";  
        Console.WriteLine(temporaryNote);  
    }  
}

8. 数据块

**问题:**经常一起使用但单独传递的数据集群。**溶液:**将这些数据项合并到对象中。

例:

public void ProcessCustomer(string firstName, string lastName, string address, string email)  
{  
    // ...  
}

修复:

public class CustomerData  
{  
    public string FirstName { get; set; }  
    public string LastName { get; set; }  
    public string Address { get; set; }  
    public string Email { get; set; }  
}  
  
public void ProcessCustomer(CustomerData customerData)  
{  
    // ...  
}

9. 命名不一致

**问题:**变量和方法的命名不一致或不明确会使代码难以理解。**溶液:**在整个代码库中使用一致的命名约定。

例:

public int calcTotalAmt(int price, int qty)  
{  
    return price * qty;  
}

修复:

public int CalculateTotalAmount(int price, int quantity)  
{  
    return price * quantity;  
}

10. 霰弹枪手术

**问题:**进行一个小的更改需要更改代码的许多其他部分。**溶液:**将相关更改一起分组到单个类或方法中,以定位更改的影响。

例:

public class Product  
{  
    public string Name { get; set; }  
    public double Price { get; set; }  
  
    public void UpdatePrice(double newPrice) { /* ... */ }  
    public void UpdateName(string newName) { /* ... */ }  
}

修复:

public class Product  
{  
    public string Name { get; set; }  
    public double Price { get; set; }  
  
    public void UpdateProduct(string newName, double newPrice)  
    {  
        Name = newName;  
        Price = newPrice;  
    }  
}

C# 代码异味很常见,但可以通过正确的技术来解决。通过及早发现这些问题,您可以使您的代码更易于维护和理解。

阅读排行