Как найти вонючие части вашего кода [Часть 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: не полагайтесь на то, что языки обманывают директивы.
Проблемы
- Неожиданные побочные эффекты
- Случайная сложность
Решения
- Используйте лучшие языки
- Используйте [оператор распространения] (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
Вывод
Мы всегда должны отдавать предпочтение неизменности наших проектов и проявлять особую осторожность с побочными эффектами.
Больше информации
Кредиты
[Твиттер] (https://twitter.com/1430154471921922049)
Корректность, безусловно, главное качество. Если система не делает того, что от нее требуется, то все остальное в ней не имеет большого значения.
Бертран Мейер
Code Smell 87 — Несогласованная сортировка параметров
- Будьте последовательны с параметрами, которые вы используете. Код прозаический.*
TL;DR: не путайте читателей. Держите порядок.
Проблемы
- Читабельность
- Последовательность
Решения
- Рефакторинг и порядок изменения параметров.
- Используйте именованные параметры
Образец кода
Неправильный
```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)
- Изменчивость
- Проблемы с транзакционными и многопоточными приложениями
Решения
- Внедряйте обязанности с объектами первого класса
Образец кода
Неправильный
``рубин
класс Сотрудник
электронные письма
@электронные письма ||= []
конец
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: Оставьте формулы объектам, собирающим информацию.
Проблемы
- Декларативно
- Низкое повторное использование
- Отсутствует концепция реального мира
- Инкапсуляция
Решения
- Перенесите математическую формулу в класс
- Найдите [реальные абстракции] (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) нарушение
- Связь
Решения
- Назовите события после «что произошло», а не «что вы должны делать».
Образец кода
Неправильный
```javascript
const Item = ({имя, handlePageChange)} =>
{название}
//handlePageChange связан с тем, что вы решили сделать
//вместо того, что было на самом деле
//Мы не можем повторно использовать этот тип обратных вызовов
Верно
```javascript
const Item = ({имя, onItemSelected)} =>
{название}
//onItemSelected будет вызываться только при выборе элемента. ЦЕЛОВАТЬ
//Родитель может решить, что делать (или ничего не делать)
// Откладываем решение
Обнаружение
Это смысловой запах. Мы можем обнаружить это на экспертных проверках кода.
Теги
- Связь
- Именование
Вывод
Имена очень важны. Мы должны отложить реализацию связанных имен до самого последнего момента.
Больше информации
- [Гуру рефакторинга] (https://refactoring.guru/es/design-patterns/observer)
Кредиты
Фотография Ашима Д'Сильвы на Unsplash
Спасибо Maciej за этот совет
[Твиттер] (https://twitter.com/1445692315360653318)
Помимо основных математических способностей, разница между хорошим программистом и великим программистом заключается в вербальных способностях.
Марисса Майер
И это пока все…
В следующей статье мы расскажем еще о 5 запахах кода!
Оригинал