使用按功能包约定将我的框架 类 放在哪里?
Where to put my framework classes using package-by-feature convention?
我已经阅读了很多关于按功能包命名约定的内容。所以我决定在一个新项目中尝试一下。但是,我不确定应该如何命名我的大多数 classes 将使用的包,因为我使用的是一个巨大的框架,例如 Spring
和 Hibernate
,例如。
这就是处理我们的 Spring contexts
classes:
的方式
还有我们的 database
访问 class,管理连接等等。
我有一个关于这个的草稿:为这些框架使用一个通用包,比如:
com.company.project.common.spring
com.company.project.common.database
不过,这恐怕还是有点像package-by-layer
。 :)
应该如何创建我的 feature classes
将访问的包?
常见的建议是 "package by feature, not layer"。我经常做的是"package by feature, then layer"。我还认为顶级包应该是基于 "feature" 的(功能组件,无论如何)。但我也喜欢将我的图层分成子包。
在我看来,与框架相关的代码本身并不构成"features"(如"important, high-level aspects of the problem domain"),因此这里逐个功能包没有多大意义。但是,这仍然是重要的代码,您需要一种方法来构建它。
我通常使用两种方法:
如果我需要扩展或扩充我正在使用的库,我会构建与库的包结构平行的包。例如,如果我需要为 Spring 实现一些新的数字格式化程序,我可能会将包命名为 com.acme.foo.springframework.format.number
,与 org.springframework.format.number
.
平行
但是,如果我需要为特征层实现通用基础 classes,这可能类似于 com.acme.foo.common.<layer>
。例如,如果我们有 com.acme.foo.<feature>.dataaccess
个用于某些功能的数据访问层的包,com.acme.foo.common.dataaccess
可以容纳所有功能的数据访问层的基础 classes。
这两种方法并行使用。你只需要决定一些 class 是框架还是库扩展(你能想象在这个项目之外使用它吗?)或者它是否更接近你的项目层。
我已经阅读了很多关于按功能包命名约定的内容。所以我决定在一个新项目中尝试一下。但是,我不确定应该如何命名我的大多数 classes 将使用的包,因为我使用的是一个巨大的框架,例如 Spring
和 Hibernate
,例如。
这就是处理我们的 Spring contexts
classes:
还有我们的 database
访问 class,管理连接等等。
我有一个关于这个的草稿:为这些框架使用一个通用包,比如:
com.company.project.common.spring
com.company.project.common.database
不过,这恐怕还是有点像package-by-layer
。 :)
应该如何创建我的 feature classes
将访问的包?
常见的建议是 "package by feature, not layer"。我经常做的是"package by feature, then layer"。我还认为顶级包应该是基于 "feature" 的(功能组件,无论如何)。但我也喜欢将我的图层分成子包。
在我看来,与框架相关的代码本身并不构成"features"(如"important, high-level aspects of the problem domain"),因此这里逐个功能包没有多大意义。但是,这仍然是重要的代码,您需要一种方法来构建它。
我通常使用两种方法:
如果我需要扩展或扩充我正在使用的库,我会构建与库的包结构平行的包。例如,如果我需要为 Spring 实现一些新的数字格式化程序,我可能会将包命名为 com.acme.foo.springframework.format.number
,与 org.springframework.format.number
.
但是,如果我需要为特征层实现通用基础 classes,这可能类似于 com.acme.foo.common.<layer>
。例如,如果我们有 com.acme.foo.<feature>.dataaccess
个用于某些功能的数据访问层的包,com.acme.foo.common.dataaccess
可以容纳所有功能的数据访问层的基础 classes。
这两种方法并行使用。你只需要决定一些 class 是框架还是库扩展(你能想象在这个项目之外使用它吗?)或者它是否更接近你的项目层。