Да, это магические числа. Очевидно, что числа 1 и 2 указывают точность в примере кода, но не почему. Зачем вам нужны амперы и ватты, чтобы быть более точными, чем вольты в этот момент?
Кроме того, избегание магических чисел позволяет вам централизовать изменения кода, а не прочесывать код, когда требуется буквальное число 2, когда ваша точность должна измениться.
Я бы предложил что-то вроде:
HIGH_PRECISION = 3;
MED_PRECISION = 2;
LOW_PRECISION = 1;
И ваш клиентский код будет выглядеть так:
float_as_thousands_str_with_precision(volts, LOW_PRECISION )
float_as_thousands_str_with_precision(amps, MED_PRECISION )
float_as_thousands_str_with_precision(watts, MED_PRECISION )
Затем, если в будущем вы сделаете что-то вроде этого:
HIGH_PRECISION = 6;
MED_PRECISION = 4;
LOW_PRECISION = 2;
Все, что вам нужно сделать, это изменить константы...
Но чтобы попытаться ответить на вопрос в заголовке OP:
IMO единственные числа, которые действительно можно использовать и не считать «магическими», - это -1, 0 и 1 при использовании в итерации, проверке длин и размеров и многих математических операциях. Некоторые примеры, когда использование констант фактически запутывает код:
for (int i=0; i<someCollection.Length; i++) {...}
if (someCollection.Length == 0) {...}
if (someCollection.Length < 1) {...}
int MyRidiculousSignReversalFunction(int i) {return i * -1;}
Это все довольно очевидные примеры. Например. начать и первый элемент и увеличить на единицу, проверяя, пуста ли коллекция и меняет знак... нелепо, но работает в качестве примера. Теперь замените все значения -1, 0 и 1 на 2:
for (int i=2; i<50; i+=2) {...}
if (someCollection.Length == 2) {...}
if (someCollection.Length < 2) {...}
int MyRidiculousDoublinglFunction(int i) {return i * 2;}
Теперь вы начали спрашивать себя: почему я начинаю итерацию с третьего элемента и проверяю все остальные? А что такого особенного в числе 50? Что особенного в коллекции из двух элементов? пример с удвоением действительно имеет смысл, но вы можете видеть, что значения 2 и 50, отличные от -1, 0, 1, сразу же становятся магическими, потому что очевидно, что в том, что они делают, есть что-то особенное, и мы понятия не имеем, почему.
person
Paul Sasik
schedule
24.04.2012