类是按功能类型还是按模型分组?

时间:2012-12-14 15:17:01

标签: oop architecture

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

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具有将所有与一个模型类相关的类保持在一起的吸引力。无法下定决心!

3 个答案:

答案 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。