优雅代码的真谛:从过度设计到回归本质
很多开发者在学习设计模式时,常常陷入这样的循环:
疯狂钻研工厂、单例、装饰器等23种模式,把《设计模式》背得滚瓜烂熟,却发现手中握着“模式的锤子”,看什么都像钉子。最终代码被过度设计层层包裹,反而失去了原本的清晰与灵活。
我们真的需要所有设计模式吗?
其实未必。
真正优秀的代码,并不依赖于掌握了多少种模式,而在于是否遵循了两个核心设计原则:
原则一:简单接口,深度功能
好的设计应当将复杂的实现细节封装在内部,对外只暴露简洁直观的接口。
例如,早期某些语言的标准库在处理网络请求时,需要手动构建请求对象、设置 Header、处理编码……想发一个简单的 POST 请求,却被迫关心太多底层细节。
而现代的 requests 库只需一行:
requests.post(url, data=...)
就像开车不需要理解内燃机原理,只要会使用方向盘、油门和刹车就够了。
封装,是为了让使用者专注于目标,而非过程。
原则二:依赖抽象,而非具体
直接依赖具体实现,会让代码在需求变化时不堪重负。
假设有一个订单服务,在创建订单后需要发送邮件。如果 OrderService 直接调用 EmailService,那么当产品经理要求增加短信通知、微信通知……时,你就不得不反复修改 OrderService 的代码。
更好的做法是定义一个抽象的 Notifier 接口,让 OrderService 只依赖这个抽象。任何通知方式——邮件、短信、微信——只要实现 Notifier,就可以直接接入,而 OrderService 的代码无需任何改动。
如果你熟悉设计模式,会发现这其实就是策略模式的实践。
设计模式,本质上是设计原则的一种具体实现。
忘记模式,记住原则
建造者模式封装了复杂对象的构建步骤,对外提供简单的结构;
适配器模式通过抽象整合不兼容的接口……
这些模式都符合“简单接口 + 抽象依赖”的原则。
所以,请放下对设计模式的执念。
下次面对问题时,别急着问“我该用哪个模式?”,而是思考:
- 🤔 如何让接口更简单?
- 🧠 如何通过抽象解耦?
这才是设计的本质。