C#中的Clean Code:可读代码编写原则与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么整洁代码是项目成功的关键?



在 .NET 平台的软件开发世界中,编写可运行的代码只是成功的一半。真正的精通体现在创建易于阅读、维护和扩展代码的能力上。整洁代码(Clean Code)概念由 Robert C. Martin 推广,是一套将混乱程序转变为清晰可理解系统的原则。对于 C# 开发者来说,遵循这些原则不仅意味着对同事的尊重,还能显著减少调试和实现新功能所花费的时间。



在本文中,我们将详细解析适用于 C# 语言和 .NET 框架的整洁代码关键原则。你将看到"糟糕"与"优秀"代码的具体示例,这将帮助你编写更高质量的应用程序。



原则 1:有意义的命名与一致的风格



变量与方法的正确命名

变量、类或方法的名称应能回答以下问题:"这是什么?"或"它做什么?"。避免使用单个字母的缩写(循环计数器除外)以及诸如 data、info、temp 等抽象名称。



糟糕示例:

public int Calc(int a, int b) // a 和 b 是什么?方法做什么?{    int d = a * b;    return d;}


优秀示例(整洁代码):

/// <summary>/// 计算矩形的面积。/// </summary>public int CalculateRectangleArea(int width, int height){    int area = width * height;    return area;}


团队内的一致性

对局部变量和参数使用 camelCase,对方法和类使用 PascalCase,对私有字段使用 _camelCase(根据主流的 .NET 指南)。这使代码具有可预测性。



public class OrderService{    private readonly IOrderRepository _orderRepository; // 私有字段

public async Task<Order> GetOrderByIdAsync(int orderId) // 方法 { var order = await _orderRepository.FindAsync(orderId); // 局部变量 return order; }}


原则 2:小函数与单一职责原则(SRP)



一个函数应只做一件事

这是整洁代码最重要的原则。如果一个方法执行多个操作(验证、日志记录、业务逻辑、保存到数据库),则难以测试和修改。将这样的方法分解成更小的方法。



糟糕示例(方法一次性完成所有操作):

public void ProcessOrder(Order order){    // 1. 验证    if (order == null || order.TotalAmount <= 0)        throw new ArgumentException("无效订单");

// 2. 日志记录 Console.WriteLine($"正在处理订单 {order.Id}");

// 3. 业务逻辑 var discount = order.TotalAmount > 100 ? 0.1m : 0; order.FinalAmount = order.TotalAmount - (order.TotalAmount * discount);

// 4. 保存 _context.Orders.Add(order); _context.SaveChanges();}


优秀示例(拆分为多个方法):

public void ProcessOrder(Order order){    ValidateOrder(order);    LogOrderProcessing(order);    ApplyDiscount(order);    SaveOrder(order);}

private void ValidateOrder(Order order){ if (order == null || order.TotalAmount <= 0) throw new ArgumentException("无效订单", nameof(order));}

private void LogOrderProcessing(Order order){ Console.WriteLine($"正在处理订单 {order.Id}");}

private void ApplyDiscount(Order order){ const decimal discountThreshold = 100m; const decimal discountRate = 0.1m;

if (order.TotalAmount > discountThreshold) { order.FinalAmount = order.TotalAmount - (order.TotalAmount * discountRate); }}

博客

书籍推荐