当我们开始开发应用程序时,我们使用包来逻辑组织我们的类,并且几乎总是有一个名为domain的包(如com.raysis.reportgen.domain
)。我的问题是我们应该在这个包裹中放什么,不应该放什么?是否有标准定义,或者仅仅是程序员的品味?
早些时候我在这里读到了一些关于它的东西:什么是 Java 域模型?
当我们开始开发应用程序时,我们使用包来逻辑组织我们的类,并且几乎总是有一个名为domain的包(如com.raysis.reportgen.domain
)。我的问题是我们应该在这个包裹中放什么,不应该放什么?是否有标准定义,或者仅仅是程序员的品味?
早些时候我在这里读到了一些关于它的东西:什么是 Java 域模型?
敏捷大师 Robert C. Martin在他的开创性著作《敏捷软件开发:原则、模式和实践》中定义了几个软件包指标。人们争论过传入和传出耦合等指标在实践中的有用程度,指标应该在哪里以及如何应用等。无论你站在辩论的哪个位置,指标确实提供了一种很好的客观、可量化的方式来衡量耦合。然后,您可以对这些信息做任何您想做的事情。
通常,您应该更多地关注包级别,而不是类级别。如果一个包变化很大,限制其成员依赖于这个包的包的数量。相反,如果一个包是稳定的,鼓励其他包依赖它。另一个经验法则是,当更改包中的一个类的 API 时,您知道包具有良好的内聚性,这意味着必须更改包中所有其他类的 API。
您还可以将这些原则视为 Martin 支持的一些 OO 类原则的包级版本,例如单一职责原则。
我鼓励在域包中只放置与域模型相关的类,如Customer
,Order
等。
这些特定于域的实体类将在持久层中用于映射域实体和数据库表,并且这些实体将用于在数据库表中持久化实体实例。
在基于模块化的应用程序开发中,domain package
您永远不会暴露给外界。
您应该放置构成您的域模型的类。要找出什么属于域模型,什么不属于域模型,让我们从定义开始。维基百科说
Domain model describes the various entities, their attributes, roles,
and relationships, plus the constraints that govern the problem domain
因此,您应该在代码中放置代表上述概念的类。您的代码中还有其他类不属于域模型。他们中有一些:
包组织基本上始终是开发人员的选择。AFAIK 关于如何安排你的包结构没有严格的标准。
显然,您应该在项目中遵循一些最佳实践和Java 约定来维护您的类并定义它们的“关注点”。
通常domain
子包主要用于将领域对象(或模型对象)放置在围绕 MVC 模式实现的项目中,但不仅限于此。模型对象可以映射数据库中的表(如果您使用的是 ORM),或者它们只是代表应用程序逻辑中涉及的实体的类。