按类型的文件夹或按功能的文件夹


59

我利用了AngularJS样式指南。在本指南中,有一种称为的样式folder-by-feature,而不是folder-by-type,我很好奇什么是最佳方法(在此示例中为Java)

假设我有一个应用程序,可以在其中使用服务,控制器,存储库以及当然的域对象来检索“用户和宠物”。

以文件夹.....样式为例,对于包装结构,我们有两个选择:

1.文件夹类型

com.example
├── domain
│    ├── User.java
│    └── Pet.java
├── controllers
│    ├── UserController.java
│    └── PetController.java
├── repositories
│    ├── UserRepository.java
│    └── PetRepository.java
├── services
│    ├── UserService.java
│    └── PetService.java
│   // and everything else in the project
└── MyApplication.java

2.按功能文件夹

com.example
├── pet
│    ├── Pet.java
│    ├── PetController.java
│    ├── PetRepository.java
│    └── PetService.java
├── user
│    ├── User.java
│    ├── UserController.java
│    ├── UserRepository.java
│    └── UserService.java
│   // and everything else in the project
└── MyApplication.java

什么是好的方法?这样做的理由是什么?



1
我不知道@Laiv。语言/框架真的会影响答案吗?无论如何,另一个问题当然是相关的。
RubberDuck

1
然后,我必须编辑我的答案。是的,这可能是重复的内容
Laiv 2016年

2
我从未理解过按类型文件夹的好处。如果我正在处理与Pet功能有关的票证,则可能会受益于Pet,控制器,存储库和服务的本地性。在什么情况下,我将需要所有控制器,但不需要视图,存储库或服务?
亚历山大

2
似乎没有人提到Java包不仅仅是文件夹。它们还影响对包含类的访问。因此,按层/类型打包实际上可以在Java中提供一些语义值。
安格斯·戈德史密斯

Answers:


69

按类型的文件夹仅适用于小型项目。在大多数情况下,按功能逐个文件夹比较好。

当您只有少量文件(可以说每种类型少于10个文件)时,按类型文件夹就可以。一旦您在项目中获得多个组件,并且所有组件都具有相同类型的多个文件,就很难找到您要查找的实际文件。

因此,按功能文件夹由于其可伸缩性更好。但是,如果按功能逐个文件夹,则最终会丢失有关文件表示的组件类型的信息(因为controller可以说它不再位于文件夹中),因此这也变得令人困惑。为此有2个简单的解决方案。

首先,您可以遵守一些通用的命名约定,这些约定隐含了文件名的类型。例如,John Papa流行的AngularJS样式指南包含以下内容:

命名准则

  • 为所有组件使用一致的名称,遵循描述组件功能的模式,然后(可选)其类型。我
    推荐的模式是feature.type.js。大多数
    资产有2个名称:

    • 文件名(avengers.controller.js)
    • 使用Angular注册的组件名称(AvengersController)

其次,可以将按类型的文件夹和按功能的文件夹样式组合为按功能的文件夹类型:

com.example
├── pet
|   ├── Controllers
│   |   ├── PetController1.java
|   |   └── PetController2.java
|   └── Services
│       ├── PetService1.java
│       └── PetService2.java
├── user
|   ├── Controllers
│   |   ├── UserController1.java
│   |   └── UserController2.java
|   └── Services
│       ├── UserService1.java
│       └── UserService2.java

1
johnpapa风格指南正是我最喜欢的指南:-)
Jelle

1
有时(通常比我们想像的要多),我们给本来就很容易的事情增加了太多的复杂性。命名和包装就是其中的一部分。最好的建议是保持简单。混合都具有两种方法的优点和缺点。
Laiv

1
@Laiv在我给出的示例中,我同意它的矫kill过正,但是在我的大多数实际业务案例中,每个类型文件夹都可以轻松拥有10-20个文件,我认为它非常有用,因为整个功能文件夹的数量大约为50否则文件。
恢复莫妮卡

5
傻瓜,谢谢iPhone自动更正!我的意思是“说话”。
耶尔

2
@Chaotic这个例子太琐碎,无法开始谈论细节,但是在这种情况下,如果您有跨多个组件使用的组件,那么它可能应该是其他组件依赖的组件。
恢复莫妮卡

25

这实际上与所讨论的技术无关,除非您使用一个框架来强制按类型输入文件夹,这是基于约定的配置方法的一部分。

就我个人而言,我强烈认为按功能逐个文件夹要好得多,应尽可能在任何地方使用。它把实际上可以一起工作的类分组在一起,而按类型的文件夹只是复制了类名中通常已经存在的内容。


9
我要补充一点,按功能逐个文件夹可以更轻松地使用类和方法范围(受保护的,打包的...)。
2016年

对于较小的项目,您可能只有一项功能。在这种情况下按类型进行组织要容易得多。
aaaaaa

例如,Grails会强制为您的域,控制器,服务等按类型进行文件夹
。– tylerwal

17

按功能处理软件包高度模块化和内聚性方面脱颖而出。它使我们能够发挥组件的作用范围。例如,我们可以使用访问修饰符对集成或/和扩展实施LoD依赖反转

其他原因是:

  • 简化代码导航
  • 更高的抽象水平
  • 最小化范围(边界上下文)
  • 垂直模块化

文件夹按层提出的实现细节过分强调,(如@大卫提到的)什么不能告诉太多关于我们正在工作的应用程序。与按功能打包不同,按层打包鼓励水平模块化。这种模块化使得处理横切组件变得困难而乏味。

最后,还有第三个选项。鲍勃叔叔的话来说,“ 按组件打包 ”似乎更符合他的打包原则。如果Bob叔叔的意见无关紧要,我让您决定。我觉得这很有趣,因为该约定与我喜欢的他的“干净架构”保持一致。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.