Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 类应该按功能类型还是按模型分组?_Oop_Architecture - Fatal编程技术网

Oop 类应该按功能类型还是按模型分组?

Oop 类应该按功能类型还是按模型分组?,oop,architecture,Oop,Architecture,我知道标题可能不太清楚,因为我可能没有正确的术语,但举个例子应该可以说明这一点。假设我有一个带有帖子和评论的应用程序,那么将这些帖子和评论分组到不同方式的名称空间/包中的最佳实践是什么。如果没有更好的方法,两者的优点和缺点是什么。以下是我设想的几种不同方式,请注意,这并不是详尽无遗的,只是为了让大家明白这一点: (一) (二) 在一个大项目中,您可以将上述任一方法分成更广泛的组。例如,对于#1,您可以在实体、数据映射器和服务名称空间下有Db、Util、System等,并将类实现放在其中,同时将A

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

(一)

(二)

在一个大项目中,您可以将上述任一方法分成更广泛的组。例如,对于#1,您可以在实体、数据映射器和服务名称空间下有Db、Util、System等,并将类实现放在其中,同时将AbstractEntity类放在实体名称空间下。对于#2,您可以将这些额外的名称空间放在Abstract和Impl下


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

根据我的经验,我所看到的第一个项目远远多于后一个项目(事实上,我从未看到过一个项目在第一个项目上出现分歧)

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

我要补充的另一件事是,除了集合,所有情况下都是单数

MyAp
|--Entity
|  |--AbstractEntity.class
|  |--Comment.class
|  |--Post.class
|--DataMapper
|  |--AbstractDataMapper.class
|  |--CommentDataMapper.class
|  |--PostDataMapper.class
|--Service
|  |--AbstractService.class
|  |--CommentService.class
|  |--PostService.class

我认为这两种方法都有问题

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

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

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

MyAp
|--Core
   |--AbstractEntity.class 
   |--AbstractDataMapper.class
   |--AbstractService.class
|--Posting
   |--Comment.class
   |--Post.class
   |--CommentDataMapper.class
   |--PostDataMapper.class
   |--CommentService.class
   |--PostService.class
一般来说,您的第二种方法看起来类似。在这种情况下,您可以轻松添加越来越多的上下文特定文件夹。比如-‘投票’、‘通知’、‘身份验证’等等。我还建议选择最简单的方式,等到你有了一些‘临界数量’的类,这样你就有了关于如何正确分组类的足够信息


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

一些框架(如JaxB)将配置信息放入package-info.java中。在这种情况下,第一种方法必须能够使用package-info.java

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