| name | KISS原则 |
| description | Keep It Simple, Stupid - 保持简单,避免不必要的复杂性。简单的设计更易理解、维护和扩展。 |
| license | MIT |
KISS 原则 (Keep It Simple, Stupid)
概述
KISS 原则源自美国海军1960年代的设计理念:大多数系统保持简单而非复杂时运行得最好。
核心思想:
- 简单是设计的首要目标
- 不要为了炫技而增加复杂性
- 能用简单方案解决的问题,不要用复杂方案
- 复杂性是软件最大的敌人
复杂性的代价:
- 理解时间增加
- bug 更多、更难定位
- 新人上手困难
- 维护成本成倍增长
过度工程示例
public interface NumberClassifier {
boolean classify(int number);
}
public class EvenNumberClassifier implements NumberClassifier {
@Override
public boolean classify(int number) { return number % 2 == 0; }
}
public class NumberClassifierFactory {
public static NumberClassifier create(String type) {
if ("even".equals(type)) return new EvenNumberClassifier();
throw new IllegalArgumentException("Unknown type: " + type);
}
}
NumberClassifier classifier = NumberClassifierFactory.create("even");
boolean result = classifier.classify(4);
public boolean isEven(int number) {
return number % 2 == 0;
}
from abc import ABC, abstractmethod
class ComparatorStrategy(ABC):
@abstractmethod
def compare(self, a, b): pass
class MaxComparator(ComparatorStrategy):
def compare(self, a, b):
return a if a > b else b
class AggregatorService:
def __init__(self, strategy: ComparatorStrategy):
self.strategy = strategy
def aggregate(self, numbers):
result = numbers[0]
for n in numbers[1:]:
result = self.strategy.compare(result, n)
return result
service = AggregatorService(MaxComparator())
result = service.aggregate([1, 5, 3, 9, 2])
result = max([1, 5, 3, 9, 2])
代码简化示例
function getDiscount(user: User): number {
let discount = 0;
if (user.isPremium) {
if (user.years > 5) {
if (user.orders > 100) {
discount = 0.3;
} else {
discount = 0.2;
}
} else {
discount = 0.1;
}
} else {
if (user.orders > 50) {
discount = 0.05;
}
}
return discount;
}
function getDiscount(user: User): number {
if (!user.isPremium && user.orders > 50) return 0.05;
if (!user.isPremium) return 0;
if (user.years > 5 && user.orders > 100) return 0.3;
if (user.years > 5) return 0.2;
return 0.1;
}
public interface StringFormatter {
String format(String input);
}
public class UpperCaseFormatter implements StringFormatter {
public String format(String input) { return input.toUpperCase(); }
}
public class FormatterService {
private StringFormatter formatter;
public String process(String input) { return formatter.format(input); }
}
String result = input.toUpperCase();
何时简单是"太简单了"
KISS 不等于偷懒:
❌ 没有错误处理
❌ 没有输入验证(在系统边界)
❌ 把所有逻辑塞在一个方法里
❌ 用全局变量代替参数传递
KISS 是关于"恰到好处"的复杂度:
✅ 满足当前需求
✅ 代码可读
✅ 逻辑清晰
✅ 容易修改
复杂性检测
代码复杂性信号:
□ 方法超过 20 行
□ 嵌套超过 3 层
□ 参数超过 4 个
□ 一个方法中有超过 3 个 if-else
□ 类超过 200 行
□ 需要画图才能理解流程
□ 注释比代码多(说明代码不够清晰)
□ 使用了团队成员不熟悉的设计模式
优缺点分析
✅ 优点
- 易于理解 - 新人能快速上手
- 易于维护 - bug 容易定位和修复
- 易于测试 - 简单逻辑测试用例少
- 易于修改 - 需求变更时改动小
❌ 注意事项
- 不是偷工减料 - 简单 ≠ 简陋
- 不是拒绝抽象 - 必要的抽象仍然需要
- 不是忽视性能 - 但不要过早优化
最佳实践
1. 先让它工作,再优化
1. Make it work(让它能用)
2. Make it right(让它正确)
3. Make it fast(让它快)—— 只在必要时
2. 简化方法
| 技巧 | 说明 |
|---|
| 提前返回 | 减少嵌套层级 |
| 使用标准库 | 不要重新发明轮子 |
| 命名清晰 | 好名字胜过注释 |
| 单一职责 | 每个方法做一件事 |
| 删除死代码 | 注释掉的代码直接删 |
3. 问自己
□ 有没有更简单的方法实现同样的效果?
□ 新人能在 5 分钟内理解这段代码吗?
□ 如果删掉这个抽象层,会有什么影响?
□ 这个设计模式真的解决了当前问题吗?
与其他原则的关系
| 原则 | 关系 |
|---|
| YAGNI | YAGNI 是 KISS 在功能维度的体现 |
| DRY | DRY 可能与 KISS 冲突,过度 DRY 增加复杂性 |
| SRP | SRP 帮助保持类和方法的简单性 |
总结
KISS 核心:最好的代码是最简单的能满足需求的代码。
实践要点:
- 选择最简单的可行方案
- 避免过度设计和不必要的抽象
- 代码应该一目了然,而非需要解释
- 复杂性是逐渐积累的,持续简化