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

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

6 апреля 2022 г.

Фото Filipe Resmini на Unsplash


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


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


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


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


  • [Часть 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)

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


==Code Smell 76 - Общие утверждения==


Не делайте слабых тестов, чтобы создать ложное ощущение охвата.



==TL;DR: тестовые утверждения должны быть точными. Не слишком расплывчато и не слишком конкретно. Серебряной пули не существует.==


Проблемы


  • Ложноотрицательные результаты

  • Нехватка доверия

Решения


  1. Проверьте правильный регистр.

  1. Утверждение для функционального случая.

  1. Не тестируйте реализацию.

Образец кода


Неправильно


```питон


квадрат = квадрат (5)


утверждать Square.area() != 0


Это приведет к ложным отрицательным результатам, так как это слишком расплывчато


Верно


```питон


квадрат = квадрат (5)


утверждать Square.area () = 25


Утверждение должно быть точным


==Обнаружение==


С помощью методов [мутационного тестирования] (https://en.wikipedia.org/wiki/Mutation_testing) мы можем найти эти ошибки в наших тестах.


Теги


  • Тестирование

Заключение


Мы должны использовать методы разработки, такие как [TDD] (https://hackernoon.com/how-to-squeeze-test-driven-development-on-legacy-systems-rh113wcs), которые запрашивают конкретные бизнес-кейсы и делают конкретные утверждения на основе наших домен.


Связи


[Code Smell 30 - Насмешливый бизнес] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-vi-cmj31om)


[Code Smell 52 — Fragile Tests] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xi-sit35t1)


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


  • [Разработка через тестирование] (https://hackernoon.com/how-to-squeeze-test-driven-development-on-legacy-systems-rh113wcs)

  • [Единственный принцип дизайна] (https://hackernoon.com/the-one-and-only-software-design-principle-1x983ylp)


==Кредиты==


Этот запах был вдохновлен @Mario Cervera и использован с его разрешения.


Фотография Fleur на Unsplash


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


Джон Остерхаут


==Код Запах 77 - Временные метки==


Широко используются временные метки. У них есть центральный орган выдачи, и они не возвращаются, не так ли?



TL;DR: Не используйте метки времени для последовательности. Централизуйте и заблокируйте своего эмитента.


Проблемы


  • Ошибка биекции.

  • Столкновения временных меток.

  • Точность метки времени.

  • Пакетные расстройства.

  • Плохая [случайная реализация] (https://hackernoon.com/there-are-no-silver-bullets-for-this-werewolf-2t213woi) (метка времени) для основной проблемы (последовательность).

Решения


  1. Используйте центрирующий последовательный штамп. (НЕТ, не Синглтон).

  1. Если вам нужно смоделировать последовательность, смоделируйте последовательность.

Образец кода


Неправильно


```питон


использование модуля времени


время импорта


ts сохраняет время в секундах


ts1 = время.время()


ts2 = time.time() #может быть то же самое!!


Верно


```питон


числа = диапазон (1, 100000)


создайте последовательность чисел и используйте их с точкой доступа


или


последовательность = следующийЧисло()


Обнаружение


Временные метки очень популярны на многих языках и широко распространены.


Нам нужно использовать их только для моделирования... временных меток.


Теги


  • Биекция

Вывод


Этот запах был вдохновлен недавней [ошибкой программного обеспечения Ingenuity] предоставление проницательных уроков для самоуправляемых автомобилей).


Если мы не будем следовать нашим [MAPPER] (https://hackernoon.com/the-one-and-only-software-design-principle-1x983ylp) правилам и моделировать последовательности со временем, мы столкнемся с проблемами.


К счастью, Ingenuity является сложным автономным транспортным средством и имеет надежное программное обеспечение для безотказной посадки.


В этом видео описан глюк.


https://www.youtube.com/watch?v=6IoMiwxL2wU


Связи


[Code Smell 39 — новая дата()] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-viii-8mn3352)


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


[Code Smell 71 — Волшебные поплавки, замаскированные под десятичные числа] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xv)


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


  • [Временная метка предлагаемых изменений] (https://ieeexplore.ieee.org/document/805196)

  • [Создайте картограф] (https://hackernoon.com/the-one-and-only-software-design-principle-1x983ylp)


==Самого красивого кода, самых красивых функций и самых красивых программ иногда вообще нет.==


Джон Бентли


==Code Smell 78 - Callback Hell==


  • Обрабатывать алгоритм как последовательность вложенных обратных вызовов неразумно. *


TL;DR: не обрабатывайте вызовы обратным вызовом. Напишите последовательность.


Проблемы


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

  • Трудно отлаживать.

  • Сложность

Решения


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

  1. Извлечь повторяющийся код

  1. Рефакторинг.

Образец кода


Неправильно


```javascript


вар фс = требуется ('фс');


var fileWithData = '/hello.world';


fs.readFile (файл с данными, 'utf8', функция (ошибка, txt) {


если (ошибка) вернуть console.log(ошибка);


txt = txt + '
' + 'Добавить данные!';


fs.writeFile (файл с данными, txt, функция (ошибка) {


если (ошибка) вернуть console.log (ошибка);


console.log('Информация добавлена');


Верно


```javascript


вар фс = требуется ('фс');


функция logTextWasAdded(ошибка) {


если (ошибка) вернуть console.log (ошибка);


console.log('Информация добавлена');


функция addData (ошибка, фактический текст) {


если (ошибка) вернуть console.log(ошибка);


фактический текст = фактический текст + '
' + 'Добавить данные';


fs.writeFile (файл с данными, фактический текст, logTextWasAdded);


var fileWithData = 'hello.world';


fs.readFile (файл с данными, 'utf8', addData);


Обнаружение


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


Теги


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

  • Сложность

Заключение


Callback Hell — очень распространенная проблема в языках программирования с фьючерсами или промисами.


Обратные вызовы добавляются постепенно. В начале нет большого беспорядка.


Сложность без рефакторинга затрудняет их чтение и отладку.


Связи


[Code Smell 06 — Too Clever Programmer] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-ii-o96s3wl4)


Code Smell 102 - Arrow Code


Есть два способа писать код: писать настолько простой код, что в нем явно нет ошибок, или писать настолько сложный код, что в нем нет очевидных ошибок.


Тони Хоар


Код Запах 79 - Результат


Если имя уже используется, мы всегда можем добавить к нему префикс «the».



TL;DR: не добавляйте префикс к своим переменным.


Проблемы


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

  • Бессмысленные имена

Решения


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

  1. Избегайте неразборчивых шумовых слов.

Образец кода


Неправильно


```javascript


переменный результат;


Результат = ПолучитьНекоторыйРезультат();


варРезультат;


Результат = ПолучитьНекоторыйРезультат();


Верно


```javascript


var средняя зарплата;


средняя зарплата = вычислить среднюю зарплату();


var средняя зарплата с повышением;


средняя зарплата с повышением = рассчитать среднюю зарплату();


Обнаружение


Как и во многих наших соглашениях об именах, мы можем указать нашим линтерам запрещать такие имена, как theXxx....


Теги


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

Заключение


Всегда используйте имена, раскрывающие намерения.


Если ваши имена конфликтуют, используйте локальные имена, извлеките свои методы и избегайте префиксов «the».


Связи


[Code Smell 38 — Абстрактные имена] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-viii-8mn3352)


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


  • [Что в имени] (https://hackernoon.com/what-exactly-is-a-name-rehab-part-ii-4st3uph).

  • [Как научиться давать осмысленные имена] (https://medium.com/shipmnts/how-to-be-great-at-giving-meaningful-names-54b19de66cdf).

Кредиты


Фотография Josue Michel на Unsplash


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


Роберт С. Мартин


Code Smell 80 — вложенная попытка/поймать


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



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


Проблемы


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

Решения


  1. Рефакторинг

Образец кода


Неправильно


```javascript


пытаться {


транзакция.совершить();


} поймать (е) {


ошибка журнала (е);


если (e instanceOf DBError){


пытаться {


транзакция.откат();


} поймать (е) {


doMoreLoggingRollbackFailed(e);


// Вложенные попытки


//Исключениями являются


//важнее, чем счастливый путь


//Используем исключения как поток управления


Верно


```javascript


пытаться {


транзакция.совершить();


} поймать (transactionError) {


this.withTransactionErrorDo(


Ошибка транзакции, транзакция);


//политика ошибок транзакций не определена в этой функции


//чтобы у нас не было повторяющегося кода


//код стал более читаемым


// Это зависит от транзакции


// и ошибка, чтобы решить, что делать


Обнаружение


Мы можем обнаружить этот запах с помощью разбора деревьев.


Теги


  • Исключения

Заключение


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


Счастливый путь всегда должен быть важнее исключительных случаев.


Связи


[Code Smell 73 — Исключения для ожидаемых случаев] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xv)


[Code Smell 26 — Исключения, загрязняющие окружающую среду] (https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-vi-cmj31om)


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



Кредиты


Фотография Дэвида Клода на Unsplash


Спасибо @Rodrigo за вдохновение


[Твит] (https://twitter.com/_rodrigomd/status/1403359513965731843)


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


Каролина Щур


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


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



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