Вы объявляете что-то константой. Но вы можете изменить его.

TL;DR: используйте неизменяемые константы

Проблемы

Решения

  1. Обеспечьте изменчивость
  2. Избегайте констант. Их трудно обмануть в тестах.

Контекст

Мы научились объявлять константы в нашем первом курсе компьютерного программирования.

Как всегда, не важно, если что-то постоянно.

Важно, если он не мутирует.

Образец кода

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

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.