Carpeta por tipo o Carpeta por función

46

Hago uso de una guía de estilo AngularJS. Dentro de esta guía hay un estilo llamado folder-by-feature , en lugar de folder-by-type , y tengo curiosidad por saber cuál es el mejor enfoque (en este ejemplo para Java)

Digamos que tengo una aplicación donde puedo recuperar Usuarios & Mascotas, utilizando servicios, controladores, repositorios y objetos de dominio de curso.

Tomando los estilos de carpeta por, tenemos dos opciones para nuestra estructura de empaque:

1. Carpeta por tipo

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. Carpeta por característica

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

¿Cuál sería un buen enfoque y cuáles son los argumentos para hacerlo?

    
pregunta Jelle 21.12.2016 - 12:15

3 respuestas

51

Carpeta por tipo solo funciona en proyectos a pequeña escala. Carpeta por función es superior en la mayoría de los casos.

Carpeta por tipo está bien cuando solo tiene una pequeña cantidad de archivos (menos de 10 por tipo, digamos). Tan pronto como obtiene múltiples componentes en su proyecto, todos con múltiples archivos del mismo tipo, es muy difícil encontrar el archivo real que está buscando.

Por lo tanto, carpeta por función es mejor debido a su escalabilidad. Sin embargo, si la carpeta por característica termina perdiendo información sobre el tipo de componente que representa un archivo (porque ya no está en una carpeta controller ), por lo que esto también se vuelve confuso. Hay 2 soluciones simples para esto.

Primero, puede cumplir con las convenciones de denominación comunes que implican carácter en el nombre del archivo. Por ejemplo, la popular guía de estilo de AngularJS de John Papa tiene lo siguiente:

  

Directrices de nomenclatura

     
  • Use nombres consistentes para todos los componentes siguiendo un patrón que describe la característica del componente y luego (opcionalmente) su tipo. Mis
      patrón recomendado es feature.type.js. Hay 2 nombres para la mayoría de
      activos:

         
    • el nombre del archivo (avengers.controller.js)
    •   
    • el nombre del componente registrado con Angular (AvengersController)
    •   
  •   

Segundo, puedes combinar los estilos carpeta por tipo y carpeta por función en carpeta por característica por tipo:

com.example
├── pet
├────Controllers
│    ├── PetController1.java
|    └── PetController2.java
├────Services
│    ├── PetService1.java
│    └── PetService2.java
├── user
├────Controllers
│    ├── UserController1.java
│    ├── UserController2.java
├────Services
│    ├── UserService1.java
│    └── UserService2.java
    
respondido por el David Grinberg 21.12.2016 - 15:15
22

Esto realmente no tiene nada que ver con la tecnología en cuestión, a menos que use un marco que lo obligue a realizar una carpeta por tipo como parte de un enfoque de convención sobre configuración.

Personalmente, opino firmemente que la carpeta por función es muy superior y se debe utilizar en todos los sitios tanto como sea posible. Agrupa clases que realmente trabajan juntas, mientras que carpeta por tipo simplemente duplica algo que generalmente ya está presente en el nombre de la clase.

    
respondido por el Michael Borgwardt 21.12.2016 - 12:25
14

Descubrí que es más fácil trabajar con paquetes por función principalmente por un motivo:

Alta modularidad y cohesión : facilita el juego con el alcance de los componentes. Podemos implementar clases / métodos protected o package a los que solo pueden acceder los componentes directamente involucrados con la característica ( Law of Demeter ).

Otras razones son:

  • Navegación de código más fácil
  • Un nivel más alto de abstracción
  • Minimizar ámbitos (contextos delimitadores)
  • Más fácil de escalar (agregar / eliminar más funciones), mantener y reemplazar.

Por otra parte, carpeta por capa pone demasiado énfasis en los detalles de la implementación, como lo mencionó @David, podría ayudar a organizar el contenido dentro de carpetas por función . Sin embargo, tampoco abusaría demasiado de esta estrategia.

    
respondido por el Laiv 21.12.2016 - 13:02

Lea otras preguntas en las etiquetas