Допустимо ли иметь Ruby API, который вызывает исключения в to_str? - PullRequest
0 голосов
/ 24 февраля 2012

Рассмотрим крошечный класс Ruby, подобный этому:

class C
    def to_str
        raise
    end
end

Распространено и / или допустимо ли разрешать to_str вызывать исключения или существуют существующие библиотеки или идиомы, которые нарушают работу объектов этого класса C?

Немного предыстории: наше программное обеспечение предоставляет несколько модулей Ruby (реализовано на C). Некоторые из классов, которые мы предоставляем, на самом деле являются строками, поэтому они обеспечивают реализацию to_str. К сожалению, код, который определяет этот метод to_str, вызывает ошибки в других (не связанных) компонентах нашего программного обеспечения. Один из обходных путей, который мы рассматриваем, заключается в том, чтобы всегда определять to_str во всех предоставляемых нами классах, но затем вызывать исключение во время выполнения, если данный тип на самом деле не является строкой. Лично я считаю, что это плохая идея (например, мы никогда не сможем ее вернуть, не нарушив обратную совместимость), но некоторые коллеги не согласны. Поэтому я пытаюсь собрать аргументы в поддержку моей позиции.

Изучив исходный код Ruby C, выяснилось, что есть несколько мест, в которых Ruby ведет себя по-разному в зависимости от того, определяет ли класс метод to_str - само существование метода заставляет Ruby считать его строка». Может быть, этот стиль проверки того, поддерживается ли to_str, является распространенным, и есть популярные библиотеки Ruby, которые используют его, а затем утверждают, что фактический вызов to_str не вызовет исключения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...