【架构】----实体类统一的包名应该怎么命名?包括 实体类(PO、VO、DTO、Entity、ES/Mongo实体等)
在Java架构设计中,推荐以domain作为存放业务实体类的顶级包名,而非pojo或entity。domain能更好体现业务语义,支持分层细分(如entity、vo、dto等子包),具备扩展性且符合领域驱动设计思想。相比而言,pojo过于技术化,entity范围过窄,都无法满足复杂业务场景下的分类需求。采用domain包结构可使代码更具自解释性,便于团队理解和维护。
·
总结:推荐
在Java架构设计中,实体类(PO、VO、DTO、Entity、ES/Mongo实体等)的包名设计需要兼顾业务语义、分层逻辑和团队共识,核心目标是让包结构具备“自解释性”,即通过包名就能清晰理解类的用途和归属。
从架构师视角,推荐以 domain
作为顶级包名,而非pojo
或entity
,原因如下:
1. 为什么不选pojo
?
POJO(Plain Old Java Object)
是一个技术术语,强调“简单Java对象”(无特定框架依赖),但它仅描述了对象的“技术属性”,未体现“业务含义”。
- 问题:
pojo
包下如果混入VO、DTO、数据库实体等,会导致“技术分类”与“业务用途”混淆,难以通过包名区分对象的业务职责。 - 场景:当团队讨论“订单相关的实体”时,“在
domain
里找”比“在pojo
里找”更符合业务思维。
2. 为什么不选entity
?
Entity
在领域驱动设计(DDD)或ORM框架(如JPA)中特指“领域实体”(通常与数据库表映射,包含业务行为),但它的语义范围过窄:
- 问题:VO(视图对象)、DTO(传输对象)、ES/Mongo的文档对象等不属于“Entity”的范畴,若强行放在
entity
包下,会违背“名实相符”的原则。 - 场景:前端需要的“订单详情VO”显然不是“Entity”,放在
entity
包下会造成理解混乱。
3. 为什么推荐domain
?
domain
(领域)是DDD中的核心概念,代表“业务领域的所有模型元素”,其语义天然覆盖所有与业务相关的实体类,且具备良好的扩展性:
- 业务语义:
domain
直接关联业务领域(如“订单领域”“用户领域”),符合“业务驱动设计”的思维,便于团队从业务视角理解对象含义。 - 分层细分:可在
domain
下通过子包区分不同类型的实体,清晰且灵活,例如:com.company.project.domain ├─ entity // 领域实体(核心业务实体,对应数据库表,含业务行为,如OrderEntity) ├─ vo // 值对象(无唯一标识的业务对象,如MoneyVO、AddressVO) ├─ dto // 数据传输对象(跨层/跨服务传输,如OrderQueryDTO、UserDTO) ├─ es // ES文档对象(与Elasticsearch映射,如ProductEsDoc) └─ mongo // Mongo文档对象(与MongoDB映射,如LogMongoDoc)
- 扩展性:未来新增其他类型的实体(如缓存对象CacheBO),只需在
domain
下新增子包(如domain.cache
),无需调整顶级包结构。
总结
domain
作为顶级包名,既能统一所有业务相关实体类的存放位置,又能通过子包清晰区分不同类型实体的职责,符合“业务驱动”和“领域设计”的架构思想,是大型项目中更优的选择。
而pojo
和entity
因语义范围过窄或仅关注技术属性,难以满足复杂业务场景下的包结构可读性和扩展性需求。
更多推荐
所有评论(0)