新闻详情

新闻详情

首页 / 资讯中心 / 详情

面试官:你的实体类全是 Get/Set,这和直接操作数据库有什么区别?

发布时间:2026/9/29 22:13:14来源:尧图网络
面试官:你的实体类全是 Get/Set,这和直接操作数据库有什么区别?
面试官你的实体类全是 Get/Set这和直接操作数据库有什么区别翻开大多数同学的校招项目源码总能看到类似的Order类DatapublicclassOrder{privateLongid;privateLonguserId;privateIntegerstatus;privateBigDecimalamount;// 省略一堆自动生成的属性}紧接着在OrderServiceImpl里会有一大坨这样的代码publicvoidcancelOrder(LongorderId,LonguserId){OrderorderorderMapper.selectById(orderId);if(ordernull){thrownewBizException(订单不存在);}if(!order.getUserId().equals(userId)){thrownewBizException(无权操作);}// 只有待支付状态才能取消if(order.getStatus()!0){thrownewBizException(订单状态不支持取消);}order.setStatus(2);// 2表示已取消orderMapper.updateById(order);// 可能还有退库存、退优惠券等逻辑...}这就是典型的“贫血模型”Anemic Domain Model。你的Order类只是一个承载数据的容器和数据库里的表结构一一对应。所有的业务规则、状态流转全塞在 Service 层里。你可能觉得这没什么问题大家都这么写。但如果在“退款”接口、“后台强制关单”接口里你都需要判断订单状态这些散落的if (order.getStatus() ! 0)就会在代码库里到处复制粘贴。哪天产品经理说“部分付款的订单也能取消”你就得把所有涉及订单取消的 Service 代码全找出来改一遍。漏改一处就是个 P0 级线上事故。这和直接在数据库里敲UPDATE orders SET status 2 WHERE id ? AND status 0没什么本质区别。你用面向对象的语言写着面向过程的面条代码。把行为还给实体充血模型DDD领域驱动设计给出的解法很直接对象不应该只有状态还必须有行为。谁拥有数据谁就该负责处理数据。我们把取消订单的逻辑收拢到Order实体内部publicclassOrder{privateLongid;privateLonguserId;privateOrderStatusstatus;// 用枚举替代魔术数字// 构造函数、属性等.../** * 领域行为取消订单 */publicvoidcancel(LongoperatorId){if(!this.userId.equals(operatorId)){thrownewBizException(无权操作该订单);}if(this.status!OrderStatus.PENDING_PAY){thrownewBizException(当前状态无法取消订单);}this.statusOrderStatus.CANCELLED;// this.updatedAt LocalDateTime.now();}}经过这样的改造Service 层的代码会变成这样publicvoidcancelOrder(LongorderId,LonguserId){OrderorderorderMapper.selectById(orderId);if(ordernull){thrownewBizException(订单不存在);}// 业务规则由订单实体自己把控order.cancel(userId);orderMapper.updateById(order);// 调用其他域的服务如库存...}这么做有什么好处第一业务逻辑不再到处泄漏。关于“订单能不能取消”的规则被死死锁在Order类里。任何人想取消订单都必须调用order.cancel()这就保证了状态流转的合法性。想绕过校验直接把状态改成 2门都没有。第二代码真正变得可测试。在贫血模型下你想测一段订单取消逻辑得把整个 Spring 容器起起来Mock 掉一堆 Mapper。现在你只需要new一个Order对象调用cancel()方法看看状态变没变、异常抛没抛就行了。这才是纯粹的单元测试。最后回答开头面试官的问题。实体类里全是 Get/Set那就是披着对象外衣的数据表。把业务行为内聚到实体里让实体自己保护自己的状态你才算真正用上了面向对象编程这也是跨入领域驱动设计门槛的第一步。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

基于OpenCV的本地化智能相册系统:人脸检测、对齐与聚类实战 2026/9/29 23:12:13

基于OpenCV的本地化智能相册系统:人脸检测、对齐与聚类实战

简介:本资源是一份面向人工智能与计算机视觉初学者及系统开发者的专业参考文献,聚焦于利用OpenCV解决个人/家庭数码照片智能管理的实际问题。文档详细阐述了基于OpenCV构建智能相册系统的核心技术路径,涵盖照片元信息提取、Haar级联正面人脸检…

阅读更多 →
RTL8811CU/8821CU Linux驱动一键安装脚本:Kali与树莓派无线网卡编译指南 2026/9/29 23:12:13

RTL8811CU/8821CU Linux驱动一键安装脚本:Kali与树莓派无线网卡编译指南

1. 为什么RTL8811CU这块网卡总让人又爱又恨如果你手头有一块基于 Realtek RTL8811CU 芯片的 USB 无线网卡,大概率经历过这样的场景:在 Windows 上插上就能用,换到 Kali 或者树莓派上,ifconfig里死活看不到wlan0,iwconf…

阅读更多 →
Agent必读:模型“学习”真相与上下文工程实战指南 2026/9/29 23:12:13

Agent必读:模型“学习”真相与上下文工程实战指南

1. 先把概念说清楚:Agent场景里,“模型的学习”到底指什么前两天我在梳理 Agent 技术栈的时候,发现一个特别容易混淆的点:很多人把“Agent 会学习”挂在嘴边,但真去追问他“模型到底是怎么学习的”,往往就说…

阅读更多 →
if条件判断全解析:原理、陷阱与重构思路 2026/9/29 23:12:04

if条件判断全解析:原理、陷阱与重构思路

接手第一个像样的业务需求时,我坐在工位上盯着需求文档看了整整一个下午,内容翻来覆去其实就几句话:满一百减十元、会员再打九五折、优惠券和促销不能叠加。那时我以为难点在算账,真正动手写代码才发现,所有业务规则最…

阅读更多 →
Pdf转Word,免费的网站列表 2026/9/29 23:12:03

Pdf转Word,免费的网站列表

这里,我只说免费的、鼠标点两下就搞定的方法。地址转换效果限制OCR在线编辑特点https://001pdf.com高;内容流式无免 费无国内https://smallpdf.com高;内容流式每天3个付 费有国外https://ilovepdf.com低;内容固定,后期…

阅读更多 →
使用LM Studio在WordPress基于大模型原创文章上稿进行SEO优化 2026/9/29 23:11:49

使用LM Studio在WordPress基于大模型原创文章上稿进行SEO优化

在进行自动化文章生成与发布的流程中,首先需要确保基础配置的完善性和数据的准确性。通过手动设置分类和标签,文章能够在发布时被准确归类,从而提升SEO的效果。通过Excel表格的方式管理这些分类与标签,结合Python脚本,可以高效地实现自动化文章的生成和发布。 该流程依赖…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉