编写干净且易于维护的 C# 代码是一项需要时间来培养的技能。开发人员面临的一个常见障碍是处理 “代码异味”。这些迹象表明代码中可能存在问题。以下是 10 个必须了解的 C# 代码异味以及如何修复它们。
**问题:**太长的方法很难理解和维护。他们经常同时做太多事情。溶液:将方法分解为更小、更集中的方法。这也称为单一责任原则 (SRP)。
public void ProcessOrder(Order order)
{
ValidateOrder(order);
CalculateShipping(order);
SaveToDatabase(order);
}
**问题:**复制粘贴代码是一个常见的错误。它可能会导致错误并使更新更加困难。**溶液:**使用函数或方法封装重复的代码。
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}");
}
**问题:**试图做太多事情的大班级变得难以管理和理解。**溶液:**将类拆分为多个具有重点职责的较小类。
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() { /* ... */ }
}
**问题:**依靠注释来解释复杂的代码是一种不好的做法。代码本身应该足够清晰。**溶液:**使用有意义的变量和方法名称编写一目了然的代码。
// 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;
}
**问题:**直接在代码中使用数字(如 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;
}
**问题:**参数过多的方法很难读取和使用。**溶液:**使用参数对象或构建器模式来简化参数处理。
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)
{
// ...
}
**问题:**仅在方法的某些部分使用但始终占用内存的临时字段。**溶液:**将临时字段移动到专门需要它们的局部变量或类。
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);
}
}
**问题:**经常一起使用但单独传递的数据集群。**溶液:**将这些数据项合并到对象中。
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)
{
// ...
}
**问题:**变量和方法的命名不一致或不明确会使代码难以理解。**溶液:**在整个代码库中使用一致的命名约定。
public int calcTotalAmt(int price, int qty)
{
return price * qty;
}
修复:
public int CalculateTotalAmount(int price, int quantity)
{
return price * quantity;
}
**问题:**进行一个小的更改需要更改代码的许多其他部分。**溶液:**将相关更改一起分组到单个类或方法中,以定位更改的影响。
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# 代码异味很常见,但可以通过正确的技术来解决。通过及早发现这些问题,您可以使您的代码更易于维护和理解。