У меня есть метод, который использует магическое число несколько раз, но только одним способом.Лучшая практика устранения магических чисел внутри функции-члена
class Foo
def Bar(str)
year = str[0..1].to_i + 2000
month = str[2].ord - 48
day = str[3].ord - 48
hour = str[4].ord - 48
min = str[5].ord - 48
sec = str[6].ord - 48
# ...
end
end
[Если вам интересно, о необходимости использования ord
здесь, а не to_i
, вы хотели бы видеть this other question для больше контекста.]
Я хотел бы устранить 48
магическое число здесь. Единственным местом, где будет использоваться это магическое число, является этот конкретный метод. Я не могу объявить его как константу внутри метода:
class Foo
def Bar
ADJ = 48
month = str[2].ord - ADJ
day = str[3].ord - ADJ
hour = str[4].ord - ADJ
min = str[5].ord - ADJ
sec = str[6].ord - ADJ
# ...
end
end
потому, что приводит к ошибке dynamic constant assignment (SyntaxError)
. Поскольку ADJ
применим только к этому методу, для меня не имеет большого значения сделать его переменной класса.
Эта функция будет вызываться часто; Я бы хотел, чтобы решение, по крайней мере, не было медленным.
В C++ я мог бы сделать это static const unsigned
внутри метода или переместить его в неназванный namespace
.
Что такое рубинистский способ устранить это магическое число?
Путь Rubyist не использовать 'ord', а использовать' to_i' и не использовать методы, начинающиеся с капитала. – sawa
@sawa: Потому что мне нужен код ASCII этого символа. Например, если 'str [2]' содержит букву '=', мне нужно получить '61'. Вызов 'to_i' вернет' 0'. Я делаю это неправильно? –
Возможно, вы сможете сделать это таким образом, но если вы заботитесь о том, чтобы сделать это, Ruby-way, использование 'ord', определенно, не способ пойти в первую очередь. Ваш код зависит от кодировки. Это очень плохая практика. – sawa