diff --git a/docs/architecture/08-dev-principles.md b/docs/architecture/08-dev-principles.md index 0daeb40..004f7ba 100644 --- a/docs/architecture/08-dev-principles.md +++ b/docs/architecture/08-dev-principles.md @@ -62,7 +62,7 @@ _Don’t Repeat Yourself / Не повторяйтесь_ - Код становится более структурированным и понятным. 4. **Экономия времени:** - Не нужно копировать и вставлять код, а также тестировать его в нескольких местах. - + ### Когда DRY не следует применять слепо: 1. **Избыточная абстракция:** - Иногда попытка устранить дублирование может привести к созданию сложных и ненужных абстракций, которые усложняют понимание кода. @@ -127,30 +127,5 @@ _Keep It Simple, Stupid / Будь проще_ Применительно к разработке ПО он значит следующее – не придумывайте к задаче более сложного решения, чем ей требуется.\ Иногда самое разумное решение оказывается и самым простым. Написание производительного, эффективного и простого кода – это прекрасно. -## SOLID -Принципы SOLID — это набор из пяти ключевых принципов объектно-ориентированного программирования и проектирования, которые помогают создавать гибкие, поддерживаемые и масштабируемые программные системы. Аббревиатура SOLID была введена Робертом Мартином (известным также как Uncle Bob) и расшифровывается следующим образом: - -### Simple responsibility principle (принцип единой ответственности) -У класса должна быть только одна причина для изменения, то есть у него должна быть только одна ответственность или работа. Этот принцип помогает сделать занятия более целенаправленными, более понятными и менее подверженными ошибкам. - -### Open – Closed Principle (Принцип открытости/закрытости) -Программные сущности должны быть открыты для расширения, но закрыты для модификации. Это означает, что вы должны иметь возможность добавлять новые функции в систему, не изменяя существующий код. -Мы можем расширить функциональный компонент и добавить новый компонент пользовательского интерфейса, не затрагивая первый/базовый компонент. Это реализация открытости для расширения, но закрытости для модификации. - -### Liskov Substitution principe (принцип замены Лискова) -Объекты суперкласса должны быть заменяемы объектами его подклассов без нарушения корректности программы. Другими словами, подклассы должны иметь возможность заменять свои базовые классы без возникновения ошибок. - -### Interface segregation principle (Принцип разделения интерфейсов) -Клиентов не следует заставлять зависеть от интерфейсов, которые они не используют. Вместо этого интерфейсы следует разделить на более мелкие, более целенаправленные интерфейсы, соответствующие потребностям клиента. - -### Dependency inversion principle (Инверсия зависимости) -Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Вместо этого, оба должны зависеть от абстракций. Это помогает в разъединении модулей, делая их более пригодными для повторного использования и более простыми для тестирования. - -### Преимущества SOLID: -1. **Гибкость:** Код становится проще расширять и модифицировать. -2. **Поддерживаемость:** Упрощается понимание и исправление ошибок. -3. **Тестируемость:** Код, соответствующий SOLID, легче тестировать. -4. **Масштабируемость:** Система становится более устойчивой к изменениям и росту. - 🚀 **_Источник: DeepSeek_** dДополнительный источник: [https://habr.com/ru/companies/itelma/articles/546372/](https://habr.com/ru/companies/itelma/articles/546372/) diff --git a/docs/architecture/10-solid.md b/docs/architecture/10-solid.md new file mode 100644 index 0000000..36405b0 --- /dev/null +++ b/docs/architecture/10-solid.md @@ -0,0 +1,91 @@ +--- +sidebar_position: 10 +--- + +# SOLID + +SOLID в React помогает: +- Держать компоненты маленькими и читаемыми (S). +- Делать их расширяемыми через props и композицию (O). +- Гарантировать предсказуемость работы компонентов (L). +- Избегать перегруженных пропсов и интерфейсов (I). +- Упрощать замену реализаций (API, стейт-менеджер и т.д.) через абстракции (D). + +Принципы SOLID — это набор из пяти ключевых принципов объектно-ориентированного программирования и проектирования, которые помогают создавать гибкие, поддерживаемые и масштабируемые программные системы. Аббревиатура SOLID была введена Робертом Мартином (известным также как Uncle Bob) и расшифровывается следующим образом: + +## Simple responsibility principle (принцип единой ответственности) +У класса должна быть только одна причина для изменения, то есть у него должна быть только одна ответственность или работа. Этот принцип помогает сделать занятия более целенаправленными, более понятными и менее подверженными ошибкам. + +**Применение во Фронтенде:** Каждый компонент/модуль должен выполнять одну задачу. +В React: +- Компонент выполняет **одну задачу**: либо отображает UI, либо управляет состоянием, но не всё сразу. +- Логика выносится в **хуки** или **сервисы**, чтобы компоненты оставались "чистыми". + +Пример: +- ❌ Плохо: `UserProfile` компонент, который извлекает, проверяет, отображает и управляет состоянием. +- ✅ Хорошо: `UserProfile` компонент, который только отображает, и отдельный хук (`useUser`), который извлекает данные. + +## Open – Closed Principle (Принцип открытости/закрытости) +Программные сущности должны быть открыты для расширения, но закрыты для модификации. Это означает, что вы должны иметь возможность добавлять новые функции в систему, не изменяя существующий код. +Мы можем расширить функциональный компонент и добавить новый компонент пользовательского интерфейса, не затрагивая первый/базовый компонент. Это реализация открытости для расширения, но закрытости для модификации. + +**Применение во Фронтенде:** Код должен быть расширяемым без переписывания старой логики. +- Используем **props** для настройки поведения. +- Применяем **композицию** вместо жёсткого наследования. + +Вместо того, чтобы переписывать старые компоненты, проектируйте их так, чтобы можно было добавлять новые функции с помощью свойств/хуков/расширений. +Пример: Хотите добавить новый стиль кнопки? Добавьте свойство для расширения стилей, не дублируйте весь компонент. + + +## Liskov Substitution principe (принцип замены Лискова) +Объекты суперкласса должны быть заменяемы объектами его подклассов без нарушения корректности программы. Другими словами, подклассы должны иметь возможность заменять свои базовые классы без возникновения ошибок. + +**Применение во Фронтенде:** Кнопка `Button` всегда должна действовать как кнопка, независимо от того, является ли она основной, дополнительной или отключенной. + +В React: +- Это проявляется в **контрактах компонентов**: если компонент принимает `props`, он должен работать предсказуемо для любого допустимого значения. +- Не заставляй компонент вести себя неожиданно из-за "хаков" или скрытой логики. + +## Interface segregation principle (Принцип разделения интерфейсов) +Клиентов не следует заставлять зависеть от интерфейсов, которые они не используют. Вместо этого интерфейсы следует разделить на более мелкие, более целенаправленные интерфейсы, соответствующие потребностям клиента.\ +Лучше много маленьких интерфейсов, чем один "толстый". + +**Применение во Фронтенде:** Не заставляйте компоненты принимать свойства, которые они не используют. +- ❌ Плохо: Много лишних свойств в компоненте, 80% которого не используется. +- ✅ Хорошо: Используйте только те свойства которые используются в компоненте. + +В React: +- Не перегружай компонент кучей пропсов. +- Делай узко специализированные пропсы или выноси сложные конфигурации в отдельные структуры. + +Пример: Вместо `user: {id, name, email, role, lastLogin, preferences}`, возможно, вам для UserAvatar нужны только `name` и `profilePic`. +```js +// ❌ Плохо: слишком много пропсов + + +// ✅ Лучше: разделяем интерфейсы + + + ... + ... + +``` + +## Dependency inversion principle (Инверсия зависимости) +Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Вместо этого, оба должны зависеть от абстракций. Это помогает в разъединении модулей, делая их более пригодными для повторного использования и более простыми для тестирования. + +**Применение во Фронтенде:** Опирайтесь на абстракции, а не на детали. +- Вместо жесткого задания функций API в компонентах внедрите сервисный уровень. +- Если завтра ваш API изменится, вы меняете логику сервиса, а не всё приложение. + +В React: +- Используем контекст или hooks для работы с зависимостями (например, API или хранилище). +- Компоненты не должны жёстко зависеть от конкретной реализации. + +## Преимущества SOLID: +1. **Гибкость:** Код становится проще расширять и модифицировать. +2. **Поддерживаемость:** Упрощается понимание и исправление ошибок. +3. **Тестируемость:** Код, соответствующий SOLID, легче тестировать. +4. **Масштабируемость:** Система становится более устойчивой к изменениям и росту. + +🚀 **_Источник: ChatGPT_**