Нотатки про програмування, музику, подорожі та плівку
Про мене  •  Список нотаток  •  Плівка

Folder by Type и Folder by Feature

ASP.NET, как и большинство других фреймворков, предлагают использовать свою структуру организации файлов в проекте. Почти всегда используется folder by type подход. Он предполагает разделение файлов по типу. Так все контроллеры лежать в одной папке, вьюхи в другой и т. д.

com.example
├── Domain
│    ├── User.cs
│    └── Pet.cs
├── Controllers
│    ├── UserController.cs
│    └── PetController.cs
├── Repositories
│    ├── UserRepository.cs
│    └── PetRepository.cs
├── Services
│    ├── UserService.cs
│    └── PetService.cs
│   // and everything else in the project
└── Startup.cs

Такой подход неплохо работает на небольших проектах, когда файлов немного и фичи состоят из ограниченного количества классов. Проблемы возникают при росте проекта. Когда разрабатываешь большую фичу нужно постоянно держать в голове что в какой папке лежит, постоянно переключаясь между ними. Частично эту проблему решают IDE, но только частично.

Альтернативой является folder by feature подход, при котором все файлы одной фичи лежат в отдельной папке. В таком случае все необходимое для конкретной фичи лежит под рукой и нет ничего лишнего.

Это позволяет:

  • Упростить навигацию в проекте.
  • Построить высокоуровневую абстракцию — открываешь проект и сразу понятно что он из себя представляет, из чего состоит.
  • Выделить вертикальные слои.
com.example
├── Pet
│    ├── Pet.cs
│    ├── PetController.cs
│    ├── PetRepository.cs
│    └── PetService.cs
├── User
│    ├── User.cs
│    ├── UserController.cs
│    ├── UserRepository.cs
│    └── UserService.cs
│   // and everything else in the project
└── Startup.cs

Обычно проблемы возникают когда появляется общий код, который нужно использовать в нескольких частях приложения. Но, в принципе, это известная проблема и ее можно решить грамотной нарезкой на вертикальные слои. Вторая проблема достаточно банальная — привычки, большинство программистов привыкли к классической компоновки.

Ссылки:
Folder-by-type or Folder-by-feature

Надіслати
Поділитись