Как найти вонючие части вашего кода [Часть 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: тестовые утверждения должны быть точными. Не слишком расплывчато и не слишком конкретно. Серебряной пули не существует.==
Проблемы
- Ложноотрицательные результаты
- Нехватка доверия
Решения
- Проверьте правильный регистр.
- Утверждение для функционального случая.
- Не тестируйте реализацию.
Образец кода
Неправильно
```питон
квадрат = квадрат (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 и использован с его разрешения.
Программа, которая выдает неправильные результаты в два раза быстрее, бесконечно медленнее.
Джон Остерхаут
==Код Запах 77 - Временные метки==
Широко используются временные метки. У них есть центральный орган выдачи, и они не возвращаются, не так ли?
TL;DR: Не используйте метки времени для последовательности. Централизуйте и заблокируйте своего эмитента.
Проблемы
- Ошибка биекции.
- Столкновения временных меток.
- Точность метки времени.
- Пакетные расстройства.
- Плохая [случайная реализация] (https://hackernoon.com/there-are-no-silver-bullets-for-this-werewolf-2t213woi) (метка времени) для основной проблемы (последовательность).
Решения
- Используйте центрирующий последовательный штамп. (НЕТ, не Синглтон).
- Если вам нужно смоделировать последовательность, смоделируйте последовательность.
Образец кода
Неправильно
```питон
использование модуля времени
время импорта
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: не обрабатывайте вызовы обратным вызовом. Напишите последовательность.
Проблемы
- Читабельность
- Трудно отлаживать.
- Сложность
Решения
- Измените обратные вызовы на последовательные вызовы.
- Извлечь повторяющийся код
- Рефакторинг.
Образец кода
Неправильно
```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)
Есть два способа писать код: писать настолько простой код, что в нем явно нет ошибок, или писать настолько сложный код, что в нем нет очевидных ошибок.
Тони Хоар
Код Запах 79 - Результат
Если имя уже используется, мы всегда можем добавить к нему префикс «the».
TL;DR: не добавляйте префикс к своим переменным.
Проблемы
- Читабельность
- Бессмысленные имена
Решения
- Используйте имена, раскрывающие намерения.
- Избегайте неразборчивых шумовых слов.
Образец кода
Неправильно
```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: Не вкладывать исключения. Никому нет дела до того, что вы делаете во внутренних блоках.
Проблемы
- Читабельность
Решения
- Рефакторинг
Образец кода
Неправильно
```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 запахах кода!
Оригинал