Найти тему
TechLead Insights

Слои, Фичи, Сущности: Разбор структуры Feature Sliced Design

Оглавление

Feature Sliced Design — это методология разработки, нацеленная на организацию кода в frontend приложениях таким образом, чтобы он был масштабируем, легко поддерживаемым и удобным для командной работы.

Цитата из книги Роберта Мартина "Чистая Архитектура"
Цитата из книги Роберта Мартина "Чистая Архитектура"

При проектировании приложения с использованием Feature Sliced Design важно обеспечить строгое взаимодействие между слоями, где каждый последующий слой может использовать возможности предыдущих, но не наоборот. Это помогает поддерживать кодовую базу организованной, модульной и легко масштабируемой.

Проект состоит из слоев (layers), в свою очередь слой состоит из слайсов (slices) и уже каждый слайс состоит из сегментов (segments).

LAYERS:

1. Shared (Общее):

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

2. Entities (Сущности)

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

3. Features (Функциональность)

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

4. Widgets (Виджеты)

Этот слой включает в себя небольшие, переиспользуемые компоненты, которые могут быть встроены в различные части приложения для повышения его интерактивности и улучшения пользовательского опыта. В контексте социальной сети, это могут быть: виджет лайков, виджет комментариев, панель навигации. По сути виджиты объединяют в себе Entities и Widgets в единый блок

5. Pages (Страницы)

Слой страниц определяет компоновку страниц приложения и связывает маршруты с конкретными страницами. Для социальной сети примерами страниц будут: домашняя страница (где отображаются посты друзей), страница профиля пользователя, страница настроек.

6. Processes (Процессы)

Процессы описывают бизнес-процессы приложения, которые взаимодействуют с различными частями системы. Например процесс регистрации: 1. Страница "Выбор способа регистрации"; 2. Страница "Ввод данных"; 3. Страница "Подтверждение регистрации"

  1. App (Приложение)

Этот слой отвечает за инициализацию приложения и глобальную конфигурацию. Это точка входа в приложение, где происходит настройка роутера, глобальных стилей, сторонних зависимостей (например, Redux Store, Apollo Client для GraphQL).

SLICES:

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

Пример слайса в слое Entities:

В слое Entities пользователи, посты, комментарии и т.д. будут являться слайсами

Преимущества использования Slices

  1. Модульность и Переиспользование: Разделение кода на слайсы упрощает переиспользование кода, поскольку каждый слайс содержит всё необходимое для своей работы и может быть легко интегрирован в другие части приложения.
  2. Упрощение масштабирования: Добавление новой функциональности или расширение существующей становится проще, поскольку вам нужно работать только в рамках соответствующего слайса, не затрагивая остальную часть кодовой базы.
  3. Лучшая поддерживаемость и читаемость кода: Слайсы помогают организовать код таким образом, что его структура становится более очевидной и легко навигируемой для разработчиков.
  4. Изоляция и безопасность: Изменения в одном слайсе влияют только на этот слайс, минимизируя риск непреднамеренного влияния на другие части приложения.

SEGMENTS:

В методологии Feature Sliced Design понятие "сегменты" (segments) относится к дальнейшему разделению слайсов на ещё более мелкие и управляемые части. Сегменты позволяют организовать код внутри слайсов таким образом, чтобы улучшить его читаемость, поддерживаемость. Это особенно полезно в больших и сложных приложениях, где управление кодовой базой может стать вызовом.

Пример использования сегментов:

У нас есть слайс User в слое Entities. Этот слайс можно дополнительно разделить на следующие сегменты:

  • Model (Модель): Содержит бизнес-логику и управление состоянием для сущности. В контексте слайса User, сегмент модели может включать функции создания, изменения и удаления пользователя.
  • Api (API-взаимодействия): Определяет функции и методы для общения с сервером, такие как получение данных пользователя, обновление профиля.
  • Lib (Библиотеки): Вспомогательные функции и утилиты, специфичные для слайса User, которые используются в модели или API.
  • Types (Типы): Описание типов данных и интерфейсов, используемых в слайсе. В случае слайса User, это могут быть типы для профиля пользователя, данных аутентификации и так далее.

PUBLIC API:

В контексте методологии Feature Sliced Design (FSD), понятие Public API относится к явному определению интерфейсов взаимодействия между различными слоями, слайсами и сегментами приложения. Public API помогает контролировать доступ к функциональности и обеспечивает четкую и удобную точку интеграции для других частей системы.

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

Преимущества использования Public API

  1. Инкапсуляция: Public API позволяет скрыть внутреннюю реализацию сегмента или слайса, экспонируя только необходимый для использования интерфейс. Это упрощает взаимодействие между различными частями приложения и повышает безопасность.
  2. Упрощение рефакторинга: Благодаря четко определенным точкам входа и выхода, модификация внутренней структуры или логики модуля становится проще и безопаснее, поскольку изменения не затрагивают другие части приложения, пока Public API остается неизменным.
  3. Повышение переиспользуемости: Четко определенное Public API упрощает повторное использование модулей в разных частях приложения или даже в других проектах.
  4. Документирование: Определение Public API служит отличной документацией для разработчиков, описывая, какие функции и возможности предоставляет модуль или слой.

Когда лучше использовать Feature Sliced Design:

  1. Сложные и крупные проекты: Когда у вас есть большое приложение с множеством функций и пользовательских сценариев, Feature Sliced Design помогает организовать код таким образом, чтобы его было легче поддерживать и масштабировать.
  2. Командная разработка: Если над проектом работает несколько разработчиков или команд, методология помогает минимизировать конфликты в коде, делает его более предсказуемым и понятным для всех членов команды.
  3. Переиспользование кода: В случае, если предполагается, что многие компоненты или функции приложения будут переиспользоваться в разных частях приложения или даже в других проектах, Feature Sliced Design предоставляет четкую структуру для их организации.
  4. Постепенная миграция или рефакторинг существующего проекта: Когда нужно модернизировать устаревший кодовую базу, подход позволяет делать это постепенно, модуль за модулем.

Когда использование может быть неоправданным:

  1. Маленькие и простые проекты: Для небольших приложений или прототипов, где структура и сложность кода ограничены, внедрение полноценной методологии может быть излишним и увеличить начальные затраты времени на планирование и настройку.
  2. Проекты с ограниченным сроком жизни: Если проект разрабатывается для одноразового использования или тестирования идеи, где скорость разработки важнее долгосрочной поддержки и масштабируемости, более гибкие или простые подходы могут оказаться предпочтительнее.
  3. Команды, не знакомые с методологией: Если команда разработчиков не имеет опыта работы с Feature Sliced Design и сроки проекта не позволяют тратить время на обучение и адаптацию, это может замедлить процесс разработки. В таких случаях может потребоваться весомое решение о необходимости вложения времени в изучение методологии перед ее внедрением.

Использование методологии Feature Sliced Design может быть очень полезным для многих проектов, но как и любая другая архитектурная практика, она имеет свои сценарии, где она наиболее эффективна, а также ситуации, когда ее применение может быть неоправданным.

В заключение, выбор методологии зависит от множества факторов, включая размер и сложность проекта, опыт команды, а также текущие и будущие требования к приложению. Feature Sliced Design предлагает хорошо структурированный подход к разработке, который может значительно упростить управление сложными проектами и командную работу, но его внедрение следует взвешивать исходя из конкретных потребностей и условий.