1

我知道标题可能不太清楚,因为我可能没有正确的术语,但一个例子应该清楚。假设我有一个带有帖子和评论的应用程序,那么将它们分组到各种方式的命名空间/包中的最佳实践是什么。如果没有更好的方法,两者的优点和缺点是什么。以下是我设想的几种不同方式,请注意,这绝不是详尽无遗的,只是为了说明这一点:

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,您可以在 Entities、DataMappers 和 Services 命名空间下放置 Db、Util、System 等,并将类实现放在其中,同时将 AbstractEntity 类保留在 Entities 命名空间下。对于 #2,您可以将这些额外的命名空间放在 Abstract 和 Impl 下执行相同的操作。

我倾向于 #1 更好,似乎我必须将额外的 Db、Util、System 等命名空间添加到 2 个不同的地方。但是#2 具有将与一个模型类相关的所有类保持在一起的吸引力。拿不定主意!

4

3 回答 3

2

我想说这两种方法都有问题。

大多数开发人员倾向于通过他们的主要专业来打破类。映射器应该到映射器,模型应该到模型,助手应该到助手,接口到接口,我们首先想到。在项目开始时,这可能是一个容易的决定,但随着时间的推移它会引起一些痛苦。有时它看起来相当愚蠢。尤其是当您需要将某个功能提取到单独的组件中时。

根据我的经验,我可以说您应该按类的高级功能或“子系统”对类进行分组,或者像现在 DDD 指定的“有界上下文”一样。同时不应该有非常可能的分组级别。

所以 - 我可以看到你所有的实体都属于发布上下文。它可能看起来很奇怪,但我建议您将所有类都放在Postingfodler 中,并且不要创建额外的子文件夹,除非您在上下文中有非常特定的功能区域。

MyAp
|--Core
   |--AbstractEntity.class 
   |--AbstractDataMapper.class
   |--AbstractService.class
|--Posting
   |--Comment.class
   |--Post.class
   |--CommentDataMapper.class
   |--PostDataMapper.class
   |--CommentService.class
   |--PostService.class

一般来说,您的第二种方法看起来相似。在这种情况下,您可以轻松添加越来越多的特定于上下文的文件夹。像 - “投票”、“通知”、“身份验证”等。另外我建议选择最简单的方法,等到你有一些“临界质量”的类,这样你就有足够的信息来了解如何正确分组课程。

使用第一种方法,您的域上下文将分布在所有文件夹中。

于 2012-12-15T18:23:53.173 回答
1

以我的经验,我看到的第一个 FAR 比我看到的后者多(实际上,我认为我从未见过一个项目在第一个上分裂)。

示例:假设您有一个使用好莱坞模式的抽象类。所有实现类都应该在同一个包中。远离实际实现,在“抽象”包中关闭“主”模板没有任何意义。

我要补充的另一件事是SINGULAR IN ALL CASES EXCEPT COLLECTIONS

MyAp
|--Entity
|  |--AbstractEntity.class
|  |--Comment.class
|  |--Post.class
|--DataMapper
|  |--AbstractDataMapper.class
|  |--CommentDataMapper.class
|  |--PostDataMapper.class
|--Service
|  |--AbstractService.class
|  |--CommentService.class
|  |--PostService.class
于 2012-12-14T16:13:44.323 回答
0

像 JaxB 这样的一些框架将配置信息放入 package-info.java。在这种情况下,必须使用第一种方法才能使用 package-info.java。

于 2012-12-18T12:02:42.433 回答