第2篇|设计思想:如何从“写逻辑”升级为“做设计”
“你写的是代码,我写的是系统。”
——架构师的自白
很多程序员在职场中,有这样的感受:
- “写代码不难,写好代码太难。”
- “写功能我没问题,写架构我不敢动。”
- “我能把需求做完,但做不出一个优雅的系统。”
如果说第一篇文章我们解决了**“我为什么要成为架构师”的问题,那么这一篇,就是解决“我该如何迈出第一步”**的问题:
这一篇,我们聊聊**“设计思想”**——程序员从写逻辑到做系统设计的第一道鸿沟。
一、程序员初期最容易陷入的误区
我们先看一个真实的初级代码:
public class OrderService {
public void createOrder(String userId, String itemId) {
// 1. 校验库存
int stock = DB.queryStock(itemId);
if (stock <= 0) {
throw new RuntimeException("库存不足");
}
// 2. 扣库存
DB.updateStock(itemId, stock - 1);
// 3. 创建订单
Order order = new Order(userId, itemId);
DB.insertOrder(order);
// 4. 发短信
SmsUtil.send("下单成功", userId);
}
}
看起来没毛病,功能齐全。但从设计角度一看,“耦合满天飞”:
- 数据操作和业务逻辑混在一起;
OrderService既管库存又管短信;- 没有扩展性(比如加上优惠券、日志记录怎么办?)
这就是典型的“写逻辑”思维,只是把流程从 A 做到 B,而不是把模块组织得清晰有序。
二、设计思想是“抽象 + 分层 + 解耦”的系统思维
设计思想不是架空理论,它是让代码更好维护、更易扩展、更能应对变化的“组织之术”。
我们来一一拆解。
✳️ 1. 抽象:从“怎么做”转变为“做什么”
写逻辑的思维是:
“怎么把功能跑通?”
设计的思维是:
“这件事的本质是什么?我能不能把它抽象出来?”
在上面的例子中,我们可以将“库存操作”抽象成一个 InventoryService:
public class InventoryService {
public boolean hasStock(String itemId) {
return DB.queryStock(itemId) > 0;
}
public void deduct(String itemId) {
int stock = DB.queryStock(itemId);
if (stock <= 0) throw new RuntimeException("没货");
DB.updateStock(itemId, stock - 1);
}
}
然后 OrderService 就变得清爽了:
public class OrderService {
private InventoryService inventoryService = new InventoryService();
private SmsService smsService = new SmsService();
public void createOrder(String userId, String itemId) {
inventoryService.deduct(itemId);
Order order = new Order(userId, itemId);
DB.insertOrder(order);
smsService.send(userId, "下单成功");
}
}
这就是抽象:把“怎么做”封装成方法,对外只暴露“要做什么”。
✳️ 2. 分层:分工合作、各司其职
设计思想第二个核心是**“分层”**,也是架构师最爱画图的一招。
举个三层架构的例子:
| 层级 | 职责 | 类示例 |
|---|---|---|
| Controller | 接收请求、参数校验 | OrderController |
| Service | 执行业务逻辑 | OrderService |
| DAO(Repository) | 访问数据库 | OrderRepository |
不分层的代码是“炒一锅乱炖”,你一口下去啥都有;
分层后的代码是“分餐式小火锅”,牛肉、蘑菇、丸子各有容器。
示例:
// Controller 层
@PostMapping("/order")
public ResponseEntity<?> createOrder(@RequestBody OrderDTO dto) {
orderService.createOrder(dto.getUserId(), dto.getItemId());
return ResponseEntity.ok("下单成功");
}
// Service 层
public void createOrder(String userId, String itemId) {
if (!inventoryService.hasStock(itemId)) {
throw new RuntimeException("库存不足");
}
orderRepository.insert(new Order(userId, itemId));
}
// DAO 层
public void insert(Order order) {
// jdbcTemplate 或 ORM 操作
}
这才是架构之美:井然有序,职责分明。
✳️ 3. 解耦:拒绝“连体婴”,拥抱“模块自治”
设计的第三个关键是**“解耦”**。
程序设计的目标不是“跑得快”,而是“能换腿”。
什么叫耦合?
public class OrderService {
public void createOrder() {
EmailUtil.sendEmail("order created");
KafkaProducer.send("order_topic", "created");
}
}
如果现在你不用 Kafka 改用 RabbitMQ,或从 Email 改为短信通知,怎么办?
所以我们需要使用接口 + 策略的方式:
public interface Notifier {
void notify(String msg);
}
public class EmailNotifier implements Notifier {
public void notify(String msg) {
// 发送邮件
}
}
public class SmsNotifier implements Notifier {
public void notify(String msg) {
// 发送短信
}
}
然后 OrderService 中只依赖接口:
public class OrderService {
private Notifier notifier;
public OrderService(Notifier notifier) {
this.notifier = notifier;
}
public void createOrder() {
// ...
notifier.notify("下单成功");
}
}
你看,换腿不伤身,这才是架构思维。
三、从写逻辑到做设计,程序员的心智跃迁
| 维度 | 写逻辑 | 做设计 |
|---|---|---|
| 思维方式 | 步骤式流程 | 模块式抽象 |
| 关注点 | 怎么实现功能 | 系统是否稳定、易扩展 |
| 可扩展性 | 差(加功能必改原逻辑) | 高(可插拔、可配置) |
| 代码组织 | 混乱耦合 | 分层清晰 |
| 复用性 | 低 | 高 |
| 新人上手 | 难 | 容易 |
可以说:
写逻辑是码农的本能,做设计才是架构师的灵魂。
四、程序员如何练习设计思想?五条建议
✅ 1. 把你最近写的功能重构一遍
尝试用“抽象、封装、分层”的思维,把一个复杂业务拆分成:
- 模块
- 接口
- 服务类
- 工具类
✅ 2. 多画图,用画图来思考设计
- 画类图(UML)
- 画模块图
- 画依赖关系图
工具推荐:ProcessOn、draw.io、PlantUML
✅ 3. 阅读优秀的开源项目(Spring、MyBatis、Sa-Token)
- 看类是怎么划分的
- 接口怎么命名
- 模块怎么组织
✅ 4. 学习《重构》《代码整洁之道》《设计模式》
经典永不过时。尤其推荐 Martin Fowler 的重构书,里面的“坏味道”诊断思维,和设计思想一脉相承。
✅ 5. 找个靠谱的“带教架构师”
最好的成长方式之一是:加入一个技术氛围好的团队,跟着有设计思维的人写代码。
五、结语:写代码者众,做设计者寡
“工匠不满于造物,更要改善工具。”
程序员升级为架构师的第一步,不是学什么框架,也不是画几个图,而是思维方式的转变。
从关注一行代码,转向关注模块、结构、协作和演化。
这一步,一旦跨出,你就不是写逻辑的人,而是搭建系统的人。
✅ 下一篇预告:
第3篇|设计原则基础:代码不烂,全靠六大原则护体
带你彻底掌握 SOLID 原则,写出可扩展、可复用、可维护的优雅代码。

6万+

被折叠的 条评论
为什么被折叠?



