Как найти вонючие части вашего кода [Часть XVIII]

Как найти вонючие части вашего кода [Часть XVIII]

5 мая 2022 г.

Бесконечный код, запахи!


Он пахнет, потому что, вероятно, есть много случаев, когда его можно отредактировать или улучшить.


Большинство этих запахов — просто намеки на то, что что-то может быть не так. Они не обязательно фиксируются сами по себе… (Тем не менее, вы должны изучить это.)


Пахнет предыдущим кодом


  • [Часть I] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-i-xqz3evd)

  • [Часть II] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-ii-o96s3wl4)

  • [Часть III] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-iii-t7h3zkv)

  • [Часть IV] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-iv-7sc3w8n)

  • [Часть V] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-v-evj3zs9)

  • [Часть VI] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-vi-cmj31om)

  • [Часть VII] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-vii-8dk31x0)

  • [Часть VIII] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-viii-8mn3352)

  • [Часть IX] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-ix-7rr33ol)

  • [Часть X] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-x-i7r34uj)

  • [Часть XI] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xi-sit35t1)

  • [Часть XII] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xii)

  • [Часть XIII] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiii)

  • [Часть XIV] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiv)

  • [Часть XV] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xv)

  • [Часть XVI] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xvi)

  • [Часть XVII] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xvii)

Давай продолжим...


Code Smell 86 - Изменяемые константные массивы


Const объявляет что-то постоянным. Может ли он мутировать?



TL;DR: не полагайтесь на то, что языки обманывают директивы.


Проблемы


  • Неожиданные побочные эффекты

  • Случайная сложность

Решения


  1. Используйте лучшие языки

  1. Используйте [оператор распространения] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax)

Образец кода


Неправильный


```javascript


константный массив = [1, 2];


массив.push(3)


//массив => [1, 2, 3]


//Разве это не константа?


// постоянная != неизменяемая ?


Верно


```javascript


константный массив = [1, 2];


const новый массив = [... массив, 3]


//массив => [1, 2] Не мутировал


// новый массив = [1, 2, 3]


Обнаружение


Поскольку это «функция языка», мы можем явно запретить ее.


Теги


  • Изменчивость

  • JavaScript

Вывод


Мы всегда должны отдавать предпочтение неизменности наших проектов и проявлять особую осторожность с побочными эффектами.


Больше информации



Кредиты


Фото Zorik D на Unsplash


[Твиттер] (https://twitter.com/1430154471921922049)


Корректность, безусловно, главное качество. Если система не делает того, что от нее требуется, то все остальное в ней не имеет большого значения.


Бертран Мейер


Code Smell 87 — Несогласованная сортировка параметров


  • Будьте последовательны с параметрами, которые вы используете. Код прозаический.*


TL;DR: не путайте читателей. Держите порядок.


Проблемы


  • Читабельность

  • Последовательность

Решения


  1. Рефакторинг и порядок изменения параметров.

  1. Используйте именованные параметры

Образец кода


Неправильный


```javascript


функция giveFirstDoseOfVaccine(человек, вакцина) {


функция giveSecondDoseOfVaccine(вакцина, человек) {


дать первую дозу вакцины (Джейн, pfizer);


giveSecondDoseOfVaccine(Джейн, pfizer); //Незамеченная ошибка


Верно


```javascript


функция giveFirstDoseOfVaccine(человек, вакцина) {


функция giveSecondDoseOfVaccine(человек, вакцина) {


дать первую дозу вакцины (Джейн, pfizer);


giveSecondDoseOfVaccine(Джейн, pfizer); //Джейн иммунизирована


Обнаружение


  • Некоторые очень умные линтеры могут сравнивать аргументы и подсказывать возможные ошибки.

Теги


  • Читабельность

Вывод


Это очень простой запах.


Читаемость очень важна, чтобы избежать ошибок.


Связи


[Code Smell 10 — Слишком много аргументов] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-ii-o96s3wl4)


Кредиты


Фото [Лэнса Грандала] (https://unsplash.com/@lg17) на [Unsplash] (https://unsplash.com/s/photos/disorder)


[Твиттер] (https://twitter.com/1441462443364864006)


Компьютеры хорошо следуют инструкциям, но не читают ваши мысли.


Дональд Кнут


Code Smell 88 — Ленивая инициализация


Еще один шаблон преждевременной оптимизации



TL;DR: не используйте ленивую инициализацию. Вместо этого используйте поставщика объектов.


Проблемы


  • Удивительные побочные эффекты

  • Преждевременная оптимизация

  • Ошибка быстрого нарушения

  • Реалистичная связь

  • Нарушение принципа наименьшего удивления

  • [Нулевое использование] (https://hackernoon.com/null-the-billion-dollar-mistake-8t5z32d6)

  • Изменчивость

  • Проблемы с транзакционными и многопоточными приложениями


Решения


  1. Внедряйте обязанности с объектами первого класса

Образец кода


Неправильный


``рубин


класс Сотрудник


электронные письма


@электронные письма ||= []


конец


def voice_mails


@voice_mails ||= []


конец


конец


Верно


``рубин


класс Сотрудник


attr_reader: электронная почта, : голосовая_почта


деф инициализировать


@электронные письма = []


@voice_mails = []


конец


конец


Мы также можем внедрить шаблон проектирования для внешнего взаимодействия


с voice_mails, чтобы мы могли смоделировать его в наших тестах


Обнаружение


Ленивая инициализация является распространенным шаблоном при проверке неинициализированных переменных.


Обнаружить их должно быть просто.


Теги


  • Преждевременная оптимизация

Вывод


[Singletons] (https://hackernoon.com/singleton-pattern-the-root-of-all-evil-e4r3up7) — еще один антипаттерн, часто сочетающийся с ленивой инициализацией.


Мы должны избегать преждевременных оптимизаций. Если у нас есть реальные проблемы с производительностью, мы должны использовать прокси, фасад или более независимое решение.


Связи


[Code Smell 32 — Singletons] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-vii-8dk31x0)


[Code Smell 12 — Null] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-iii-t7h3zkv)


Больше информации



  • [Мартин Фаулер] (https://martinfowler.com/bliki/LazyInitialization.html)

Кредиты


Фотография Сэма Соломона на Unsplash


Мы должны перестать оптимизировать для программистов и начать оптимизировать для пользователей.


Джефф Этвуд


Code Smell 89 - Зависть к математическим функциям


  • Формулы расчета одного класса для другого класса. *


TL;DR: Оставьте формулы объектам, собирающим информацию.


Проблемы


  • Декларативно

  • Низкое повторное использование

  • Отсутствует концепция реального мира

  • Инкапсуляция

Решения


  1. Перенесите математическую формулу в класс

  1. Найдите [реальные абстракции] (https://hackernoon.com/the-one-and-only-software-design-principle-1x983ylp)

Образец кода


Неправильный


```javascript


функциональная площадь (прямоугольник) {


вернуть прямоугольник.ширина * прямоугольник.высота;


//Обратите внимание, что мы отправляем последовательные сообщения на


//тот же объект и делаем вычисления


Верно


```javascript


класс Прямоугольник {


конструктор (ширина, высота, цвет) {


this.height = высота;


this.width = ширина;


область() {


вернуть эту.ширину * эту.высоту;


Обнаружение


Поскольку одному и тому же объекту отправляется множество каскадных сообщений, мы можем обнаружить закономерность.


Теги


  • Инкапсуляция

  • Связь

Вывод


Это очень простой запах. Если мы манипулируем характеристиками другого объекта, мы должны позволить ему сделать это за нас.


Связи


[Code Smell 63 — Feature Envy] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiii)


Больше информации


  • [Один и только один программный принцип] (https://hackernoon.com/the-one-and-only-software-design-principle-1x983ylp)

Кредиты


Фотография Michal Matlon на Unsplash


Информатика — это не машины, точно так же, как астрономия — это не телескопы. Существует существенное единство математики и информатики.


Майкл Р. Феллоуз


Code Smell 90 — Реализация событий обратного вызова


При создании событий мы должны отделить триггер от действия.



TL;DR: Назовите свои функции в соответствии с тем, что произошло.


Проблемы


  • [Шаблон наблюдателя] (https://en.wikipedia.org/wiki/Observer_pattern) нарушение

  • Связь

Решения


  1. Назовите события после «что произошло», а не «что вы должны делать».

Образец кода


Неправильный


```javascript


const Item = ({имя, handlePageChange)} =>



  • {название}



  • //handlePageChange связан с тем, что вы решили сделать


    //вместо того, что было на самом деле


    //Мы не можем повторно использовать этот тип обратных вызовов


    Верно


    ```javascript


    const Item = ({имя, onItemSelected)} =>



  • {название}



  • //onItemSelected будет вызываться только при выборе элемента. ЦЕЛОВАТЬ


    //Родитель может решить, что делать (или ничего не делать)


    // Откладываем решение


    Обнаружение


    Это смысловой запах. Мы можем обнаружить это на экспертных проверках кода.


    Теги


    • Связь

    • Именование

    Вывод


    Имена очень важны. Мы должны отложить реализацию связанных имен до самого последнего момента.


    Больше информации



    • [Гуру рефакторинга] (https://refactoring.guru/es/design-patterns/observer)

    Кредиты


    Фотография Ашима Д'Сильвы на Unsplash


    Спасибо Maciej за этот совет


    [Твиттер] (https://twitter.com/1445692315360653318)


    Помимо основных математических способностей, разница между хорошим программистом и великим программистом заключается в вербальных способностях.


    Марисса Майер


    И это пока все…


    В следующей статье мы расскажем еще о 5 запахах кода!



    Оригинал
    PREVIOUS ARTICLE
    NEXT ARTICLE