Я добавлю пару уточнений ( выделено жирным шрифтом ) к превосходному дизайну по совету по контракту, предложенному Брайаном ранее ...
Принципы «проектирования по контракту» требуют, чтобы вы определили, что допустимо для вызывающего абонента (действительный домен входных значений), а затем, для любого действительного ввода, что будет делать метод / поставщик.
Для внутреннего метода вы можете определить NULL как вне области допустимых входных параметров. В этом случае вы бы сразу заявили, что значение входного параметра NOT NULL. Ключевым моментом в этой спецификации контракта является то, что любой вызов, передающий значение NULL , является ошибкой вызывающего , и ошибка, выдаваемая оператором assert, является правильным поведением.
Теперь, несмотря на то, что вы очень хорошо определены и экономны, если вы предоставляете метод внешним / публичным абонентам, вы должны спросить себя, действительно ли это контракт, который я / мы действительно хотим?
Возможно нет. В общедоступном интерфейсе вы, вероятно, приняли бы NULL (как технически в области входных данных, которые принимает метод), но затем отказались бы обрабатывать изящно с ответным сообщением. (Больше работы для удовлетворения естественно более сложных требований клиентов).
В любом случае, то, что вам нужно, - это протокол, который обрабатывает все случаи как с точки зрения вызывающего, так и с точки зрения поставщика, а не множество тестов "скаттершот", которые могут затруднить оценку полноты или неполнота договорного условия покрытия.