
命名是代码艺术中最基础也最容易被忽视的环节。一个好的命名应该自解释,无需额外注释即可传达意图。
反例:
def p(d, r):
t = 0
for i in d:
t += i * r
return t正例:
def calculate_weighted_sum(values: List[float], rate: float) -> float:
"""计算加权和:Σ(value * rate)"""
total = 0.0
for value in values:
total += value * rate
return total正例中,函数名和参数名直接说明了“做什么”,返回类型注解和文档字符串进一步增强了可读性。变量 total 而非 t,让累加逻辑一目了然。
命名原则:
calculate_total 而非 calc 或 do。is_、has_ 前缀。usr → user,idx → index),除非是领域通用术语。抽象的艺术在于隐藏细节、暴露意图。过度的抽象会引入不必要的复杂性,而不足的抽象则会导致代码重复和耦合。
函数级别的抽象:一个函数只做一件事。
// 坏抽象:一个函数做了三件事
public void processOrder(Order order) {
// 1. 验证库存
for (Item item : order.items) {
if (inventory.get(item.id) < item.quantity) {
throw new InsufficientStockException();
}
}
// 2. 计算总价
double total = 0;
for (Item item : order.items) {
total += item.price * item.quantity;
}
// 3. 生成发票
invoiceService.generate(order, total);
}
// 好抽象:三个清晰、可复用的函数
public void processOrder(Order order) {
validateInventory(order);
double total = calculateTotal(order);
generateInvoice(order, total);
}类级别的抽象:遵循单一职责原则(SRP),一个类应只有一个变化的原因。将 OrderProcessor 拆分为 InventoryValidator、PriceCalculator、InvoiceGenerator 三个独立服务,每个都易于测试和替换。
注释的艺术在于补充代码无法表达的信息,而非重复代码逻辑。
坏注释(冗余):
// 将 count 增加 1
count++;好注释(解释意图):
// 在并发环境下,使用 atomic 操作确保 count 线程安全
// 此处采用 CAS(Compare And Swap)实现乐观锁
atomicCount.incrementAndGet();对于复杂的业务规则或算法选择,注释应说明上下文和决策依据。例如:“采用快速排序而非归并排序,因为输入数据量小且内存受限”——这种注释比代码本身更有价值。
测试并非事后补充,而是代码设计的有机组成部分。可测试的代码往往是好设计的代码,因为它迫使模块解耦并依赖抽象。
单元测试示例(JUnit 5):
@Test
void shouldApplySeniorDiscount() {
// Arrange
Customer senior = new Customer(age = 65);
Order order = new Order(100.0, customer = senior);
DiscountService service = new DiscountService();
// Act
double finalPrice = service.applyDiscount(order);
// Assert
assertEquals(90.0, finalPrice, 0.01);
}Gherkin 语言(Given-When-Then)结构让测试用例同时作为文档。良好的测试覆盖率是代码重构的信心保障。
测试金字塔:大量单元测试(快速、隔离)→ 适度集成测试(模块间交互)→ 少量端到端测试(完整业务流程)。遵循这一分层,可最大化测试ROI。
设计模式是代码艺术的词汇库,但滥用模式比不用更糟糕。选择模式的准则是:当且仅当它能降低当前或未来的维护成本。
策略模式示例:支付方式的选择。
interface PaymentStrategy {
pay(amount: number): void;
}
class CreditCardPayment implements PaymentStrategy {
pay(amount: number) { /* 信用卡支付逻辑 */ }
}
class WeChatPayment implements PaymentStrategy {
pay(amount: number) { /* 微信支付逻辑 */ }
}
class PaymentContext {
private strategy: PaymentStrategy;
setStrategy(strategy: PaymentStrategy) { this.strategy = strategy; }
executePayment(amount: number) { this.strategy.pay(amount); }
}策略模式将算法与上下文解耦,新增支付方式时无需修改现有代码,符合开闭原则。
代码艺术的最终形态诞生于团队协作与持续反馈。代码审查(Code Review)不仅是寻找 Bug,更是知识传递和设计碰撞的平台。
代码的艺术,最终是对人类认知成本的尊重。我们写的每一行代码,都将被他人阅读、修改、维护——包括六个月后的你自己。好的代码像一首清晰的诗:结构分明、节奏优雅、意图直白。从命名到抽象,从测试到模式,每一个维度都在为“可演进”这个终极目标服务。
在 AI 辅助编程日益普及的今天,代码的艺术不仅没有贬值,反而更加珍贵——因为 AI 可以生成代码,但只有人类能够判断什么样的代码才是真正优美且可持续的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。