> For the complete documentation index, see [llms.txt](https://folko.gitbook.io/podgotovka-k-sobesedovaniyu/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://folko.gitbook.io/podgotovka-k-sobesedovaniyu/paradigmy-proektirovaniya/principy-dlya-razrabotki-kiss-dry-yagni-bduf-solid-apo-i-britva-okkama.md).

# Принципы для разработки: KISS, DRY, YAGNI, BDUF, SOLID, APO и бритва Оккама

#### 1. YAGNI

&#x20;You Aren’t Gonna Need It / Вам это не понадобится\
\
&#x20;Этот принцип прост и очевиден, но ему далеко не все следуют. Если пишете код, то будьте уверены, что он вам понадобится. Не пишите код, если думаете, что он пригодится позже.\
\
&#x20;Этот принцип применим при рефакторинге. Если вы занимаетесь рефакторингом метода, класса или файла, не бойтесь удалять лишние методы. Даже если раньше они были полезны – теперь они не нужны.\
\
&#x20;Может наступить день, когда они снова понадобятся – тогда вы сможете воспользоваться git-репозиторием, чтобы воскресить их из мертвых.\ <br>

#### 2. DRY

&#x20;Don’t Repeat Yourself / Не повторяйтесь\
\
&#x20;Эта концепция была впервые сформулирована в книге Энди Ханта и Дэйва Томаса «Программист-прагматик: путь от подмастерья к мастеру».\
\
&#x20;Идея вращается вокруг единого источника правды (single source of truth — SSOT). Что это вообще такое?\ <br>

> В проектировании и теории информационных систем единый источник истины (SSOT) – это практика структурирования информационных моделей и схемы данных, которая подразумевает, что все фрагменты данных обрабатываются (или редактируются) только в одном месте… SSOT предоставляют достоверные, актуальные и пригодные к использованию данные.\
> \
> &#x20;– Википедия

\
\
&#x20;Использование SSOT позволит создать более прочную и понятную кодовую базу.\
\
&#x20;Дублирование кода – пустая трата времени и ресурсов. Вам придется поддерживать одну и ту же логику и тестировать код сразу в двух местах, причем если вы измените код в одном месте, его нужно будет изменить и в другом.\
\
&#x20;В большинстве случаев дублирование кода происходит из-за незнания системы. Прежде чем что-либо писать, проявите прагматизм: осмотритесь. Возможно, эта функция где-то реализована. Возможно, эта бизнес-логика существует в другом месте. Повторное использование кода – всегда разумное решение.\ <br>

#### 3. KISS

&#x20;Keep It Simple, Stupid / Будь проще\
\
&#x20;Этот принцип был разработан ВМС США в 1960 году. Этот принцип гласит, что простые системы будут работать лучше и надежнее.\
\
&#x20;У этого принципа много общего с переизобретением колеса, которым занимались в 1970-х. Тогда он звучал как деловая и рекламная метафора.\
\
&#x20;Применительно к разработке ПО он значит следующее – не придумывайте к задаче более сложного решения, чем ей требуется.\
\
&#x20;Иногда самое разумное решение оказывается и самым простым. Написание производительного, эффективного и простого кода – это прекрасно.\
\
&#x20;Одна из самых распространенных ошибок нашего времени – использование новых инструментов исключительно из-за того, что они блестят. Разработчиков следует мотивировать использовать новейшие технологии не потому, что они новые, а потому что они подходят для работы.\ <br>

#### 4. Big Design Up Front

&#x20;Глобальное проектирование прежде всего\
\
&#x20;Этот подход к разработке программного обеспечения очень важен, и его часто игнорируют. Прежде чем переходить к реализации, убедитесь, что все хорошо продумано.\ <br>

> Зачастую продумывание решений избавляло нас от проблем при разработке… Внесение изменений в спецификации занимало час или два. Если бы мы вносили эти изменения в код, на это уходили бы недели. Я даже не могу выразить насколько сильно я верю в важность проектирования перед реализацией, хотя адепты экстремального программирования предали эту практику анафеме. Я экономил время и делал свои продукты лучше, используя BDUF, и я горжусь этим фактом, чтобы там ни говорили фанатики экстремального программирования. Они просто ошибаются, иначе сказать не могу.\
> \
> &#x20;— Джоел Спольски

\
&#x20;Многие разработчики считают, что если они не пишут код, то они не добиваются прогресса. Это неверный подход. Составив план, вы избавите себя от необходимости раз за разом начинать с нуля.\
\
&#x20;Иногда в недостатках и процессах разработки архитектуры должно быть замешаны и другие люди. Чем раньше вы все это обсудите, тем лучше будет для всех.\
\
&#x20;Очень распространенный контраргумент заключается в том, что стоимость решения проблем зачастую ниже стоимости времени планирования. Чем с меньшим количеством ошибок столкнется пользователь, тем лучше будет его опыт. У вас может не быть другого шанса справиться с этими ошибками.\ <br>

#### 5. SOLID

\
&#x20;Это наиболее известный принцип разработки ПО. Solid — это аббревиатура от:\
\
&#x20;**S) Single-responsibility principle /Принцип единственной ответственности**\
\
&#x20;Его важность невозможно переоценить. Каждый объект, класс и метод должны отвечать только за что-то одно. Если ваш объект/класс/метод делает слишком много, вы получите спагетти-код. Вот пример:\ <br>

```
const saveTodo = async () => {
    try {
        response = await saveTodoApi(); 
        showSuccessPop('Success'); 
        window.location.href = '/successPage';
    } catch (error) { 
        showErrorPopup(`Error: ${error} `);
    }
}
```

\
&#x20;Этот метод кажется безобидным, но на самом деле он делает слишком много:\ <br>

1. &#x20;Сохраняет объект
2. &#x20;Обрабатывает уведомление в UI
3. &#x20;Выполняет навигацию

\
&#x20;Еще один побочный эффект такого кода – проблемы с тестированием. Запутанный функционал тестировать сложно.\
\
&#x20;**O) Open–closed principle / Принцип открытости-закрытости**\
\
&#x20;Программные объекты должны быть открыты для расширения, но закрыты для модификации. Речь о том, что нельзя переопределять методы или классы, просто добавляя дополнительные функции по мере необходимости.\
\
&#x20;Хороший способ решения этой проблемы – использование наследования. В JavaScript эта проблема решается с помощью композиции.\
\
&#x20;Простое правило: если вы изменяете сущность, чтобы сделать ее расширяемой, вы впервые нарушили этот принцип.\
\
&#x20;**L) Liskov substitution principle / Принцип подстановки Лисков**\
\
&#x20;Этот принцип гласит, что объекты старших классов должны быть заменимы объектами подклассов, и приложение при такой замене должно работать так, как ожидается.\
\
&#x20;**I) Interface segregation principle / Принцип разделения интерфейсов**\
\
&#x20;Этот принцип был сформулирован Робертом Мартином, когда он консультировал Xerox, и он очевиден.\ <br>

> Объекты не должны зависеть от интерфейсов, которые они не используют

\
\
&#x20;ПО должно разделяться на независимые части. Побочные эффекты необходимо сводить к минимуму, чтобы обеспечивать независимость.\
\
&#x20;Убедитесь, что вы не заставляете объекты реализовывать методы, которые им никогда не понадобятся. Вот пример:\ <br>

```
interface Animal {
  eat: () => void;
  walk: () => void;
  fly: () => void;
  swim: () => void;
}
```

\
&#x20;Не все животные могут fly, walk или swim, поэтому эти методы не должны быть частью интерфейса или должны быть необязательными.\
\
&#x20;**D) Dependency inversion principle / Принцип инверсии зависимостей**\
\
&#x20;Этот принцип невозможно переоценить. Мы должны полагаться на абстракции, а не на конкретные реализации. Компоненты ПО должны иметь низкую связность и высокую согласованность.\
\
&#x20;Заботиться нужно не о том, как что-то устроено, а о том, как оно работает. Простой пример – использование дат в JavaScript. Вы можете написать для них свой слой абстракции. Тогда если у вас сменится источник получения дат, вам нужно будет внести изменения в одном месте, а не в тысяче.\
\
&#x20;Иногда добавление этого уровня абстракции требует усилий, но в конечном итоге они окупаются.\
\
&#x20;В качестве примера взгляните на [date-io](https://github.com/dmtrKovalenko/date-io), в этой библиотеке создан тот уровень абстракции, который позволяет вам использовать её с разными источниками дат.\ <br>

#### 6. Avoid Premature Optimization

&#x20;Избегайте преждевременной оптимизации\
\
&#x20;Эта практика побуждает разработчиков оптимизировать код до того, как необходимость этой оптимизации будет доказана. Думаю, что если вы следуете KISS или YAGNI, вы не попадетесь на этот крючок.\
\
&#x20;Поймите правильно, предвидеть, что произойдет что-то плохое – это хорошо. Но прежде чем вы погрузитесь в детали реализации, убедитесь, что эти оптимизации действительно полезны.\
\
&#x20;Очень простой пример – масштабирование. Вы не станете покупать 40 серверов из предположения, что ваше новое приложение станет очень популярным. Вы будете добавлять серверы по мере необходимости.\
\
&#x20;Преждевременная оптимизация может привести к задержкам в коде и, следовательно, увеличит затраты времени на вывод функций на рынок.\
\
&#x20;Многие считают преждевременную оптимизацию корнем всех зол.\ <br>

#### 7. Бритва Оккама

> Бри́тва О́ккама (иногда ле́звие О́ккама) — методологический принцип, в кратком виде гласящий: «Не следует множить сущее без необходимости»\[1] (либо «Не следует привлекать новые сущности без крайней на то необходимости»).\
> \
> &#x20;— Википедия

\
\
&#x20;Что это значит в мире программирования? Не создавайте ненужных сущностей без необходимости. Будьте прагматичны — подумайте, нужны ли они, поскольку они могут в конечном итоге усложнить вашу кодовую базу.
