Я экспериментировал и обнаружил, что мне нравится переопределять методы 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 и немного больше. В этом случае я поставил бы большое предупреждение в документацию. Таким образом, люди, использующие его, не будут удивлены.