Исчерпанность
Exhaustiveness
Описание кодом всех возможных вариантов развития событий.
Возьмём для примера функцию сложения:
def sum(a, b)
return a + b
end
Этот код не исчерпывающий, т. к. не учитывает случаи, когда
- значения
a
иb
, переданные в функцию, будут типами, которые невозможно сложить, например,sum("hello", [1, 2, 3]) => TypeError
- значение
a
илиb
переданные в функцию, сложить можно (в Ruby оператор+
сращивает строки), но это не будет иметь смысла, например,sum("hello", "world") => "helloworld"
.
На самом деле мы хотим складывать только числа. Тогда если в функцию будте передано не число, это можно считать ошибкой. Поэтому мы можем просто проверить, являются ли a
и b
числами:
def sum(a, b)
fail TypeError, "`a` и `b` должны быть типа Numeric" unless [a, b].all? Numeric
return a + b
end
Но чем это лучше? Ведь если в функцию передать неслагаемые значения, то в любом случае программа бросает ошибку TypeError
?
Это лучше тем, что мы получаем ошибку и во втором случае, когда без нашей проверки каких-то ошибочных случаях программа не сообщала бы об ошибке, и эти данные дальше бы где-то использовались. Возможно и в следующей функции они бы принимались, и эта ошибка могла бы оставаться незамеченными довольно долго. Всё это время мы бы сохраняли в базу данных некорректные значения, таких некорректных записей бы накопились сотни, и потом их пришлось бы как-то править вручную.