mi-assessment/docs/开发规范/1-编程规约/1.1-命名风格.md
2026-02-03 20:50:51 +08:00

740 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 1.1 命名风格
---
## 1. 通用命名原则
- 使用有意义且可读的名称
```csharp
// ❌ 不建议:缩写和无意义的名称
var d = DateTime.Now;
var usr = new User();
int n = 100;
// ✅ 建议:清晰表达意图
var currentDate = DateTime.Now;
var newUser = new User();
int maxRetryCount = 100;
```
- 不建议使用拼音和中文
```csharp
// ❌ 不建议
var yongHu = new User();
string xingMing = "张三";
var keHuMingCheng = "张三";
var 订单数量 = 10;
// ✅ 建议
var user = new User();
string fullName = "张三";
```
- 不建议过度缩写
```csharp
// ❌ 不建议
var cSvc = new CustomerService();
var ordMgr = new OrderManager();
// ✅ 建议
var customerService = new CustomerService();
var orderManager = new OrderManager();
// ✅ 可接受含义广为人知的缩写
var customerId = 1; // Id
var htmlContent = ""; // Html
var xmlDocument = ""; // Xml
var urlAddress = ""; // Url
var httpClient = new HttpClient(); // Http
```
- 不建议使用下划线开头(除私有字段外)
```csharp
// ❌ 不建议
public string _customerName;
public void _ProcessOrder() { }
// ✅ 建议
public string CustomerName { get; set; }
private string _customerName; // 私有字段可以使用
public void ProcessOrder() { }
```
## 2. 命名约定
### 2.1 类
- 使用 PascalCase帕斯卡命名法
```csharp
// ✅ 建议的类命名
public class Customer { }
public class OrderService { }
public class ProductRepository { }
public class PaymentProcessor { }
```
- 使用名词或名词短语
```csharp
// ✅ 建议:名词形式
public class Invoice { }
public class ShoppingCart { }
public class UserProfile { }
public class EmailValidator { }
public class UserAuthentication { }
// ❌ 不建议:动词形式
public class ProcessOrder { } // 应该是 OrderProcessor
public class ValidateUser { } // 应该是 UserValidator
public class Calculate { } // 适用于方法命名
```
- 建议的命名方式
```csharp
// 服务类
// ✅ 以 Service 结尾
public class CustomerService { }
public class EmailService { }
// ✅ 以职责命名
public class OrderProcessor { }
public class EmailSender { }
public class PaymentGateway { }
public class CacheManager { }
// 仓储类
// ✅ 以 Repository 结尾
public class OrderRepository { }
public class ProductRepository { }
// ✅ Provider
public class AuthenticationProvider { }
public class DataProvider { }
// ✅ Helper/Utility
public class StringHelper { }
public class DateTimeUtility { }
// 异常类
// ✅ 以 Exception 结尾
public class OrderNotFoundException { }
public class InvalidOperationException { }
// ✅ Attribute
public class ValidateAttribute { }
public class AuthorizeAttribute { }
// ✅ DTO/ViewModel
public class CustomerDto { }
public class OrderViewModel { }
public class CreateProductRequest { }
public class ProductResponse { }
public class DoSomethingInput { }
public class DoSomethingOutput { }
// ✅ Entity/Model
public class Order { }
public class Product { }
public class Customer { }
// 验证器
// ✅ 以 Validator 结尾
public class OrderValidator { }
public class EmailValidator { }
public class CreateOrderRequestValidator { }
```
- 不建议的命名方式
```csharp
// ❌ 不建议:使用下划线或特殊字符
public class Order_Service { }
public class Product$Manager { }
// ❌ 不建议:使用前缀
public class COrder { }
public class TCustomer { }
// ❌ 不建议:过于通用
public class Data { }
public class Info { }
public class Manager { } // 太宽泛,应该是具体的 xxxManager
```
### 2.2 接口
- 使用 `I` 前缀 + PascalCase
```csharp
// ✅ 正确的接口命名
public interface ICustomerService { }
public interface IOrderRepository { }
public interface IPaymentProcessor { }
public interface ILogger { }
```
- 使用名词、名词短语或形容词
```csharp
// ✅ 建议:名词 (一般表示为业务接口)
public interface IRepository<T> { }
public interface IValidator { }
public interface IOrderService { }
public interface ILogger { }
public interface ICache { }
// ✅ 建议:形容词(一般表示为能力接口)
public interface IComparable { }
public interface IDisposable { }
public interface IEnumerable { }
public interface IQueryable { }
// ✅ 建议:名词短语
public interface IDataAccess { }
public interface IUserAuthentication { }
```
- 避免使用 Interface 后缀
```csharp
// ❌ 不建议
public interface IOrderServiceInterface { }
// ✅ 建议
public interface IOrderService { }
```
### 2.3 方法
- 使用 PascalCase
```csharp
public class CustomerService
{
// ✅ 建议
public void CreateCustomer() { }
public Customer GetCustomerById(int id) { }
public void UpdateCustomerProfile() { }
public void DeleteCustomer() { }
}
```
- 使用动词或动词短语
```csharp
// ✅ 建议:明确、清晰的动作
public void CreateOrder() { }
public void UpdateCustomer() { }
public void DeleteProduct() { }
public Order GetOrderById(int id) { }
public List<Order> GetOrdersByCustomer(int customerId) { }
public bool ValidateEmail(string email) { }
public decimal CalculateDiscount(Order order) { }
// ❌ 不建议:名词形式
public void Order() { } // 应该是 CreateOrder 或 ProcessOrder
public void Customer() { }
```
- 常用动词前缀
```csharp
// Get - 获取数据(通常有返回值)
public Customer GetCustomerById(int id) { }
public List<Order> GetOrders() { }
// Find - 查找数据(可能返回 null
public Customer? FindCustomerByEmail(string email) { }
// Create/Add - 创建新对象
public void CreateOrder(Order order) { }
public void AddProduct(Product product) { }
// Update/Modify - 更新现有对象
public void UpdateCustomer(Customer customer) { }
public void ModifyOrderStatus(int orderId, OrderStatus status) { }
// Delete/Remove - 删除对象
public void DeleteOrder(int orderId) { }
public void RemoveProduct(int productId) { }
// Save - 保存(创建或更新)
public void SaveCustomer(Customer customer) { }
// Validate - 验证
public bool ValidateOrder(Order order) { }
public ValidationResult ValidateInput(string input) { }
// Calculate/Compute - 计算
public decimal CalculateTotal(List<OrderItem> items) { }
public int ComputeAge(DateTime birthDate) { }
// Process/Handle - 处理
public void ProcessOrder(Order order) { }
public void ProcessPayment(Payment payment) { }
// 布尔判断
// ✅ 建议: 使用 Is、Has、Can、Should 等前缀更能提高可读性
public bool IsValid() { }
public bool IsActive() { }
public bool HasPermission() { }
public bool CanProcess() { }
public bool ShouldRetry() { }
public bool Exists(int id) { }
public bool Contains(string value) { }
// ❌ 不建议:不清晰的命名
public bool Valid() { }
public bool Active() { }
public bool Permission() { }
// Convert/Transform - 转换
public OrderDto ConvertToDto(Order order) { }
public string TransformToJson(object obj) { }
// Send/Receive - 发送/接收
public void SendNotification(string message) { }
public Message ReceiveMessage() { }
``
- 常用查询方法命名方式
```csharp
// ✅ 单个对象
public Customer GetCustomerById(int id) { }
public Order FindOrderByNumber(string orderNumber) { }
// ✅ 集合
public List<Customer> GetAllCustomers() { }
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { }
public List<Product> FindProductsByCategory(string category) { }
// ✅ 条件查询
public List<Order> GetActiveOrders() { }
public List<Customer> GetVipCustomers() { }
// ✅ 分页查询
public PagedResult<Product> GetProducts(int pageIndex, int pageSize) { }
public List<Order> GetOrdersByPage(int pageNumber, int pageSize) { }
```
- 私有方法也应该使用 PascalCase
```csharp
public class OrderProcessor
{
// ✅ 私有方法也使用 PascalCase
private void ValidateOrderItems(Order order) { }
private decimal CalculateItemTotal(OrderItem item) { }
private bool CheckInventory(int productId) { }
}
```
### 2.4 属性与字段
- 属性使用 PascalCase
```csharp
public class Customer
{
// ✅ 建议的属性命名
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public DateTime CreatedDate { get; set; }
public bool IsActive { get; set; }
public decimal TotalAmount { get; set; }
}
```
- 私有字段使用 _camelCase
```csharp
public class OrderService
{
// ✅ 建议的私有字段命名
private readonly IOrderRepository _orderRepository;
private readonly ILogger<OrderService> _logger;
private readonly IEmailService _emailService;
private int _retryCount;
private bool _isProcessing;
}
```
- 只读字段
```csharp
public class Configuration
{
// ✅ 公共只读字段使用 PascalCase
public readonly string DefaultCulture = "zh-CN"; //(公共只读字段建议改为属性方式使用)
// ✅ 私有只读字段使用 _camelCase
private readonly string _connectionString;
private readonly int _maxRetryCount;
}
```
- 静态字段
```csharp
public class AppConstants
{
// ✅ 公共静态字段使用 PascalCase
public static readonly int MaxPageSize = 100;
public static readonly string DefaultDateFormat = "yyyy-MM-dd";
// ✅ 私有静态字段使用 _camelCase
private static readonly object _lockObject = new object();
}
```
- 布尔属性
```csharp
public class Order
{
// ✅ 建议使用 Is、Has、Can 等前缀提高可读性
public bool IsCompleted { get; set; }
public bool IsPaid { get; set; }
public bool HasDiscount { get; set; }
public bool CanBeCancelled { get; set; }
// ❌ 不建议
public bool Completed { get; set; }
public bool Paid { get; set; }
}
```
- 集合属性
```csharp
public class Order
{
// ✅ 建议:使用复数形式
public List<OrderItem> Items { get; set; }
public ICollection<Payment> Payments { get; set; }
public IEnumerable<Comment> Comments { get; set; }
// ❌ 不建议:使用单数
public List<OrderItem> Item { get; set; }
}
```
### 2.5 变量与参数
- 局部变量使用 camelCase
```csharp
public void ProcessOrder(int orderId)
{
// ✅ 建议的局部变量命名
var order = GetOrder(orderId);
var totalAmount = CalculateTotal(order);
var discountRate = GetDiscountRate(order);
var finalPrice = totalAmount * (1 - discountRate);
var isValid = ValidateOrder(order);
}
```
- 方法参数使用 camelCase
```csharp
// ✅ 建议的参数命名
public Order CreateOrder(int customerId, List<OrderItem> items, decimal discountAmount, string shippingAddress)
{
// ...existing code...
}
// ✅ 布尔参数命名
public List<Order> GetOrders(int customerId, bool includeCompleted, bool includeCancelled)
{
// ...existing code...
}
```
- 循环变量命名
```csharp
// ✅ 简单循环可以使用单字母
for (int i = 0; i < orders.Count; i++)
{
// ...existing code...
}
// 有意义的循环变量
foreach (var order in orders)
{
ProcessOrder(order);
}
foreach (var item in order.Items)
{
ValidateItem(item);
}
// 不建议不清晰的变量名
foreach (var o in orders) // o 不如 order 清晰
{
// ...existing code...
}
```
- LINQ 查询变量命名
```csharp
// 建议
var activeCustomers = customers
.Where(c => c.IsActive)
.ToList();
var customerOrders = orders
.Where(o => o.CustomerId == customerId)
.OrderByDescending(o => o.CreatedDate)
.ToList();
// 建议复杂查询使用有意义的变量
var highValueOrders = orders
.Where(order => order.TotalAmount > 1000)
.Select(order => new
{
OrderId = order.Id,
CustomerName = order.Customer.Name,
TotalAmount = order.TotalAmount
})
.ToList();
```
- 临时变量命名
```csharp
public decimal CalculateOrderTotal(Order order)
{
// ✅ 建议:清晰的临时变量
var subtotal = order.Items.Sum(item => item.Price * item.Quantity);
var taxAmount = subtotal * 0.1m;
var shippingFee = CalculateShippingFee(order);
var discountAmount = CalculateDiscount(order, subtotal);
var total = subtotal + taxAmount + shippingFee - discountAmount;
return total;
}
```
- 避免使用无意义的变量名
```csharp
// ❌ 不建议
var temp = GetCustomer();
var data = ProcessData();
var obj = CreateObject();
var result = DoSomething();
// ✅ 建议
var customer = GetCustomer();
var processedOrders = ProcessOrders();
var paymentRecord = CreatePaymentRecord();
var validationResult = ValidateInput();
```
### 2.6 常量与枚举
- 常量命名
```csharp
// ✅ 方式一PascalCase推荐
public class OrderConstants
{
public const int MaxItemsPerOrder = 100;
public const decimal MinOrderAmount = 10.0m;
public const string DefaultCurrency = "CNY";
}
// ✅ 方式二UPPER_CASEC# 中较少使用)
public class AppSettings
{
public const int MAX_RETRY_COUNT = 3;
public const string DEFAULT_CULTURE = "zh-CN";
}
// ✅ 私有常量
private const int MaxRetryAttempts = 3;
private const string ErrorMessageTemplate = "处理订单 {0} 时发生错误";
```
- 枚举命名
```csharp
// ✅ 枚举类型使用 PascalCase单数形式
public enum OrderStatus
{
Pending, // 枚举值使用 PascalCase
Processing,
Completed,
Cancelled,
Refunded
}
// ✅ 标志枚举使用复数
[Flags]
public enum UserPermissions
{
None = 0,
Read = 1,
Write = 2,
Delete = 4,
Admin = 8
}
// ❌ 不建议:使用复数(非标志枚举)
public enum OrderStatuses { }
// ❌ 不建议:枚举值使用前缀
public enum OrderStatus
{
OrderStatusPending, // 不需要前缀
OrderStatusCompleted
}
```
- 常量类组织
```csharp
// ✅ 按功能组织常量
public static class ValidationConstants
{
public const int MinPasswordLength = 8;
public const int MaxPasswordLength = 50;
public const int MinUsernameLength = 3;
public const int MaxUsernameLength = 20;
}
public static class CacheKeys
{
public const string CustomerPrefix = "customer_";
public const string OrderPrefix = "order_";
public const string ProductPrefix = "product_";
}
public static class ErrorCodes
{
public const string OrderNotFound = "ORDER_NOT_FOUND";
public const string InsufficientStock = "INSUFFICIENT_STOCK";
public const string PaymentFailed = "PAYMENT_FAILED";
}
```
### 2.7 布尔类型
- 使用肯定的命名方式
```csharp
// ✅ 建议:肯定形式
public bool IsActive { get; set; }
public bool IsEnabled { get; set; }
public bool HasPermission { get; set; }
public bool CanEdit { get; set; }
// ❌ 不建议:否定形式(增加理解难度)
public bool IsNotActive { get; set; }
public bool IsDisabled { get; set; }
```
- 常用布尔命名前缀
```csharp
public class Order
{
// Is - 状态判断
public bool IsCompleted { get; set; }
public bool IsValid { get; set; }
public bool IsPaid { get; set; }
// Has - 拥有判断
public bool HasDiscount { get; set; }
public bool HasShipped { get; set; }
// Can - 能力判断
public bool CanBeCancelled { get; set; }
public bool CanBeRefunded { get; set; }
// Should - 应该判断
public bool ShouldSendEmail { get; set; }
public bool ShouldApplyDiscount { get; set; }
}
```
- 布尔方法命名
```csharp
public class OrderValidator
{
// ✅ 建议
public bool IsValidOrder(Order order) { }
public bool HasSufficientStock(int productId, int quantity) { }
public bool CanProcessPayment(Payment payment) { }
public bool Exists(int orderId) { }
// ✅ 验证方法也可以使用 Validate 开头,返回 bool
public bool ValidateOrderItems(Order order) { }
}
```
### 2.8 集合类型
- 使用复数形式
```csharp
public class Customer
{
// ✅ 建议:使用复数
public List<Order> Orders { get; set; }
public ICollection<Address> Addresses { get; set; }
public IEnumerable<Payment> Payments { get; set; }
// ❌ 不建议
public List<Order> OrderList { get; set; } // 不需要 List 后缀
public List<Order> Order { get; set; } // 应使用复数
}
```
- 集合局部变量命名
```csharp
public void ProcessOrders()
{
// ✅ 建议
var orders = GetOrders();
var activeOrders = orders.Where(o => o.IsActive).ToList();
var orderIds = orders.Select(o => o.Id).ToList();
var customerNames = customers.Select(c => c.Name).ToList();
// ❌ 不建议
var orderDictionary = orders.ToDictionary(o => o.Id);
var customersByEmail = customers.ToDictionary(c => c.Email);
}
```
- 特殊集合命名
```csharp
// ✅ 字典
private readonly Dictionary<int, Order> _orderCache;
private readonly ConcurrentDictionary<string, Customer> _customerLookup;
// ✅ 队列
private readonly Queue<OrderMessage> _orderQueue;
private readonly ConcurrentQueue<Task> _taskQueue;
// ✅ 堆栈
private readonly Stack<Command> _commandHistory;
```
### 2.9 异步方法
- 使用 `Async` 后缀
```csharp
// ✅ 异步方法使用 Async 后缀
public async Task<Order> GetOrderAsync(int orderId)
{
return await _repository.GetByIdAsync(orderId);
}
public async Task<List<Order>> GetOrdersAsync(int customerId)
{
return await _repository.GetOrdersByCustomerAsync(customerId);
}
public async Task CreateOrderAsync(CreateOrderRequest request)
{
await _repository.AddAsync(MapToOrder(request));
}
public async Task UpdateOrderAsync(Order order)
{
await _repository.UpdateAsync(order);
}
public async Task DeleteOrderAsync(int orderId)
{
await _repository.DeleteAsync(orderId);
}
```
- 异步方法返回类型
```csharp
// ✅ 返回 Task
public async Task SendEmailAsync(string to, string subject)
{
await _emailService.SendAsync(to, subject);
}
// ✅ 返回 Task<T>
public async Task<bool> ValidateOrderAsync(Order order)
{
return await _validator.ValidateAsync(order);
}
// ✅ 返回 ValueTask性能敏感场景
public async ValueTask<int> GetCachedCountAsync()
{
if (_cache.TryGetValue("count", out int count))
{
return count;
}
return await _repository.GetCountAsync();
}
// ❌ 错误:避免使用 async void除事件处理程序外
public async void ProcessOrderAsync(int orderId) // 错误!
{
await _service.ProcessAsync(orderId);
}
```