Недавно я обсуждал с коллегой вопрос о том, следует ли разрешать пустые или пустые коллекции, которые должны передаваться в качестве параметров метода. Я чувствую, что это должно вызвать исключение, поскольку оно нарушает метод "контракт", даже если он не обязательно нарушает выполнение метода. Это также имеет то преимущество, что "быстро не работает". Мой коллега утверждает, что это приводит к засориванию кода с помощью проверок "не null/not empty", даже если это не имеет особого значения.
Я вижу его точку зрения, но разрешение нулевых или пустых параметров заставляет меня чувствовать себя неловко. Это может скрыть истинную причину проблемы, задерживая сбой!
Возьмем два конкретных примера:
1) Учитывая, что у нас есть класс Interval с методом перекрытий (Interval), что должно произойти, если в качестве параметра передан null? Я чувствую, что мы должны бросить исключение IllegalArgumentException, чтобы позвонивший знал, что что-то, вероятно, ошибочно, но мой коллега чувствует, что возвращает false, достаточно, как в сценариях, где он его использует, просто неважно, будет ли второй интервал null или нет (все, что имеет значение, касается того, перекрываются ли они).
2) Учитывая такой метод, как fetchByIds (Идентификаторы коллекции), что должно произойти, если предоставляется пустая коллекция? Еще раз я хочу предупредить вызывающего, что происходит что-то ненормальное, но мой коллега в порядке, просто получая пустой список, так как еще раз ему все равно, есть ли какие-либо идентификаторы или нет.
В чем заканчивается ответственность вызываемого кода? В обоих случаях вызывающий код не возражал против того, был ли параметр пустым или пустым, но в других сценариях это может указывать на вероятную ошибку. Должен ли метод гарантировать, что он не сломается до тех пор, пока будут соблюдаться предварительные условия или он также попытается определить потенциальные вызовы с ошибкой?
РЕДАКТОР: Я вижу много хороших ответов, и большинство из них склонны утверждать это как контракт/в документации и придерживаться его, но я бы хотел, чтобы ваше мнение о том, когда разрешить его, а когда нет (если когда-либо), В конкретных примерах, что бы вы сделали? Учитывая, что для 90% использования не будет проверять входные данные, вы по-прежнему будете проверять, чтобы сбросить ошибки в оставшихся 10%, или вы скорее рассмотрите их по мере их появления и избегаете ненужных проверок null/empty?