Вы объявляете что-то константой. Но вы можете изменить его.
TL;DR: используйте неизменяемые константы
Проблемы
- Изменчивость
- Нарушение принципа наименьшего удивления
- Связь
Решения
- Обеспечьте изменчивость
- Избегайте констант. Их трудно обмануть в тестах.
Контекст
Мы научились объявлять константы в нашем первом курсе компьютерного программирования.
Как всегда, не важно, если что-то постоянно.
Важно, если он не мутирует.
Образец кода
Неправильный
const DISCOUNT_PLATINUM = 0.1; const DISCOUNT_GOLD = 0.05; const DISCOUNT_SILVER = 0.02;
//Since variables are constants we cannot reassign them const DISCOUNT_PLATINUM = 0.05; //Error
//We can group them const ALL_CONSTANTS = { DISCOUNT: { PLATINUM = 0.1; GOLD = 0.04; SILVER = 0.02; }, };
const ALL_CONSTANTS = 3.14; //Error
ALL_CONSTANTS.DISCOUNT.PLATINUM = 0.08; //NOT AN ERROR. WTF!
const ALL_CONSTANTS = Object.freeze({ DISCOUNT: PLATINUM = 0.1; GOLD = 0.05; SILVER = 0.02; });
const ALL_CONSTANTS = 3.14; //Error
ALL_CONSTANTS.DISCOUNT.PLATINUM = 0.12; //NOT AN ERROR. WTF!
Верно
export const ALL_CONSTANTS = Object.freeze({ DISCOUNT: Object.freeze({ PLATINUM = 0.1; GOLD = 0.05; SILVER = 0.02; }), });
const ALL_CONSTANTS = 3.14; //Error
ALL_CONSTANTS.DISCOUNT.PLATINUM = 0.12; //ERROR
//Code works, but it is coupled and we cannot test it
Class TaxesProvider { applyPlatinum(product); }
//Now we can couple to a interface (the protocol of taxes provider) //Since class has no setters it is constant an immuatable //And we can replace it on tests
Обнаружение
[X] Полуавтоматический
Мы можем выполнить мутационное тестирование, чтобы найти измененные значения.
Теги
- Константы
Заключение
Изменчивость очень важна.
Нам нужно обеспечить его соблюдение с помощью правильных инструментов.
связи
Больше информации
Кредиты
Этот запах был вдохновлен This
Фото автора Sangharsh Lohakare на Unsplash
Вы начинаете копаться в коде. Чем больше копаешь, тем больше вещей находишь. В конце концов, вы закопаетесь в яму, из которой не сможете выбраться. Чтобы не копать себе могилу, рефакторинг необходимо проводить систематически.
Эрик Гамма
Эта статья является частью серии CodeSmell.