HTML Diff
2 added 2 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Просить совета у программиста - плохая идея. Но если вы всё-таки решитесь, в ответ услышите что-то типа "сушите код, соблюдайте принцип единственной ответственности, никогда не переписывайте код с нуля".</p>
1 <p>Просить совета у программиста - плохая идея. Но если вы всё-таки решитесь, в ответ услышите что-то типа "сушите код, соблюдайте принцип единственной ответственности, никогда не переписывайте код с нуля".</p>
2 <p>Если последуете совету сушить код, то есть будете соблюдать принцип DRY, у вас появятся функции с четырьмя булевыми параметрами, а также таблицы, позволяющие отслеживать изменение состояния. Выделение модулей может усложнить отслеживание изменений. А отказ переписывать код уменьшает вероятность сделать удачный продукт.</p>
2 <p>Если последуете совету сушить код, то есть будете соблюдать принцип DRY, у вас появятся функции с четырьмя булевыми параметрами, а также таблицы, позволяющие отслеживать изменение состояния. Выделение модулей может усложнить отслеживание изменений. А отказ переписывать код уменьшает вероятность сделать удачный продукт.</p>
3 <p><em>Справка: выражение "сушите код" произошло от акронима DRY - Don’t repeat yourself, не повторяйся.</em></p>
3 <p><em>Справка: выражение "сушите код" произошло от акронима DRY - Don’t repeat yourself, не повторяйся.</em></p>
4 <p>Советы выше нельзя назвать изначально неправильными. Но слепое следование этим рекомендациям порождает больше проблем, чем выгод.</p>
4 <p>Советы выше нельзя назвать изначально неправильными. Но слепое следование этим рекомендациям порождает больше проблем, чем выгод.</p>
5 <p>В некоторых ситуация лучше делать прямо противоположные вещи: постоянно переписывать код, избегать выделения модулей, повторять код, чтобы не писать всю программу в одной большой функции. Это сложнее, чем слепо соблюдать принцип DRY, но можно попробовать.</p>
5 <p>В некоторых ситуация лучше делать прямо противоположные вещи: постоянно переписывать код, избегать выделения модулей, повторять код, чтобы не писать всю программу в одной большой функции. Это сложнее, чем слепо соблюдать принцип DRY, но можно попробовать.</p>
6 <h2>Содержание</h2>
6 <h2>Содержание</h2>
7 <ul><li><a>Игнорируйте принцип DRY, чтобы находить нужные абстракции</a></li>
7 <ul><li><a>Игнорируйте принцип DRY, чтобы находить нужные абстракции</a></li>
8 <li><a>Объединяйте ответственности, чтобы управлять взаимодействиями между ними</a></li>
8 <li><a>Объединяйте ответственности, чтобы управлять взаимодействиями между ними</a></li>
9 <li><a>Модульность - это не просто механическое разделение программы на минимально возможные части</a></li>
9 <li><a>Модульность - это не просто механическое разделение программы на минимально возможные части</a></li>
10 <li><a>Суть модульности заключается в ограничении вариантов роста</a></li>
10 <li><a>Суть модульности заключается в ограничении вариантов роста</a></li>
11 <li><a>Переписывайте всё</a></li>
11 <li><a>Переписывайте всё</a></li>
12 <li><a>null === true, запретов не существует</a></li>
12 <li><a>null === true, запретов не существует</a></li>
13 </ul><h2>Игнорируйте принцип DRY, чтобы находить нужные абстракции</h2>
13 </ul><h2>Игнорируйте принцип DRY, чтобы находить нужные абстракции</h2>
14 <p>Рекомендация соблюдать принцип DRY - трюизм, общая фраза, которая не имеет смысла вне контекста.</p>
14 <p>Рекомендация соблюдать принцип DRY - трюизм, общая фраза, которая не имеет смысла вне контекста.</p>
15 <p>Никто не любит писать шаблоны. Программисту скучно работать с банальными задачами. Когда нужно написать один и тот же шаблонный код, скажем, восемь раз подряд, разработчик устаёт до того, как открывает редактор. Поэтому не надо советовать программистам соблюдать принцип DRY. Вместо этого лучше показать, как и когда стоит использовать этот принцип.</p>
15 <p>Никто не любит писать шаблоны. Программисту скучно работать с банальными задачами. Когда нужно написать один и тот же шаблонный код, скажем, восемь раз подряд, разработчик устаёт до того, как открывает редактор. Поэтому не надо советовать программистам соблюдать принцип DRY. Вместо этого лучше показать, как и когда стоит использовать этот принцип.</p>
16 <p>Некоторые специалисты интерпретируют принцип DRY как рекомендацию не использовать копипаст, то есть не использовать повторяющийся код. Но лучший способ избежать повторений - не изобретать велосипед заново, то есть не создавать повторно то, что уже существует. К счастью, большинство разработчиков поступает именно так.</p>
16 <p>Некоторые специалисты интерпретируют принцип DRY как рекомендацию не использовать копипаст, то есть не использовать повторяющийся код. Но лучший способ избежать повторений - не изобретать велосипед заново, то есть не создавать повторно то, что уже существует. К счастью, большинство разработчиков поступает именно так.</p>
17 - <p>Практически каждое веб-приложение нуждается в операционной системе, базе данных и других инструментах. Современные сайты повторно испольуют миллионы строк кода. К сожалению, программисты хорошо усвоили принцип DRY, который в руках неопытных специалистов превращается в принцип "всегда используй абстракцию".</p>
17 + <p>Практически каждое веб-приложение нуждается в операционной системе, базе данных и других инструментах. Современные сайты повторно используют миллионы строк кода. К сожалению, программисты хорошо усвоили принцип DRY, который в руках неопытных специалистов превращается в принцип "всегда используй абстракцию".</p>
18 <p>Под абстракцией в данном случае подразумеваются две связанные вещи. Это идея, которую мы хотим реализовать, и реализация этой идеи с помощью выбранного языка программирования. Абстракции - способ повторения, так что вы можете менять части программы в одном месте. Абстракции помогают управлять изменениями в системе и поведением её компонентов.</p>
18 <p>Под абстракцией в данном случае подразумеваются две связанные вещи. Это идея, которую мы хотим реализовать, и реализация этой идеи с помощью выбранного языка программирования. Абстракции - способ повторения, так что вы можете менять части программы в одном месте. Абстракции помогают управлять изменениями в системе и поведением её компонентов.</p>
19 <p>При постоянном использовании абстракции вам приходится гадать, какие части кода нужно менять одновременно. Принцип DRY при слепом использовании приводит к появлению беспорядочного и жёстко связанного кода. Напротив, повторение позволяет понять, какие абстракции на самом деле нужны для реализации идеи.</p>
19 <p>При постоянном использовании абстракции вам приходится гадать, какие части кода нужно менять одновременно. Принцип DRY при слепом использовании приводит к появлению беспорядочного и жёстко связанного кода. Напротив, повторение позволяет понять, какие абстракции на самом деле нужны для реализации идеи.</p>
20 <p><em>Как точно заметила Сэнди Мэтц, повторение намного дешевле неправильных абстракций.</em></p>
20 <p><em>Как точно заметила Сэнди Мэтц, повторение намного дешевле неправильных абстракций.</em></p>
21 <p>У вас не получится заранее писать абстракции, которые можно использовать повторно. Самые успешные библиотеки и фреймворки обычно не создаются с нуля, а выделяются из больших систем. Если вы не сделали с помощью своей новой библиотеки что-то работающее, вряд ли она кому-то пригодится. Повторное использование кода - не лучшее оправдание, чтобы избегать дублирования кода. Поэтому создание переиспользуемого кода можно считать одной из форм преждевременной оптимизации.</p>
21 <p>У вас не получится заранее писать абстракции, которые можно использовать повторно. Самые успешные библиотеки и фреймворки обычно не создаются с нуля, а выделяются из больших систем. Если вы не сделали с помощью своей новой библиотеки что-то работающее, вряд ли она кому-то пригодится. Повторное использование кода - не лучшее оправдание, чтобы избегать дублирования кода. Поэтому создание переиспользуемого кода можно считать одной из форм преждевременной оптимизации.</p>
22 <p>Когда вопрос касается повторений в собственном проекте, задача не в том, чтобы повторно использовать код, а скорее в том, чтобы иметь возможность вносить согласованные изменения. Используйте абстракции, когда вы уверены в согласованности компонентов. Не стремитесь переиспользовать код, иногда повторение - лучшее решение.</p>
22 <p>Когда вопрос касается повторений в собственном проекте, задача не в том, чтобы повторно использовать код, а скорее в том, чтобы иметь возможность вносить согласованные изменения. Используйте абстракции, когда вы уверены в согласованности компонентов. Не стремитесь переиспользовать код, иногда повторение - лучшее решение.</p>
23 <p>Повторяйтесь, но не повторяйте ошибки других людей. Повторяйтесь, чтобы найти нужные абстракции, потом повторяйтесь ещё раз, чтобы реализовать их.</p>
23 <p>Повторяйтесь, но не повторяйте ошибки других людей. Повторяйтесь, чтобы найти нужные абстракции, потом повторяйтесь ещё раз, чтобы реализовать их.</p>
24 <p>Некоторые люди считают, что суть принципа DRY не в отсутствии повторения кода, а в отказе от повторения функциональности и ответственности. Это принцип единственной ответственности, с которым тоже связано много заблуждений.</p>
24 <p>Некоторые люди считают, что суть принципа DRY не в отсутствии повторения кода, а в отказе от повторения функциональности и ответственности. Это принцип единственной ответственности, с которым тоже связано много заблуждений.</p>
25 <h2>Объединяйте ответственности, чтобы управлять взаимодействиями между ними</h2>
25 <h2>Объединяйте ответственности, чтобы управлять взаимодействиями между ними</h2>
26 <p>Большие сервисы рекомендуется разделять на небольшие модули. Каждый модуль решает одну задачу и делает это хорошо. Это позволяет разработчикам надеяться на упрощение изменений и поддержки кода.</p>
26 <p>Большие сервисы рекомендуется разделять на небольшие модули. Каждый модуль решает одну задачу и делает это хорошо. Это позволяет разработчикам надеяться на упрощение изменений и поддержки кода.</p>
27 <p>Это хорошо работает в небольших проектах. Например, повторное использование переменных - важный источник ошибок в коде. Но иногда этот подход не работает. Да, использование одного класса для решения двух задач может выглядеть некрасиво. Но попытка создать два класса для решения двух задач может привести к появлению двух некрасивых классов. Программисту придётся учитывать ещё и взаимодействие этих классов.</p>
27 <p>Это хорошо работает в небольших проектах. Например, повторное использование переменных - важный источник ошибок в коде. Но иногда этот подход не работает. Да, использование одного класса для решения двух задач может выглядеть некрасиво. Но попытка создать два класса для решения двух задач может привести к появлению двух некрасивых классов. Программисту придётся учитывать ещё и взаимодействие этих классов.</p>
28 <p>Единственная разница между объединением и разделением чего-то заключается в том, что одни изменения становятся проще, чем другие. Один из примеров - выбор между монолитом и микросервисами. Разработчику приходится решать, что проще: создавать и разворачивать один сервис или использовать композицию созданных независимо друг от друга сервисов.</p>
28 <p>Единственная разница между объединением и разделением чего-то заключается в том, что одни изменения становятся проще, чем другие. Один из примеров - выбор между монолитом и микросервисами. Разработчику приходится решать, что проще: создавать и разворачивать один сервис или использовать композицию созданных независимо друг от друга сервисов.</p>
29 <p>Важная разница между этими подходами в том, что глобальные изменения проще выполнять в первом случае, а локальные - во втором. Выбор подхода для конкретной команды зависит скорее от факторов окружения, чем от конкретных изменений.</p>
29 <p>Важная разница между этими подходами в том, что глобальные изменения проще выполнять в первом случае, а локальные - во втором. Выбор подхода для конкретной команды зависит скорее от факторов окружения, чем от конкретных изменений.</p>
30 <p>Использование монолитного решения может стать проблемой, когда понадобится добавить новые функции. А микросервисы могут стать проблемой, когда нужна точная координация. Монолит может лучше работать с флагами функций, а микросервисы хорошо работают, когда используется автоматизированное развёртывание.</p>
30 <p>Использование монолитного решения может стать проблемой, когда понадобится добавить новые функции. А микросервисы могут стать проблемой, когда нужна точная координация. Монолит может лучше работать с флагами функций, а микросервисы хорошо работают, когда используется автоматизированное развёртывание.</p>
31 <p>Даже монолит можно разделить на микросервисы внутри одного репозитория. В этом случае он будет разворачиваться как одно целое. Практически всё можно разделить на составные части. Проблема в том, чтобы понять, когда это действительно выгодно.</p>
31 <p>Даже монолит можно разделить на микросервисы внутри одного репозитория. В этом случае он будет разворачиваться как одно целое. Практически всё можно разделить на составные части. Проблема в том, чтобы понять, когда это действительно выгодно.</p>
32 <h2>Модульность - это не просто механическое разделение программы на минимально возможные части</h2>
32 <h2>Модульность - это не просто механическое разделение программы на минимально возможные части</h2>
33 <p>Некоторые программисты своеобразно понимают принцип единственной ответственности. Они жестоко расчленяют программы и получают огромное количество небольших взаимосвязанных модулей. Похожую ситуацию можно увидеть в Bash. Если абстрагироваться от кода, так же устроены очень дорогие механические часы.</p>
33 <p>Некоторые программисты своеобразно понимают принцип единственной ответственности. Они жестоко расчленяют программы и получают огромное количество небольших взаимосвязанных модулей. Похожую ситуацию можно увидеть в Bash. Если абстрагироваться от кода, так же устроены очень дорогие механические часы.</p>
34 <p>Командная строка в UNIX - хороший пример коллекции небольших компонентов, каждый из которых выполняет ровно одну функцию. Из-за этого специалисту иногда бывает сложно понять, какой именно компонент использовать для решения конкретной задачи, и как заставить этот компонент работать правильно. Отличный пример - команда awk, для корректного использования которой приходится устраивать танцы с бубном.</p>
34 <p>Командная строка в UNIX - хороший пример коллекции небольших компонентов, каждый из которых выполняет ровно одну функцию. Из-за этого специалисту иногда бывает сложно понять, какой именно компонент использовать для решения конкретной задачи, и как заставить этот компонент работать правильно. Отличный пример - команда awk, для корректного использования которой приходится устраивать танцы с бубном.</p>
35 <p>Ещё один наглядный пример принципа единственной ответственности - Git. С помощью git checkout вы можете выполнить шесть разных операций, но все они используют похожие операции под капотом. То есть компоненты можно использовать разными способами, даже если они выполняют одну функцию.</p>
35 <p>Ещё один наглядный пример принципа единственной ответственности - Git. С помощью git checkout вы можете выполнить шесть разных операций, но все они используют похожие операции под капотом. То есть компоненты можно использовать разными способами, даже если они выполняют одну функцию.</p>
36 <p>Слой небольших компонентов без общих функций создаёт потребность в дополнительном слое, где функции пересекаются. Если такого слоя нет, пользователь создаст его с помощью алиасов Bash, скриптов или даже с помощью таблицы, из которой можно копипастить данные.</p>
36 <p>Слой небольших компонентов без общих функций создаёт потребность в дополнительном слое, где функции пересекаются. Если такого слоя нет, пользователь создаст его с помощью алиасов Bash, скриптов или даже с помощью таблицы, из которой можно копипастить данные.</p>
37 <p>Но даже дополнительный слой не решает проблему. В Git уже есть дружественные к пользователю команды, созданные для автоматизации работы. Но с пользовательским интерфейсом Git всё ещё сложно работать. Всегда легче добавить флаг к существующей команде, чем использовать его параллельно.</p>
37 <p>Но даже дополнительный слой не решает проблему. В Git уже есть дружественные к пользователю команды, созданные для автоматизации работы. Но с пользовательским интерфейсом Git всё ещё сложно работать. Всегда легче добавить флаг к существующей команде, чем использовать его параллельно.</p>
38 <p>Точно так же функции получают новые булевы флаги, а классы получают новые методы, когда необходимо изменить код. Попытки избежать дублирования в таких случаях создают путаницу.</p>
38 <p>Точно так же функции получают новые булевы флаги, а классы получают новые методы, когда необходимо изменить код. Попытки избежать дублирования в таких случаях создают путаницу.</p>
39 <p>Компоненты можно создавать в соответствии с принципом единственной ответственности. Но со временем ответственность этих компонентов всё равно меняется, а сами компоненты начинают взаимодействовать друг с другом непредсказуемыми способами. Ответственность модуля в системе в текущий момент времени не всегда коррелирует с тем, во что превратится модуль в будущем.</p>
39 <p>Компоненты можно создавать в соответствии с принципом единственной ответственности. Но со временем ответственность этих компонентов всё равно меняется, а сами компоненты начинают взаимодействовать друг с другом непредсказуемыми способами. Ответственность модуля в системе в текущий момент времени не всегда коррелирует с тем, во что превратится модуль в будущем.</p>
40 <h2>Суть модульности заключается в ограничении вариантов роста</h2>
40 <h2>Суть модульности заключается в ограничении вариантов роста</h2>
41 <p>Программист часто изменяет модуль не потому, что именно его нужно изменить, а потому что этот модуль проще всего изменить. Получается, модуль определяет, за какие части системы он никогда не будет отвечать, а не за какие части он отвечает в текущий момент.</p>
41 <p>Программист часто изменяет модуль не потому, что именно его нужно изменить, а потому что этот модуль проще всего изменить. Получается, модуль определяет, за какие части системы он никогда не будет отвечать, а не за какие части он отвечает в текущий момент.</p>
42 <p>Когда у единицы нет правил, определяющих, какой код можно в неё добавить, эта единица принимает в себя больше и больше частей системы. Это всегда верно для модулей с названием util. Также это объясняет, почему<a>в модели MVC</a>большая часть кода попадает в Controller.</p>
42 <p>Когда у единицы нет правил, определяющих, какой код можно в неё добавить, эта единица принимает в себя больше и больше частей системы. Это всегда верно для модулей с названием util. Также это объясняет, почему<a>в модели MVC</a>большая часть кода попадает в Controller.</p>
43 <p>В теории модель MVC предполагает объединение кода приложения в три взаимосвязанных блока. Первый блок для баз данных, второй для пользовательского интерфейса, а третий связывает два первых блока. На практике MVC часто представляет собой монолит с двумя подсистемами: первая для базы данных, вторая для пользовательского интерфейса. И обе подсистемы находятся внутри третьей: контроллера.</p>
43 <p>В теории модель MVC предполагает объединение кода приложения в три взаимосвязанных блока. Первый блок для баз данных, второй для пользовательского интерфейса, а третий связывает два первых блока. На практике MVC часто представляет собой монолит с двумя подсистемами: первая для базы данных, вторая для пользовательского интерфейса. И обе подсистемы находятся внутри третьей: контроллера.</p>
44 <p>Цель использования MVC не ограничивается помещением кода базы данных в один блок. MVC также предполагает отделение кода базы данных от кода фронтенда. Наши данные и то, как мы хотим их просматривать, меняются со временем независимо от кода фронтенда.</p>
44 <p>Цель использования MVC не ограничивается помещением кода базы данных в один блок. MVC также предполагает отделение кода базы данных от кода фронтенда. Наши данные и то, как мы хотим их просматривать, меняются со временем независимо от кода фронтенда.</p>
45 <p>Повторное использование и разделение кода на маленькие компоненты - хорошая практика. Но она должна быть результатом других желаемых изменений. Эта практика - компромисс, связанный с необходимостью упрощать код.</p>
45 <p>Повторное использование и разделение кода на маленькие компоненты - хорошая практика. Но она должна быть результатом других желаемых изменений. Эта практика - компромисс, связанный с необходимостью упрощать код.</p>
46 <p>Разделение кода на компоненты или объединение в монолит нельзя считать хорошими или плохими практиками без учёта контекста. Итоговая оценка зависит от изменений, которые производятся во время дальнейшей работы над приложением. В конце концов, речь идёт об оптимизации кода для возможности изменять его в дальнейшем. Это редко достигается с помощью переиспользуемого кода, так как работа с изменениями часто подразумевает переписывание приложения с нуля.</p>
46 <p>Разделение кода на компоненты или объединение в монолит нельзя считать хорошими или плохими практиками без учёта контекста. Итоговая оценка зависит от изменений, которые производятся во время дальнейшей работы над приложением. В конце концов, речь идёт об оптимизации кода для возможности изменять его в дальнейшем. Это редко достигается с помощью переиспользуемого кода, так как работа с изменениями часто подразумевает переписывание приложения с нуля.</p>
47 <h2>Переписывайте всё</h2>
47 <h2>Переписывайте всё</h2>
48 - <p>Обычно команда или разработчик решают переписывать приложение с нуля, когда другого выхода не остаётся. Например, когда технический долг приводит к тому, что попытки рефакторинга становятся опасными. Или когда система находится в критическом состоянии.</p>
48 + <p>Обычно команда или разработчик решают переписывать приложение с нуля, когда другого выхода не осаётся. Например, когда технический долг приводит к тому, что попытки рефакторинга становятся опасными. Или когда система находится в критическом состоянии.</p>
49 <p>Но иногда причины для переписывания кода менее драматичные. Например, какое-то API перестаёт работать, стартап прекращает работать, или в моду вошли новые подходы, а владелец продукта хочет следовать моде.</p>
49 <p>Но иногда причины для переписывания кода менее драматичные. Например, какое-то API перестаёт работать, стартап прекращает работать, или в моду вошли новые подходы, а владелец продукта хочет следовать моде.</p>
50 <p>Полное переписывание - рискованная затея, так как замена одной работающей системы на другую происходит не за 5 минут. Специалисты редко понимают старую систему полностью, так как некоторые её свойства носят случайный характер. Добавьте сюда скудную документацию, написанные для галочки тесты, неудачные интерфейсы, которые ограничивают поведение пользователей.</p>
50 <p>Полное переписывание - рискованная затея, так как замена одной работающей системы на другую происходит не за 5 минут. Специалисты редко понимают старую систему полностью, так как некоторые её свойства носят случайный характер. Добавьте сюда скудную документацию, написанные для галочки тесты, неудачные интерфейсы, которые ограничивают поведение пользователей.</p>
51 <p>Если замена системы связана с переписыванием всего кода, заранее подготовьтесь к тому, что ваш продукт не будет работать во время этой замены.</p>
51 <p>Если замена системы связана с переписыванием всего кода, заранее подготовьтесь к тому, что ваш продукт не будет работать во время этой замены.</p>
52 <p>Чтобы успешно переписать приложение, нужно планировать миграцию со старой системы на новую, уменьшение нагрузки и другие шаги. Обе системы необходимо поддерживать, пока вы не отключите старую. Медленная и осторожная миграция - единственный правильный вариант, когда вы работаете с большими системами.</p>
52 <p>Чтобы успешно переписать приложение, нужно планировать миграцию со старой системы на новую, уменьшение нагрузки и другие шаги. Обе системы необходимо поддерживать, пока вы не отключите старую. Медленная и осторожная миграция - единственный правильный вариант, когда вы работаете с большими системами.</p>
53 <p>Чтобы добиться успеха, нужно в первую очередь решать самые важные и тяжёлые задачи. Часто они связаны с производительностью системы, с проблемным пользователем или с самым крупным клиентом.</p>
53 <p>Чтобы добиться успеха, нужно в первую очередь решать самые важные и тяжёлые задачи. Часто они связаны с производительностью системы, с проблемным пользователем или с самым крупным клиентом.</p>
54 <p>Если замена не принесла успеха спустя три месяца, она уже никогда не будет успешной.</p>
54 <p>Если замена не принесла успеха спустя три месяца, она уже никогда не будет успешной.</p>
55 <p>Чем дольше вы запускаете новую систему, тем больше времени тратите на поиск багов. К сожалению, миграция откладывается из-за необходимости работы над новыми функциями. В новом проекте появляются возможности для раздувания функциональности. Это известно как эффект второй системы, суть которого заключается в замене небольших работающих систем на большие системы с избыточной функциональностью и оверинжинирингом.</p>
55 <p>Чем дольше вы запускаете новую систему, тем больше времени тратите на поиск багов. К сожалению, миграция откладывается из-за необходимости работы над новыми функциями. В новом проекте появляются возможности для раздувания функциональности. Это известно как эффект второй системы, суть которого заключается в замене небольших работающих систем на большие системы с избыточной функциональностью и оверинжинирингом.</p>
56 <p>Эффект второй системы срабатывает, когда команда неправильно подходит к переписыванию, например, планирует слишком много функций, реализует слишком мало, к тому же, реализованные функции работают ненадёжно. Это похоже на создание игрового движка без игр или каркаса без продукта внутри. Итоговый код получается беспорядочным набором модулей, он не решает свои задачи.</p>
56 <p>Эффект второй системы срабатывает, когда команда неправильно подходит к переписыванию, например, планирует слишком много функций, реализует слишком мало, к тому же, реализованные функции работают ненадёжно. Это похоже на создание игрового движка без игр или каркаса без продукта внутри. Итоговый код получается беспорядочным набором модулей, он не решает свои задачи.</p>
57 <p>Правило не переписывать код появилось из-за того, что переписывание обычно откладывается до последнего, ожидания разработчиков от новой системы завышенные, команда ждёт, что все изменения немедленно начнут работать. Гораздо эффективнее использовать правило "никогда не переписывайте код в спешке", чем просто "никогда не переписывайте код".</p>
57 <p>Правило не переписывать код появилось из-за того, что переписывание обычно откладывается до последнего, ожидания разработчиков от новой системы завышенные, команда ждёт, что все изменения немедленно начнут работать. Гораздо эффективнее использовать правило "никогда не переписывайте код в спешке", чем просто "никогда не переписывайте код".</p>
58 <h2>null === true, запретов не существует</h2>
58 <h2>null === true, запретов не существует</h2>
59 <p>Проблема с буквальным следованием советам в том, что этот подход редко работает на практике. А следование советам любой ценой приводит к плохим последствиям.</p>
59 <p>Проблема с буквальным следованием советам в том, что этот подход редко работает на практике. А следование советам любой ценой приводит к плохим последствиям.</p>
60 <p>Принцип DRY не нужно понимать буквально. Надо помнить, что иногда повторения вредны, а иногда полезны. И что можно использовать абстракции, когда необходимо объединить сущности.</p>
60 <p>Принцип DRY не нужно понимать буквально. Надо помнить, что иногда повторения вредны, а иногда полезны. И что можно использовать абстракции, когда необходимо объединить сущности.</p>
61 <p>Принцип единственной ответственности в этом ключе можно перефразировать так: разделение кода на модули полезно, если интерфейсы модулей простые.</p>
61 <p>Принцип единственной ответственности в этом ключе можно перефразировать так: разделение кода на модули полезно, если интерфейсы модулей простые.</p>
62 <p>Вместо принципа "не переписывай" лучше использовать принцип "не бросай то, что работает". Лучше составить план миграции, поддерживать какое-то время обе системы, и только потом отключить старую.</p>
62 <p>Вместо принципа "не переписывай" лучше использовать принцип "не бросай то, что работает". Лучше составить план миграции, поддерживать какое-то время обе системы, и только потом отключить старую.</p>
63 <p>Когда вы слышите совет, нужно попробовать понять среду и окружение, в которой собираетесь его применять. Среда и окружение могут перевернуть всё с ног на голову и сделать совет вредным. Принципы вроде DRY являются компромиссом, который может быть выгодным для небольших систем, но разрушительным для больших проектов.</p>
63 <p>Когда вы слышите совет, нужно попробовать понять среду и окружение, в которой собираетесь его применять. Среда и окружение могут перевернуть всё с ног на голову и сделать совет вредным. Принципы вроде DRY являются компромиссом, который может быть выгодным для небольших систем, но разрушительным для больших проектов.</p>
64 <p>При работе с большими системами сложно сразу понять последствия того или иного решения. Иногда они проявляются спустя какое-то время после имплементации изменений. И вам придётся тратить дополнительные ресурсы, чтобы завершить процесс.</p>
64 <p>При работе с большими системами сложно сразу понять последствия того или иного решения. Иногда они проявляются спустя какое-то время после имплементации изменений. И вам придётся тратить дополнительные ресурсы, чтобы завершить процесс.</p>
65 <p>В конце концов мы называем хорошие решения чистым кодом, а плохие решения техническим долгом. И забываем, что к хорошим и плохим решениям иногда приводят одни и те же правила.</p>
65 <p>В конце концов мы называем хорошие решения чистым кодом, а плохие решения техническим долгом. И забываем, что к хорошим и плохим решениям иногда приводят одни и те же правила.</p>
66 <p><em>Адаптированный перевод статьи<a>Repeat yourself, do more than one thing, and rewrite everything</a>by tef. Мнение автора оригинальной публикации может не совпадать с мнением администрации "Хекслета".</em></p>
66 <p><em>Адаптированный перевод статьи<a>Repeat yourself, do more than one thing, and rewrite everything</a>by tef. Мнение автора оригинальной публикации может не совпадать с мнением администрации "Хекслета".</em></p>