Является ли переопределение методов to_s в Ruby плохим?
Я экспериментировал и обнаружил, что мне нравится переопределять методы Object to_s
.
Это плохая идея или это хорошая практика?
Ответы
Ответ 1
Нет, вы можете свободно переопределять to_s
- никаких побочных эффектов нет. Пока ваш новый to_s
более информативен, чем встроенный (не совсем высокий стандарт там), вы в явном виде.
И они помогают сделать ваши неудачи в тестах лучше читаемыми - иногда много - что никогда не бывает плохо. Пойдите для этого!
Ответ 2
Я переопределяю to_s
все время в моем проекте Rails:
def to_s
first_name + " " + last_name
end
чтобы было проще показывать объекты в представлении:
<%= @person %>
Ответ 3
Это может быть сложно сделать, потому что иногда метод inspect
просто вызывает to_s
, и если это будет изменено, у вас может возникнуть проблема с отладкой. Если вы считаете, что изменение to_s
может сбить вас с толку, когда вам нужно увидеть результаты с помощью методов, которые полагаются на inspect
, например p
, то, возможно, вам нужно переопределить inspect
для этого класса в одно и то же время. Если вы уверены, что делаете, вы можете это сделать.
Ответ 4
Это не "плохо" само по себе, но это тоже не "хорошо". Это действительно зависит от контекста.
Если вы делаете это для места с одним выстрелом (например, внутри папки rails app /lib/
для конкретного приложения), это, вероятно, хорошо (обязательно укажите файлу описательное имя, например object_to_s_patch.rb
или аналогичные, и что все патчи находятся на одном и том же месте)
Если вы делаете драгоценный камень или lib, с другой стороны, я бы не стал его переопределять. Вместо этого я бы добавил другой метод - Object.to_special_s
или что-то еще. Но я также постараюсь не трогать Object, если это возможно. Если вы можете обойтись с помощью YourModule::to_s(object)
, это было бы, вероятно, даже лучше.
Обоснование этого заключается в том, что другие люди могут использовать Object.to_s
для других вещей, возможно, в других библиотеках. Monkeypatching будет производить столкновения с этими другими libs.
Единственное исключение при создании драгоценного камня, о котором я могу думать, - это то, что основная точка (или одна из основных точек) этой библиотеки фактически переопределяет метод; другими словами, вы буквально создаете lib, который переопределяет Object.to_s
и немного больше. В этом случае я поставил бы большое предупреждение в документацию. Таким образом, люди, использующие его, не будут удивлены.