初入 Java ,看不懂 各种奇奇怪怪的 PO、VO、DTO、BO、**O…求一份攻略

2023-11-16 06:27:04 +08:00
 mangojiji
一大堆疑惑:

入参时,Controller 接收哪个 O ?
Service 接收和 Mybatis 接收哪个 O ?

Mybatis 返回的可能是 PO (比如 getById 或者 selectByPrimaryKey),但也可能是自定义的 POJO 吧(比如一条复杂 Join 的结果),在这类情况下,Mybatis 返回的这些对象属于什么 O ?这些对象能被 Service 直接返回吗?

Service 应该返回什么 O 给 Controller ?

BO 又是个啥,看了不少资料愣是没整明白。

DTO 在什么时候用,有说层之间入参和输出的,也有说调用其它系统的,总之乱七八糟。。。

PS:项目没有使用 DDD ,是传统 SpringMVC+Mybatis 三层的设计。主要原因是我不懂 DDD…能力有限

最好能够配合示例代码或者伪代码,谢谢大佬们。
11930 次点击
所在节点    Java
94 条回复
block0
2023-11-16 07:09:07 +08:00
如果不是公司要求,建议换一门语言学吧
yrj
2023-11-16 08:01:26 +08:00
ddd 是设计问题,和语言无瓜,看那个洋葱图自己慢慢理解,话说小项目真的没必要搞得太复杂。。。
chendy
2023-11-16 08:11:07 +08:00
1. 啥 O 的问题,跟着项目来就行,通常都和某一层绑定,别人咋用就咋用,别纠结,干就完了
2. DDD 需要甲方乙方整体水平都比较好才能发挥正向的作用,可以借鉴,不要轻易实践
potatowish
2023-11-16 08:11:14 +08:00
你提到的这些都没必要关注,实际开发中没有哪个项目是严格按照这个规范来的,约定好即可。

你作为初学者学习的方向已经走入了误区。
superedlimited
2023-11-16 08:24:48 +08:00
你要先搞明白这些简写的全部英文单词是什么,然后再去记他是什么,而不是死记硬背 controller 应该用那个 o ,计算机是工科,不是文科。
bthulu
2023-11-16 08:26:23 +08:00
一个 DTO 用到死就行了
awesomePower
2023-11-16 08:32:11 +08:00

看得到图片吗,上图是阿里出的规约。但具体实践应该是看你们项目的规范或者约定,跟你开发的项目保持一致
hpu423
2023-11-16 08:36:02 +08:00
统一 DTO ,不要管其他 O ;见过整个项目只有一个大 O 的,项目也在跑;搞好 O ,还不是被裁?
xuanbg
2023-11-16 08:41:21 +08:00
XO 就是个自己定义的命名规范,没啥意思,跟着来就行。你要是不愿意,怼得过领导就按你自己的来。
MrSheng
2023-11-16 08:44:02 +08:00
与前端交互一个 O ,与数据库交互一个 O ,两者中间一个转换 O ,共三个。
williamshan
2023-11-16 08:44:37 +08:00
我建议全部 entity
Tubering
2023-11-16 08:48:43 +08:00
Controller 入参用 DTO ,返回用 VO
数据库实体类用 Entity
其他很少用
如果想偷懒甚至可以 Entity 一把梭 [doge]
litchinn
2023-11-16 08:49:32 +08:00
这东西你去 10 个公司可能有 10 个做法,跟着公司来就行了
面试的话我感觉也没人问这东西,问得话你记住每个 O 的英文是啥就知道是干啥的了
sss15
2023-11-16 08:55:10 +08:00
就是一种命名规则,初入自学等于你一个人开发项目,你想用 dto 就用 dto ,想用 pojo 就用 pojo ,无非就是一个类的名称结尾,你自创一个 xxO 都没事。
回想起来当初我学 java 的时候看到 jdk 和 jre 一头雾水,看到 j2ee 和 j2se 这 tm 都是啥和啥啊,非要搞清楚他们到底是什么,结果查到的信息就是每个字都认识,放一起也认识,但是他想说明什么我还是没搞懂,至今我不知道 ee 和 se 有什么区别,但不影响我 springBoot 开发,不影响我 CURD 一把梭
hfc
2023-11-16 08:57:46 +08:00
这么多的 O ,为了转换还得整各种 get/set 进行赋值,很头疼
murmur
2023-11-16 08:59:53 +08:00
都是 Class 而已,看别人怎么命名你就怎么命名
qqww9527
2023-11-16 09:00:44 +08:00
的确根据公司规范来就是,没有规范的话,个人不太喜欢这些 O ,根据业务定义模型,不一定要叫什么 O ,比如数据库用户就叫 User, 但是一般数据库模型要和前端模型(叫的 VO )分开,前端模型也可以叫 User, 两个 User 做 map 转换,总之思想就是面向对象模型编程,而不是面向数据库编程。
CPoet
2023-11-16 09:01:35 +08:00
自己开心就好,不要受这么多约束。如果公司有规范就按公司的走。
iminto
2023-11-16 09:03:35 +08:00
又没强制让你用,也没说必须这样用才对。

你完全可以不用,但前提你得有自己的最佳实践
Amber2011
2023-11-16 09:03:36 +08:00
我直接数据库模型 entity 当 god class 一把梭哈(开个玩笑,小类可以这么做,一般最好不要)
业务直接关联的 crud 接口,就数据库模型
报表类(关联很多其他数据),或者特殊接口 就单独写一个类.
这种其实也可以凭直觉,可以先用 god class 一段时间,就能发现问题了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/992296

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX