Я экспериментировал и обнаружил, что мне нравится переопределять методы Object to_s
.
Это плохая идея или это хорошая практика?
Я экспериментировал и обнаружил, что мне нравится переопределять методы Object to_s
.
Это плохая идея или это хорошая практика?
Нет, вы можете свободно переопределять to_s
- никаких побочных эффектов нет. Пока ваш новый to_s
более информативен, чем встроенный (не совсем высокий стандарт там), вы в явном виде.
И они помогают сделать ваши неудачи в тестах лучше читаемыми - иногда много - что никогда не бывает плохо. Пойдите для этого!
Я переопределяю to_s
все время в моем проекте Rails:
def to_s first_name + " " + last_name end
чтобы было проще показывать объекты в представлении:
<%= @person %>
Это может быть сложно сделать, потому что иногда метод inspect
просто вызывает to_s
, и если это будет изменено, у вас может возникнуть проблема с отладкой. Если вы считаете, что изменение to_s
может сбить вас с толку, когда вам нужно увидеть результаты с помощью методов, которые полагаются на inspect
, например p
, то, возможно, вам нужно переопределить inspect
для этого класса в одно и то же время. Если вы уверены, что делаете, вы можете это сделать.
Это не "плохо" само по себе, но это тоже не "хорошо". Это действительно зависит от контекста.
Если вы делаете это для места с одним выстрелом (например, внутри папки 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
и немного больше. В этом случае я поставил бы большое предупреждение в документацию. Таким образом, люди, использующие его, не будут удивлены.