2 分钟阅读

你的 Bug 可能正是别人的功能

软件工程的魔幻定律(14)


Part V:编码与设计原则

这一类更像是可操作的工程原则,而不是描述性的规律,但它们在实践中的指导价值同样巨大。

DRY、KISS 和 YAGNI:三位一体的简洁哲学

  • DRY(Don’t Repeat Yourself):同一知识在系统中只应有一个权威来源。重复的代码意味着重复的维护成本,更危险的是,修改时漏掉了某个副本。

  • KISS(Keep It Simple, Stupid):能用简单方案解决的,不要引入复杂方案。复杂度有隐藏成本:学习曲线、调试难度、演化阻力。
  • YAGNI(You Aren’t Gonna Need It):不要实现当前不需要的功能。过度的"前瞻性设计"往往是在为一个永远不会到来的未来付出现实的代价。

三者之间有微妙的张力:DRY 有时会引入不必要的抽象(违反 KISS);KISS 有时意味着接受一定程度的重复(违反 DRY)。判断何时遵循哪条原则,需要具体场景的工程判断,没有放之四海皆准的答案。


Law of Demeter:最少知识原则

这条 1987 年提出的原则说:一个对象应该只与它的直接邻居交互,而不应该通过链式调用深入到邻居的内部。

1
2
3
4
5
// 违反 Law of Demeter
order.getCustomer().getAddress().getCity()

// 符合 Law of Demeter
order.getCustomerCity()

这不仅是代码风格的问题,而是耦合度的问题。链式调用意味着当前代码对整个调用链上的每个中间对象的内部结构都产生了依赖。任何一处改变都可能波及到这里。