documentation
documentation copied to clipboard
MOTIVATION: Добавить больше сравнений с Clean Achitecture
https://www.youtube.com/watch?v=qP9biDbPJ0I
https://habr.com/ru/post/499078/
https://habr.com/ru/company/mobileup/blog/335382/
Сделать вместе с тикетом:
https://github.com/feature-sliced/documentation/issues/155
| Clean Architecture | Feature Sliced | |
|---|---|---|
| 📅 Дата создания | ~ 2012, проверенная временем | 2018, адаптированная под современные реалии |
| 🛠 Применимость | Достаточно абстрактен, имеет много трактовок и имплементаций (что может затруднить онбординг) |
Имеет строгий и одновременно гибкий свод правил, для применения на практике; Представляет собой договоренность среди фронтенд-сообщества |
| 🚀 Экосистема | Из-за разночтений, экосистема богата разнородным инструментарием, но который не факт что подойдет для вашего случая В комьюнити сложно договорится "об одном истинном варианте", что затруднит вкатывание новых разработчиков |
Поддерживаемая и консистентная документация (tutorials, guides, concepts) Развиваемый тулкит для разного рода проектов Помощь от комьюнити с разным стеком на проектах |
| ▶️ UI | Внешняя зависимость, с малым влиянием на приложение "Работайте с этим и выстраивайте связи как хотите сами" |
В первую очередь UI-oriented, т.к. FS считает UI полноценной частью любого современного фронтенд-приложения UI становится полноценной "осью" как и Model, Lib, Api (SliceBased) |
| ⚡️ Адаптация к изменениям | Позиция "Все может поменяться: и фреймворк, и реализация, и бизнес-требования". UI становится "часто меняющимся аспектом", хоть там и может храниться базовый UIKit приложения, который очевидно будет меняться редко (Button/Tabs/Input/...) И находится такие компоненты на одном уровне с другими, наиболее часто меняющимися (LessonCard, CommentForm, LessonsListPage, ...) domains < application ?? ports, adapters |
Архитектура адаптируема к изменениям бизнеса (на этом есть акцент). Меняя же библиотеку, очевидно, придется затронуть соответствующий сегмент реализации: ui/model/api При этом на уровне слоев можно сразу отследить степень изменчивости: shared < entities < features < (widgets) < pages < appИ по этой же градации можно отследить опасность и влияние изменений: - shared: менять опасно, но импакт максимальный (освежить дизайн-систему)- entities: менять менее опасно, но все равно рискованно (вся доменная логика)- features: конкретные юзкейсы, меняются часто- pages: конкретные страницы, меняются постоянно, с наименьшим риском |
| 🍰 Слои и скоупы ответственности | domains - Доменная логикаapplication - Конкретные юзкейсыports/adapters - Конкретные реализации и аспекты для адаптации к внешнему миру (UI, localStorage, API)Все остальное - на усмотрение архитектора/лида проекта |
shared - Общеиспользуемая nonproject-specific логика (UIKit, API, LocalStorage, ...)entities - Доменная логикаfeatures - Конкретные юзкейсыpages - Конкретные страницы/экраны приложенияapp - Логика инициализации приложения |
| 🔳 Доменная область | Распространяется "вчистую" в domains, application. Все остальное - часто меняющиеся "внешние" зависимости, даже UI |
Везде: entities, features, pages - включая UI, как часть предметной области |
| ⛓ Унификация | Из-за "изменчивости UI", строго разделяем UI и чистое описание модели данных.Из-за чего ось изменений размазывается по проекту (ui/OrderForm ~ application/CreateOrder) Это влияет по итогу на то, что при таком сомнительном преимуществе, мы получаем проблему, что у нас изначально кодобаза рискует стать деунифицированной, ибо "ВСЕ МОЖЕТ ПОМЕНЯТЬСЯ" (3 реализации адаптера для одного порта, тож самое с компонентами) |
FS предполагает, что все хранится локализованно и рядом. Т.е. риски деунификации падают - разные реализации сущности/фичи будут все равно лежать рядом UI модуля и его модель данных - лежат рядом (Low Coupling & High Cohesion) |
| 🀄️ Tech-specific | (old-school) В Клине до определенного слоя можно писать без привязки к технологии, что может показаться преимуществом. Но это означает, что всю ключевую логику мы написали без каких либо реактивных примитивов, без чего сложно представить современный фронтенд. И это ведет ни к чему иному как к "костыляем свои велосипеды сами, зато родные и стабильные". Стоит ли оно такого? |
(new-school) FS предполагает что мы можем использовать любые технологии, в том числе примитивы для работы с дата-флоу, дата-фетчингом и отображением. Такое более разрозненно для всего фронта, но позволяет заюзать все преимущество современной экосистемы (например реактивные примитивы для описания бизнес-логики и дата-флоу) |
| 🔩 Explicit Sharing | Непонятно куда класть библиотечный код, компоненты разной ответственности и запросы (они почему то хранятся на самом верху, хотя меняются реже всего обычно) Непонятно как шарить код между проектами (UIKit, Libs, ...) - все делегируется разработчикам |
В FS порядок слоев обсулавливает и правила переиспользования Критерии слоев и сама слоисто-слайсовость подразумевает, что наше приложение композируется из более атомарных элементов-модулей Благодаря этому удается выстраивать гибкую архитектуру, элементы которой можно предсказуемо и контролируемо переиспользовать для всяких нужд |