我知道标题可能不太清楚,因为我可能没有正确的术语,但一个例子应该说清楚。假设我有一个带有帖子和评论的应用程序,就将这些分组到各种方式的命名空间/包中而言,最佳做法是什么。如果没有更好的方法,两者的优点和缺点是什么。以下是我设想的几种不同方式,请注意,这绝不是详尽无遗的,只是为了明白这一点:
1)
MyAp
|--Entities
| |--AbstractEntity.class
| |--Comment.class
| |--Post.class
|--DataMappers
| |--AbstractDataMapper.class
| |--CommentDataMapper.class
| |--PostDataMapper.class
|--DataMappers
| |--AbstractService.class
| |--CommentService.class
| |--PostService.class
2)
MyAp
|--Abstract
| |--AbstractDataMapper.class
| |--AbstractEntity.class
| |--AbstractService.class
|--Impl
| |--Comment
| | |--Comment.class
| | |--CommentDataMapper.class
| | |--CommentService.class
| |--Post
| | |--Post.class
| | |--PostDataMapper.class
| | |--PostService.class
通过一个大项目,您可以将上述任何一种方法分解为更广泛的组。例如,对于#1,你可以有分贝的Util,系统,等你的实体,DataMappers和服务命名空间之下,将使类实现在那里,而保持实体命名空间下的AbstractEntity类。对于#2,您可以将这些额外的命名空间放在Abstract和Impl。
之下我倾向于#1更好,似乎我必须在2个不同的地方添加额外的Db,Util,System等命名空间。但#2具有将所有与一个模型类相关的类保持在一起的吸引力。无法下定决心!
答案 0 :(得分:2)
我说两种方法都有问题。
大多数开发人员倾向于通过主要专业化来打破课程。 Mapper应该去mappers,模型应该去模型,helper应该去帮助器,接口接口,我们首先考虑。这可以很容易地决定项目的开始,但随着时间的推移它会带来一些痛苦。有时候它看起来很愚蠢。特别是当您需要将某个功能提取到单独的组件中时。
根据我的经验,我可以说你应该通过高级函数或“子系统”对类进行分组,或者,就像现在DDD指定“有界上下文”一样。同时,不应该有非常可能的分组级别。
所以 - 我可以看到你的所有实体都属于Posting上下文。它看起来很奇怪,但我建议您将所有类放到Posting
fodler并且不要创建额外的子文件夹,除非您在上下文中有一个非常具体的功能区域。
MyAp
|--Core
|--AbstractEntity.class
|--AbstractDataMapper.class
|--AbstractService.class
|--Posting
|--Comment.class
|--Post.class
|--CommentDataMapper.class
|--PostDataMapper.class
|--CommentService.class
|--PostService.class
一般来说,你的第二种方法看起来很相似。在这种情况下,您可以轻松添加越来越多的特定于上下文的文件夹。类似的事情 - “投票”,“通知”,“身份验证”等。此外,我建议选择最简单的方法,并等到你有一些“临界质量”的课程,这样你就可以获得足够的信息。小组课程正确。
使用第一种方法,您的域的上下文将分布在所有文件夹中。
答案 1 :(得分:1)
根据我的经验,我看到的第一个FAR比我见过的更多(我认为我从未见过第一个项目,实际上是分开的。)
示例:假设您有一个使用好莱坞模式的抽象类。所有实现类都可以合理地放在同一个包中。从“实际”实现到目前为止,在“抽象”包中关闭“主”模板没有任何意义。
我要补充的另一件事是除了收集之外的所有案例。
MyAp
|--Entity
| |--AbstractEntity.class
| |--Comment.class
| |--Post.class
|--DataMapper
| |--AbstractDataMapper.class
| |--CommentDataMapper.class
| |--PostDataMapper.class
|--Service
| |--AbstractService.class
| |--CommentService.class
| |--PostService.class
答案 2 :(得分:0)
像JaxB这样的一些框架将配置信息放入package-info.java中。在这种情况下,第一种方法必须能够使用package-info.java。