别再被VO、BO、PO、DTO、DO绕晕?代码一讲就懂!

摘要:大家好,我是晓凡。 前阵子晓凡的粉丝朋友面试,被问到“什么是VO?和DTO有啥区别?” 粉丝朋友:“VO就是Value Object,DTO就是Data Transfer Object……” 面试官点点头:“那你说说,一个下单接口里,到底哪
大家好,我是晓凡。 前阵子晓凡的粉丝朋友面试,被问到“什么是VO?和DTO有啥区别?” 粉丝朋友:“VO就是Value Object,DTO就是Data Transfer Object……” 面试官点点头:“那你说说,一个下单接口里,到底哪个算VO,哪个算DTO?” 粉丝朋友有点犹豫了。 回来后粉丝朋友痛定思痛,把项目翻了个底朝天,并且把面试情况告诉了晓凡,下定决心捋清楚了这堆 XO 的真实含义。 于是乎,这篇文章就来了 今天咱们就用一段“用户下单买奶茶”的故事,把 VO、BO、PO、DTO、DO 全部聊明白。看完保准你下次面试不卡壳,写代码不纠结。 一、先放结论 它们都是“为了隔离变化”而诞生的马甲 缩写 英文全称 中文直译 出现位置 核心目的 PO Persistent Object 持久化对象 数据库 ↔ 代码 一张表一行记录的直接映射 DO Domain Object 领域对象 核心业务逻辑层 充血模型,封装业务行为 BO Business Object 业务对象 应用/服务层 聚合多个DO,面向用例编排 DTO Data Transfer Object 数据传输对象 进程/服务间 精简字段,抗网络延迟 VO View Object 视图对象 控制层 ↔ 前端 展示友好,防敏感字段泄露 一句话总结: PO 管存储,DO 管业务,BO 管编排,DTO 管网络,VO 管界面。 下面上代码,咱们边喝奶茶边讲。 二、业务场景 用户下一单“芋泥波波奶茶” 需求: 用户选好规格(大杯、少冰、五分糖)。 点击“提交订单”,前端把数据发过来。 后端算价格、扣库存、落库,返回“订单创建成功”页面。 整条链路里,我们到底需要几个对象? 三、从数据库开始:PO PO是Persistent Object的简写 PO 就是“一行数据一个对象”,字段名、类型和数据库保持一一对应,不改表就不改它。 // 表:t_order @Data @TableName("t_order") public class OrderPO { private Long id; // 主键 private Long userId; // 用户ID private Long productId; // 商品ID private String sku; // 规格JSON private BigDecimal price; // 原价 private BigDecimal payAmount; // 实付 private Integer status; // 订单状态 private LocalDateTime createTime; private LocalDateTime updateTime; } 注意:PO 里绝不能出现业务方法,它只是一个“数据库搬运工”。 四、核心业务:DO DO 是“有血有肉的对象”,它把业务规则写成方法,让代码自己说话。
阅读全文