diff --git a/docs/effective-developer/code/clean-code/how-to.md b/docs/effective-developer/code/clean-code/how-to.md new file mode 100644 index 0000000000000000000000000000000000000000..4611f96d773b384b254e1392cda437d1b7388d22 --- /dev/null +++ b/docs/effective-developer/code/clean-code/how-to.md @@ -0,0 +1,252 @@ +--- +title: Как напиÑать чиÑтый код и Ñделать жизнь проще +--- + +# Как напиÑать чиÑтый код и Ñделать жизнь проще + +### *РаÑÑказали, что такое чиÑтый код и зачем он нужен и опишем принципы его ÑозданиÑ. Советы оÑнованы на книгах по теме и личной практике.* + +<div style="background: white; display: flex; color: black; padding: 10px 30px; border-radius: 10px; align-items:center; border: 1px solid #e6e5e3; box-shadow: 2px 5px 10px #e6e5e3;"> + <img src="https://media.tproger.ru/uploads/2023/08/image7-autoconverted.jpeg" width="100" height="100" alt="Maxim Morev" style="display: inline-block; border-radius: 100px"> + <div style="margin-left: 1rem;"> + <h1 style="padding: 0; margin: 0">МакÑим Морев</h1> + <p style="padding: 0; margin: 0; font-size: 20px">Ðвтор Ñтатьи, ТехничеÑкий директор</p> + </div> +</div> + +> ***[Ð¡Ñ‚Ð°Ñ‚ÑŒÑ Ð½Ð° TProger](https://tproger.ru/articles/kak-napisat-chistyj-kod-i-sdelat-zhizn-proshhe)*** + +Ð’ универÑитетах, как правило, раÑÑказывают базовые понÑтиÑ: алгоритмы и Ñтруктуры данных, вычиÑлительную математику. Ðо не про то, как краÑиво Ñпроектировать приложение и Ñделать код удобочитаемым и пригодным Ð´Ð»Ñ Ð´Ð¾Ñ€Ð°Ð±Ð¾Ñ‚Ð¾Ðº. Ð’ итоге на практике мы чаÑто получаем беÑÑиÑтемный подход и нечто, что трудно читать, Ñложно и Ñтрашно рефакторить. Потому что Ñвно что-то где-то да упадёт. + + + +Чтобы не допуÑкать такого, мы запуÑкаем Ñерию Ñтатей про код, где подробно раÑÑкажем, как пиÑать краÑиво и чиÑто и получать на выходе поддерживаемый код. Ð’ первой чаÑти раÑÑкажем, что такое чиÑтый код и зачем он нужен и опишем принципы его ÑозданиÑ. Рдальше на конкретных примерах разберём, как делать надо и не надо. + +1. [Да кому вообще нужен Ñтот чиÑтый код?](#first-part) +2. [Как напиÑать чиÑтый код?](#second-part) +3. [Подробное руководÑтво](#third-part) +4. [Как править ÐЕ чиÑтый код?](#fourth-part) + +## <span id="first-part">Да кому вообще нужен Ñтот чиÑтый код?</span> + +Читаемый, легко теÑтируемый, легко компонуемый код, который решает бизнеÑ-задачу и Ñам ÑвлÑетÑÑ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸ÐµÐ¹, Ñокращает ТТM (time to market). За Ñчёт времени, которое разработчик тратит на изучение приложениÑ, внеÑение изменений в код, добавление новых фич и прочее. + +И еÑли приложение плохо Ñпроектировано, код Ñпутан — продуктивноÑть команды, которой приходитÑÑ Ñ€Ð°Ð·Ð±Ð¸Ñ€Ð°Ñ‚ÑŒÑÑ Ñ Ñтим примерно 70% рабочего времени, падает. Ðто факт. И Ñ Ñ Ð½Ð¸Ð¼ ÑталкивалÑÑ. + +Так что, по Ñути, он нужен вÑем, кто работает в IT. + +### Разработчикам + +Ð’ первую очередь Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы быÑтро анализировать и дорабатывать уже готовый код — в том чиÑле ÑобÑтвенный, напиÑанный два меÑÑца назад и благополучно за Ñто Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð±Ñ‹Ñ‚Ñ‹Ð¹. Так, Ñокращаем TTM. + +К тому же, еÑли мы плохо проектируем, плохо пишем, плохо автоматизируем, плохо доÑтавлÑем, Ñтруктура начинает тормозить, возникают ошибки. И приходÑÑ‚ бизнеÑ, лиды, теÑтировщики Ñ Ð¿Ñ€ÐµÑ‚ÐµÐ½Ð·Ð¸Ñми, баг-репортами и доработками. + +> ЧиÑтый и юзабельный код не ценноÑть — а обÑзанноÑть. И чем он однообразнее, Ñкучнее и проще тем проще нам автоматизировать процеÑÑÑ‹. + +### Лидам + +Лиды, как и разработчики, отвечают за качеÑтво готового продукта. И им чиÑтый код помогает быÑтрее проводить ревью, переключатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ задачами и Ñледить за Ñоблюдением Ñоглашений. + +> Бегите из команды, еÑли ваш техлид говорит: «ЧиÑтый код — Ñто миф. Рте, кто пишут про него книги, Ñтатьи и доклады, не работают, а выдумывают теорию, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð° практике неприменима». + +### БизнеÑу + +БизнеÑу доклады про ÑÑтетику и краÑоту кода неинтереÑны. БизнеÑу важна ÑкороÑть поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð¸Ñ‡ÐµÐ¹ и отÑутÑтвие багов. + +Так что чем быÑтрее работает команда, чем больше качеÑтвенных продуктов и доработок она выпуÑкает, тем больше Ð±Ð¸Ð·Ð½ÐµÑ Ð¼Ð¾Ð¶ÐµÑ‚ заработать. + +## <span id="second-part">Хорошо, и как тогда напиÑать чиÑтый код?</span> + +Сперва почитать хорошие книги +Да, лень — но надо. Ð’ÑÑ‘ хорошее и «правильное» уже придумано, и чтобы пиÑать код грамотно, необÑзательно 5 лет изобретать велоÑипеды, как Ñто делал Ñ. + +Рекомендую читать Роберта Мартина, Владимира Хорикова, Джошуа Блоха, Скота Влашина, Стива Макконнелла и ÑтремитьÑÑ Ðº профеÑÑиональной проÑтоте кодированиÑ. Важно: ÑтарайтеÑÑŒ читать книги в оригинале. + +<div style="display: flex; align-items:center; margin-bottom: 10px"> + <img alt="Clean Code: A Handbook of Agile Software Craftsmanship" src="../images/books/Clean_code_handbook.jpg" height="135" width="90"> + <span style="margin-left: 1rem">Clean Code: A Handbook of Agile Software Craftsmanship</span> +</div> + +<div style="display: flex; align-items:center; margin-bottom: 10px"> + <img alt="Clean Code: A Handbook of Agile Software Craftsmanship" src="../images/books/Code_Complete.jpg" height="135" width="90"> + <span style="margin-left: 1rem">Code Complete</span> +</div> + +<div style="display: flex; align-items:center; margin-bottom: 10px"> + <img alt="Clean Code: A Handbook of Agile Software Craftsmanship" src="../images/books/Effective_Java_2nd_Edition.jpg" height="135" width="90"> + <span style="margin-left: 1rem">Effective Java (2nd Edition)</span> +</div> + +<div style="display: flex; align-items:center; margin-bottom: 10px"> + <img alt="Clean Code: A Handbook of Agile Software Craftsmanship" src="../images/books/principles_unit_tests.jpg" height="135" width="90"> + <span style="margin-left: 1rem">Принципы юнит-теÑтированиÑ</span> +</div> + +> Важно понимать, что некоторые топики, которые тот же Мартин отÑтаивал в 2008, уже не актуальны. Советую отÑеивать их и проÑто забирать полезное. + +### Обратить внимание на принципы Unix + +- Write programs that do one thing and do it well — ÐšÐ°Ð¶Ð´Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð°, клаÑÑ, Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñет одну задачу — и выполнÑет хорошо. +- Write programs to work together — Программы работают ÑовмеÑтно, и мы можем выÑтроить пайплайн. Компоненты на разных уровнÑÑ… работают вмеÑте и взаимодейÑтвуют поÑредÑтвом клаÑÑов. +- Write programs to handle text streams, because that is a universal interface — Программы взаимодейÑтвуют, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑƒÐ½Ð¸Ð²ÐµÑ€Ñальный текÑтовый интерфейÑ, а клаÑÑÑ‹ — код. Тип — универÑальный Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ и клаÑÑов. + +Ðти принципы помогают мне оÑознавать архитектуру в Ñрезе Ñложного приложениÑ, и проектировать программы/клаÑÑÑ‹/функции. + +> Unix-филоÑÐ¾Ñ„Ð¸Ñ Ñ…Ð¾Ñ€Ð¾ÑˆÐ¾ подходит Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¸ÐºÑ€Ð¾ÑервиÑов (программ). ПоÑтому Ñ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÑŽ иÑÑледовать мир Unix и иÑпользовать Linux разработчикам. + +## <span id="third-part">Внимательно прочитать руководÑтво ниже</span> + +ЗдеÑÑŒ Ñ Ð¿Ñ€Ð¸Ð²Ñ‘Ð» оÑновные рекомендации по напиÑанию чиÑтого кода, оÑнованные на многих годах практики и книгах «ЧиÑтый код» и «ЧиÑÑ‚Ð°Ñ Ð°Ñ€Ñ…Ð¸Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð°: РуководÑтво ремеÑленника по Ñтруктуре и проектированию программного обеÑпечениÑ». + + + +### Ð’Ñегда улучшайте код, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ работаете + +Мартин иÑпользует «Правило бойÑкаута» и призывает улучшать кодовую базу поÑтоÑнно (так же, как бойÑкауты оÑтавлÑÑŽÑ‚ кемпинг в лучшем ÑоÑтоÑнии, чем он был до визита). Ðто очень Ð²Ð°Ð¶Ð½Ð°Ñ Ð¶Ð¸Ð·Ð½ÐµÐ½Ð½Ð°Ñ Ð¸Ð´ÐµÑ. + +Поддерживайте Ñвой код в хорошем ÑоÑтоÑнии. ИÑправлÑйте ошибки как можно раньше, удалÑйте неиÑпользуемый код и обновлÑйте его, чтобы он ÑоответÑтвовал новым требованиÑм. + +И еÑли нашли «Ñомнительную, Ñтранную дичь» в Ñтаром коде — Ñоберите команду, обÑудите то, что обнаружили. ВероÑтно, Ñто «нечто» именно то, что Ñтоит улучшить — или вовÑе избавитьÑÑ. + +### Think twice, code once + +Прежде чем приÑтупить к разработке, доработке, рефакторингу, разберитеÑÑŒ в том, как функциÑ/ÑиÑтема работает по данному потоку. Станьте ÑкÑпертом в предметной облаÑти. + +### ИÑпользуйте функциональную парадигму + +Она загонÑет Ð½Ð°Ñ Ð² рамки чиÑтого кода и ÑпоÑобÑтвует Ñледовать лучшим практикам. Кроме того, чиÑтое ООП в программах не нужно. Серьёзно, нет. + +> Ðто тема Ð´Ð»Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð¹ Ñтатьи, но тут поделюÑÑŒ фактом: в неÑкольких больших банках Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ñ€Ð°Ð´Ð¸Ð³Ð¼Ð° — Ñтандарт де-факто при напиÑании микроÑервиÑов. И Ñоветую почитать, что Роберт Мартин пишет в блогеAnd the future is looking very functional to me. + +### Делите код на Ñлои + +Каждый Ñлой должен выполнÑть определённую функцию и быть незавиÑимым от других Ñлоёв. + +- РазделÑйте логику и предÑтавление, чтобы упроÑтить теÑтирование и обеÑпечить незавиÑимоÑть компонентов. +- ИÑпользуйте Вертикальное разделение. «Переменные, функции должны быть определены близко к тому меÑту, где они иÑпользуютÑÑ» (G10 Vertical Separation Clean Code, page 292). +- ОпирайтеÑÑŒ на луковичную архитектуру, где внутренний Ñлой ничего не знает о внешнем — Ñто помогает визуализировать и проектировать Ñтруктуру приложениÑ. + + + +Как напиÑать чиÑтый код и Ñделать жизнь проще 3 +Пара материалов по теме: + +- [5 essential patterns of software architecture](https://www.redhat.com/architect/5-essential-patterns-software-architecture#layered) +- [14 software architecture design patterns to know](https://www.redhat.com/architect/14-software-architecture-patterns) +- [The Onion Architecture : part 1](https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/) + +### Соблюдайте принципы SOLID Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑервиÑов, клаÑÑов и функций + +Ðам оÑобенно важен «Принцип единÑтвенной ответÑтвенноÑти (Single Responsibility Principle)» Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов и функций, ÑервиÑов: + +> «Каждый клаÑÑ Ð¸Ð»Ð¸ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ выполнÑть только одну задачу». + +То еÑть пишите функции, которые делают только одну вещь — и делают её хорошо. ЕÑть неÑколько ÑпоÑобов убедитьÑÑ, что выполнили Ñто правило: + +- Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñет только те дейÑтвиÑ, которые находÑÑ‚ÑÑ Ð½Ð° одном уровне Ñ Ð¾Ð±ÑŠÑвленным именем, выполнÑет задачу как бы замкнуто в Ñвоём теле; и еÑли какие-то запроÑÑ‹ пролетают наружу, как Ñто бывает в функциÑÑ… ÑервиÑов приложений, то через шлюзы; +- Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñет дейÑтвиÑ, которые находÑÑ‚ÑÑ Ð½Ð° одном уровне абÑтракции; +- из одной функции не получаетÑÑ Ð²Ñ‹Ð´ÐµÐ»Ð¸Ñ‚ÑŒ другие; +- функцию не получаетÑÑ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÑŒ на Ñекции. + +### Избегайте наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ + +Сложные иерархии наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð¾Ð´ÑÑ‚ к путанице и проблемам отладки. ПоÑтарайтеÑÑŒ ограничить ÑложноÑть клаÑÑа, ÑохранÑÑ ÑвÑзанную функциональноÑть вмеÑте, а не раÑпределÑÑ ÐµÑ‘ по неÑкольким уровнÑм абÑтракции. + +### Предпочитайте полиморфизм операторам If/Else + +Приложение будет более гибким, еÑли мы вынеÑем поведение в клаÑÑÑ‹, убрав тем Ñамым Ð±Ð¸Ð·Ð½ÐµÑ Ð»Ð¾Ð³Ð¸ÐºÑƒ принÑÑ‚Ð¸Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ð¹, ветвлений в родÑтвенные доменные клаÑÑÑ‹. + +### DRY + +Код должен быть повторно иÑпользован только тогда, когда имеет ту же ответÑтвенноÑть. + +ЕÑли вы иÑпользуете один и тот же код неÑколько раз, выноÑите его в отдельную функцию (клаÑÑ, компонент, ÑервиÑ) чтобы избежать Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ упроÑтить поддержку. + +> Ðе увлекайтеÑÑŒ DRY при напиÑании теÑтов. УниверÑальноÑть в них чаÑто уменьшает читабельноÑть, а значит, ÑÑноÑть. Помните, теÑÑ‚ — Ñто документациÑ. + +### КлаÑÑÑ‹ не должны знать о внутренней реализации других клаÑÑов + +Ðе думайте о внутренней работе юнита (клаÑÑа, функции) — лучше Ñмотреть на него, как на чёрный Ñщик. Ðто поможет при проектировании и пиÑании прекраÑно теÑтируемого кода. + +### G22: Make Logical Dependencies Physical + +ЕÑли один модуль завиÑит от другого, Ñта завиÑимоÑть должна быть физичеÑкой, а не только логичеÑкой. Также завиÑимоÑть должна быть очевидной + +### ИÑпользуйте понÑтные и опиÑательные имена + +Ð”Ð»Ñ Ð²Ñего: переменных, функций, клаÑÑов и других Ñлементов кода. Избегайте Ñокращений и аббревиатур. + +### Форматируйте код + +КазалоÑÑŒ бы, очевидное правило. Ðо как показывает практика — нет. ПоÑтому: + +- открыли клаÑÑ Ð² Idea, нажали Ctrl + Alt + L, продолжаем работу; +- одной пуÑтой Ñтроки в отÑтупах между блоками в коде доÑтаточно. + +> Современные IDE умеют форматировать перед коммитом или при Ñохранении файла. Ðо лучше один раз вручную уÑтановить Ñтандарт — и потом придерживатьÑÑ ÐµÐ³Ð¾ ÑредÑтвами автоматизации. + +### ОпирайтеÑÑŒ на 3 закона TDD + +- You may not write production code until you have written a failing unit test — Мы не выпуÑкаем в прод код, который не покрыт теÑтами. +- You may not write more of a unit test than is sufï¬cient to fail, and not compiling is failing — Покрываем теÑтами код в доÑтаточном количеÑтве, чтобы убедитьÑÑ, что данный Ñлой (клаÑÑ, функциÑ) работает верно. Ðе дублируйте теÑÑ‚ кейÑÑ‹ на разных уровнÑÑ…. +ЕÑли вÑе Ñделали правильно: покрыли юнит-теÑтами бизнеÑ-логику, не нужно дублировать проверку вÑех бизнеÑ-кейÑов интеграционными теÑтами. +- You may not write more production code than is sufï¬cient to pass the currently failing test — ÐапиÑал код — напиÑал теÑты. Или в обратном порÑдке. + +> Ðти законы можно интерпретировать и иÑпользовать и тем, кто не придерживаетÑÑ ÐºÐ°Ð½Ð¾Ð½Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ TDD. + +### Ðе иÑпользуйте иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ ошибок + +Мартин рекомендовал в Ñвоё Ð²Ñ€ÐµÐ¼Ñ Ð¸Ñпользовать иÑключениÑ. Ð Ñ â€” нет. ИÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð½Ð°Ñ â€” только Ñигналы багов. Ð Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ ошибок мы иÑпользуем [R.O.P](https://fsharpforfunandprofit.com/rop/). + +### Комментарий — признак плохого кода + +Пишите комментарии внутри кода только тогда, когда они объÑÑнÑÑŽÑ‚, не что код делает, а почему он напиÑан таким образом. + +> Общее правило Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтва Ñлучаев: еÑли вам приходитÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть комментарии — перепишите код. + +### Задавайте границы Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… библиотек и ÑиÑтем +Оборачивайте внешние библиотеки или API в API который подходит вашему дизайну — Ñто даÑÑ‚ Ð·Ð°Ð¿Ð°Ñ Ð¿Ñ€Ð¾Ñ‡Ð½Ð¾Ñти. + +ПрименÑйте[ Anti-corruption Layer pattern](https://learn.microsoft.com/en-us/azure/architecture/patterns/anti-corruption-layer) в дизайне кода. И иÑпользуйте юнит-теÑты. + +### Живите в парадигме Null Safety + +Ðе передавайте null + +Ðе возвращайте null + +Ðе иÑпользуйте null + +### Размер функции или метода — макÑимум пÑть Ñтрок + +Об Ñтом пишет КриÑтиан КлауÑен в книге «ПÑть Ñтрок кода» которую Роберт Мартин рекомендует. + +> Сам Мартин указывает, что размер функции не должен превышать 20 Ñтрок по 150 Ñимволов каждый, но чем меньше — тем лучше. + +### Идеальное количеÑтво входных параметров Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ — один + +Параметры уÑложнÑÑŽÑ‚ функцию и запутывают её воÑприÑтие. ОÑобенно Ñто каÑаетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… — потому что мало кто ожидает, что Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð² аргументах будет возвращать значениÑ. ПоÑтому: + +- Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ преобразует входной аргумент;еÑли вы видите такую функцию или напиÑали её только что, иÑправьте — результат Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½ÑƒÐ¶Ð½Ð¾ передавать в возвращаемом значении — и точка; +- некоторые аргументы Ñтоит упаковать в отдельном клаÑÑе — так Ñоветует Ñтарина Блох, отец МакконÑл, Ñоветую Ñ. + +### Отделите бизнеÑ-логику предметной облаÑти от логики Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ + +Ðапример, бизнеÑ-правила, конÑиÑтентное ÑоÑтоÑние объектов в ÑиÑтеме, проверки ограничений (валидациÑ), раÑчёты, иÑпользуемые в решении, не Ñледует путать Ñ Ñ‚ÐµÑ…Ð½Ð¸Ñ‡ÐµÑкими деталÑми, такими как Ñхема базы данных, интеграции Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ð¼Ð¸ ÑиÑтемами, ÑервиÑами ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ и уровнем DTO. + +Ðаконец, помните, что напиÑание чиÑтого кода — Ñто ремеÑло и где-то даже иÑкуÑÑтво, которое требует практики и терпениÑ. Ðе бойтеÑÑŒ перепиÑывать код, еÑли Ñто поможет улучшить его качеÑтво и поддерживаемоÑть. РеÑли ищете Ñлегантное проÑтое решение, Ñмотрите [кукбук](https://habr.com/ru/companies/gazprombank/articles/722620/). + +## <span id="fourth-part">РеÑли мне попал в руки ÐЕ чиÑтый код?<span> + +Тогда начинаем рефакторинг. Я иÑпользую такой алгоритм: + +- ПроÑматриваем приложение Ñверху вниз, оцениваем наÑколько оно хорошо Ñпроектировано и как опиÑаны клаÑÑÑ‹. +- Узнаем у автора Ñтого непотребÑтва, что делает ÑервиÑ. +- Открываем Readme и в функциональном Ñтиле опиÑываем назначение ÑервиÑа. Ðам пригодÑÑ‚ÑÑ [Markdown Best practices](https://www.markdownguide.org/basic-syntax/). Лучше визуализировать процеÑÑ (например, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [ExcaliDraw](https://excalidraw.com/)) Ñто поможет предÑтавить правильную картину и Ñтруктуру клаÑÑов. +- Продумываем, как будем вÑÑ‘ Ñто теÑтировать. ЕÑли вÑÑ‘ выглÑдит ÑовÑем монÑтруозно, Ñ Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°ÑŽ воÑпользоватьÑÑ Ð´Ð¾Ñ€Ð¾Ð³Ð¸Ð¼Ð¸, но покрывающими макÑимум кода интеграционными теÑтами. Раз уж Ñто творение орков работает, зафикÑируем ÑоÑтоÑние и покроем крайние точки теÑтами. ÐŸÑ€Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ð°Ñ Ñ‚Ð°ÐºÑ‚Ð¸ÐºÐ°. +- Во Ð²Ñ€ÐµÐ¼Ñ Ñ€ÐµÑ„Ð°ÐºÑ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° Ñразу покрываем код юнит-теÑтами. +Ðа выходе получим проÑтой Ñлегантный дизайн в функциональной парадигме, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑпоÑобÑтвует Ñледованию хорошим принципам дизайна и рекомендациÑм Мартина в чаÑтноÑти. + +### Рчто дальше? + +Ð’ первой чаÑти Ñ Ð¾Ð¿Ð¸Ñал ÑмыÑл и принципы чиÑтого кода. Ð’ Ñледующей мы проанализируем приложение на предмет чиÑтоты кода. Я пройдуÑÑŒ по каждому клаÑÑу и опишу недоÑтатки. И раÑÑкажу, как Ñто иÑправлÑть. \ No newline at end of file diff --git a/docs/effective-developer/code/clean-code/images/books/Clean_code_handbook.jpg b/docs/effective-developer/code/clean-code/images/books/Clean_code_handbook.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4023149dd8ee4ee592c4909cb20ab276be2b4ad7 Binary files /dev/null and b/docs/effective-developer/code/clean-code/images/books/Clean_code_handbook.jpg differ diff --git a/docs/effective-developer/code/clean-code/images/books/Code_Complete.jpg b/docs/effective-developer/code/clean-code/images/books/Code_Complete.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f4158c607e1174a0650e3bae32d7cad7dfb78b8 Binary files /dev/null and b/docs/effective-developer/code/clean-code/images/books/Code_Complete.jpg differ diff --git a/docs/effective-developer/code/clean-code/images/books/Effective_Java_2nd_Edition.jpg b/docs/effective-developer/code/clean-code/images/books/Effective_Java_2nd_Edition.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6ff8212eb7b48b82b151fefe31001a7a105a0fe Binary files /dev/null and b/docs/effective-developer/code/clean-code/images/books/Effective_Java_2nd_Edition.jpg differ diff --git a/docs/effective-developer/code/clean-code/images/books/principles_unit_tests.jpg b/docs/effective-developer/code/clean-code/images/books/principles_unit_tests.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1cd53da9e3771d7c892f5ec1be87bcf7328ee63e Binary files /dev/null and b/docs/effective-developer/code/clean-code/images/books/principles_unit_tests.jpg differ diff --git a/docs/effective-developer/code/clean-code/images/how-to-write-clean-code.jpeg b/docs/effective-developer/code/clean-code/images/how-to-write-clean-code.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2ea3d931f442b171071ea8cdf5f4b18d22a348ea Binary files /dev/null and b/docs/effective-developer/code/clean-code/images/how-to-write-clean-code.jpeg differ diff --git a/docs/effective-developer/code/clean-code/images/onion-architecture.jpeg b/docs/effective-developer/code/clean-code/images/onion-architecture.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0957de5af1a89d8a08d18f914ac3fe6c2ae669cc Binary files /dev/null and b/docs/effective-developer/code/clean-code/images/onion-architecture.jpeg differ diff --git a/docs/effective-developer/code/clean-code/images/unicorn.jpeg b/docs/effective-developer/code/clean-code/images/unicorn.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..041a3184120e3eb997eb2e36f5d68ff6b8855b4d Binary files /dev/null and b/docs/effective-developer/code/clean-code/images/unicorn.jpeg differ