Проверить аргументы в Ruby? - PullRequest
5 голосов
/ 05 августа 2010

Интересно, нужно ли проверять, что аргументы, передаваемые методу, принадлежат к определенному классу.

например.

def type(hash = {}, array = [])
  # validate before
  raise "first argument needs to be a hash" unless hash.class == Hash
  raise "second argument needs to be an array" unless array.class == Array

  # actual code
end

Разумно ли это делать или это просто громоздко и трата времени на проверку всех переданных аргументов?

Существуют ли обстоятельства, когда вы хотели бы иметь такую ​​дополнительную безопасность, и обстоятельства, когда вы не будете беспокоиться?

Поделитесь своим опытом!

Ответы [ 5 ]

9 голосов
/ 05 августа 2010

Я бы не рекомендовал этот конкретный подход, так как вы не можете разместить классы, которые предоставляют хэш или семантику массива, но не являются этим классом. Если вам нужна такая проверка, лучше использовать respond_to? с именем метода. Массивы реализуют метод: [], для чего это стоит.

OpenStruct имеет семантику хэша и семантику метода доступа к атрибуту, но не вернет true для условия hash.class==Hash. Хотя на практике это будет работать как хеш.

Если рассматривать это в перспективе, даже на не динамическом языке вы не захотите делать это таким образом; Вы бы предпочли проверить, что объект реализует IDictionary<T>. Ruby идиотически предпочел бы, чтобы при необходимости вы проверяли, что метод существует, потому что если это так, разработчик, вероятно, намеревается, чтобы их объект действовал одинаково. Вы можете обеспечить дополнительную работоспособность с помощью модульных тестов вокруг клиентского кода в качестве альтернативы принуждению вещей к нединамичности.

5 голосов
/ 05 августа 2010

Обычно нет необходимости проверять, являются ли аргументы определенного класса. В Ruby рекомендуется использовать Duck Typing .

3 голосов
/ 05 августа 2010

Я думаю, что это ненужно. Однажды я прочитал в блоге что-то вроде: «Если вам нужно защитить свой код от глупых людей, ruby ​​не является для вас языком».

2 голосов
/ 15 апреля 2013

Я обнаружил, что проверка того, что входные параметры соответствуют вашим предварительным условиям, является очень ценной практикой. Глупый человек, от которого тебя это спасает - это ты. Это особенно верно для Ruby, так как он не проверяет время компиляции. Если есть некоторые характеристики входных данных вашего метода, которые, как вы знаете, должны быть истинными, это заставляет проверять их во время выполнения и выдавать ошибки с осмысленными сообщениями об ошибках. В противном случае код только начинает производить мусор для мусора, и вы либо получаете неправильный ответ, либо исключение в будущем.

1 голос
/ 05 августа 2010

Если вам нужны контракты с кодом на основе компилятора / среды исполнения, Ruby не для вас.Если вам нужен гибкий язык и легкая тестируемость, то Ruby - это.

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