---
slug: fsd
title: "Feature-Sliced Design: | слой за слоем"
date: Apr 3, 2024
readingTime: 6 мин.
author: Cold Start
description: Недавно мы дали обзор Feature-Sliced Design (FSD), обсудив его преимущества, недостатки и практическое применение. Развивая эту тему, в этой статье мы глубже рассмотрим…
---

Недавно мы дали обзор **Feature-Sliced Design (FSD)**, обсудив его преимущества, недостатки и практическое применение. Развивая эту тему, в этой статье мы глубже рассмотрим преимущества FSD. В качестве бонуса — разберём пример **eCommerce-проекта**, построенного по принципам FSD.

Краткое напоминание: FSD создан для разработчиков, стремящихся к **масштабируемым** и **поддерживаемым** приложениям. В отличие от традиционных методологий, которые могут приводить к сложным и запутанным кодовым базам по мере роста проекта, FSD прокладывает чёткий путь для эффективной совместной работы как в маленьких командах, так и в крупных организациях.

Что отличает Feature-Sliced Design от других подходов?

## Ключевые преимущества FSD

### Модульная структура

В основе FSD лежит **модульная структура**. Этот подход разделяет приложение на отдельные слои, каждый из которых отвечает за конкретный аспект функциональности. Эти слои далее разбиваются на фичи, общую логику и логику, специфичную для приложения. Такая гранулярная декомпозиция гарантирует, что разработчики могут работать над одной частью приложения, не рискуя случайно затронуть несвязанные области.

### Ориентация на фичи

В отличие от других методологий, которые организуют код по функциональному назначению или типу технологии (как **MVC** или **MVVM**), FSD организует код **по фичам**. Это означает, что всё необходимое для фичи — от логики до UI-компонентов — хранится вместе. Такой подход упрощает понимание устройства фичи, облегчает добавление или удаление функциональности и улучшает командное взаимодействие за счёт чёткого определения ответственности за каждую фичу.

### Масштабируемость

FSD блестяще справляется с **масштабированием**. По мере роста приложений добавление новых фич или обновление существующих становится всё сложнее. Фичецентричная организация FSD в сочетании с модульной структурой позволяет командам масштабировать проекты **горизонтально** — добавляя новые фичи, или **вертикально** — улучшая существующие, без нарушения работы общей системы.

### Переиспользуемость

Одно из ключевых преимуществ FSD — акцент на **переиспользуемости**. Организуя код в общие слои и изолируя логику фич, разработчики легко переиспользуют код в разных частях приложения. Это не только сокращает объём кода, но и обеспечивает единообразие во всём приложении.

### Чёткие границы

FSD устанавливает **чёткие границы** между различными частями приложения. Такое разделение ответственности фундаментально важно для поддержания чистой кодовой базы. Оно определяет, где должна располагаться та или иная функциональность, облегчая разработчикам навигацию по проекту и эффективное управление зависимостями.

### Упрощённое тестирование

С FSD **тестирование** становится проще. Поскольку фичи инкапсулированы вместе со своей логикой и компонентами, написание юнит- и интеграционных тестов для этих изолированных модулей не вызывает затруднений. Такая инкапсуляция гарантирует, что изменения в одной фиче минимально влияют на другие, облегчая регрессионное тестирование.

### Улучшенная совместная работа

FSD спроектирован с учётом **командной работы**. Разбивая приложение на фичи и слои, несколько разработчиков или команд могут одновременно работать над разными аспектами проекта с минимальным пересечением. Такая параллельная разработка оптимизирует процесс и значительно сокращает **time-to-market**.

### Гибкость

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

### Взгляд в будущее

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

## Обзор структуры FSD

Теперь давайте создадим наглядный пример, чтобы пройтись по принципам и структуре Feature-Sliced Design на примере гипотетического веб-приложения. Представьте, что мы разрабатываем eCommerce-платформу **«ColdShop»**, где пользователи могут просматривать товары, добавлять их в корзину и оформлять заказ.

FSD организует код по слоям и срезам преимущественно по фичам, позволяя разработчикам эффективно управлять сложностью и масштабировать проекты. Основные слои FSD:

- **app:** конфигурация приложения (например, роутинг).
- **processes:** бизнес-процессы приложения.
- **pages:** точки входа, соответствующие маршрутам.
- **features:** независимые части бизнес-логики.
- **entities:** бизнес-сущности.
- **shared:** переиспользуемые утилиты, компоненты и библиотеки.

## Пример ColdShop

### Шаг 1: определение структуры

Определим базовую структуру нашего приложения ColdShop по принципам FSD:

- **app:** настройка и роутинг приложения.
- **pages:** Главная, Карточка товара, Корзина, Оформление заказа.
- **features:** Список товаров, Карточка товара, Управление корзиной, Форма оформления.
- **entities:** Товар, Пользователь.
- **shared:** UI-компоненты (Button, Input, Card), утилиты (API-клиент, валидаторы).

### Шаг 2: реализация фичи — Список товаров

Для нашего примера сосредоточимся на фиче **«Список товаров»**. Эта фича отвечает за отображение товаров в виде сетки, где каждый элемент показывает фото, название и цену. Пользователь может нажать на товар, чтобы посмотреть подробности.

Структура фичи:

- **ui:** визуальные компоненты списка товаров (`ProductCard`, `ProductGrid`).
- **model:** управление состоянием и логикой (загрузка товаров, фильтрация, сортировка).
- **lib:** утилитные функции, специфичные для фичи списка товаров.

Рабочий процесс:

- **Model:** реализация функций для загрузки данных о товарах с сервера.
- **UI:** создание компонента `ProductCard` для отображения информации о товаре.
- **UI:** разработка компонента `ProductGrid`, который использует компоненты `ProductCard` для создания сетки товаров.
- **Интеграция:** использование модели для загрузки данных и отображения их в `ProductGrid`.

### Шаг 3: связывание фич и страниц

Главная страница интегрирует фичу «Список товаров» для отображения каталога. Она использует компонент `ProductGrid` из фичи «Список товаров» и передаёт в него данные о товарах, загруженные через модель.

Когда пользователь кликает на товар в `ProductGrid`, он переходит на страницу «Карточка товара» — другую фичу, показывающую подробную информацию о товаре.

### Шаг 4: управление состоянием и потоком данных

- **Entities:** сущность `Product` является центральной для фичи «Список товаров». Она определяет структуру данных о товарах во всём приложении.
- **Shared-слой:** используйте общие утилиты для загрузки данных с сервера и общие UI-компоненты для единообразного оформления приложения.

## Заключение

Этот разбор демонстрирует, как FSD помогает создавать **структурированные**, **масштабируемые** и **поддерживаемые** фронтенд-приложения. Сфокусировавшись на конкретной фиче (Список товаров), мы увидели, как фичи являются самодостаточными, но при этом бесшовно интегрируются с другими частями приложения — страницами и сущностями. Модульный подход не только упрощает разработку и тестирование, но и улучшает командную работу, позволяя параллельно работать над разными фичами без конфликтов.
