三大原则是软件开发的基石,它们相互制衡,共同指导我们写出更好的代码。
🎯 DRY (Don't Repeat Yourself)
不要重复自己
核心思想
"每一份知识都必须在系统中有单一、明确、权威的表示。"
关键点
记住:没有绝对正确的答案,只有最适合当前项目阶段和团队情况的权衡。好的开发者懂得在这三个原则间灵活切换,而不是教条地遵循某一个。
-
消除逻辑重复,不仅仅是代码文本的重复
-
提取公共逻辑、组件、配置
-
当修改时,只需改一个地方
// ❌ 违反DRY function calculatePrice1(items) { return items.reduce((sum, item) => sum + item.price, 0) * 1.1; } function calculatePrice2(products) { let total = 0; products.forEach(p => total += p.price); return total * 1.1; // 重复的税率逻辑 } // ✅ 遵循DRY const TAX_RATE = 1.1; function calculateTotal(items) { return items.reduce((sum, item) => sum + item.price, 0) * TAX_RATE; }🐦 KISS (Keep It Simple, Stupid)
保持简单,傻瓜
核心思想
"系统应该尽可能简单,不必要的复杂性应该被避免。"
关键点
-
用最简单的方式解决问题
-
避免过度工程化
-
代码要易于理解
// ❌ 过度复杂 function getUserStatus(user) { const statusMap = { active: { code: 1, message: "活跃", color: "green" }, inactive: { code: 2, message: "未激活", color: "gray" }, banned: { code: 3, message: "已封禁", color: "red" } }; return statusMap[user.status] || statusMap.inactive; } // ✅ 保持简单 function getUserStatus(user) { if (user.status === 'active') return '活跃'; if (user.status === 'banned') return '已封禁'; return '未激活'; }🚫YAGNI (You Ain't Gonna Need It)
你不会需要它
核心思想
"只在真正需要时才实现功能,不要为未来可能的需求编写代码。"
关键点
-
避免过早优化
-
不要添加"可能有用"的功能
-
专注于当前需求
// ❌ 违反YAGNI // 假设现在只需要用户注册功能 class AuthSystem { constructor() { // 提前实现了可能用不到的OAuth登录 this.oauthProviders = ['google', 'facebook', 'github']; } register(email, password) { /* ... */ } // 提前实现但可能永远不会用 loginWithOAuth(provider) { console.log(`${provider}登录 - 暂未实现`); } // 提前实现的密码重置(当前需求不需要) resetPassword(email) { throw new Error('功能待实现'); } } // ✅ 遵循YAGNI class AuthSystem { // 只实现当前需要的功能 register(email, password) { // 专注做好注册功能 return this.api.post('/register', { email, password }); } }📊 对比表格
-
原则 关注点 优点 风险 DRY 减少重复 易维护,一致性好 可能过度抽象,增加复杂度 KISS 保持简单 易理解,易调试 可能忽略必要的抽象 YAGNI 避免过度设计 节省时间,减少复杂度 可能错过重要的前瞻设计 -
🌟 黄金法则
-
从KISS开始:先用最简单的方式实现功能
-
遇到重复时DRY:第三次写类似代码时,考虑抽象
-
始终YAGNI:质疑每个"未来可能有用"的功能
-
定期重构:在三个原则间找到最佳平衡点