Я думаю об интерфейсах, ориентированных на коллекции здесь. Подобно конечной точке JSON API, возвращающей коллекцию сообщений в блоге. Или свойство объекта сообщения в блоге, содержащее теги сообщения в блоге. Мы никогда не возвращаем null — или что-то еще, кроме коллекций — из таких интерфейсов, верно?

Тема обсуждалась давно, в разных местах, подробно. Примерами могут служить Переполнение стека, известные блоги, такие как Эрик Липперт, и влиятельные книги, такие как Чистый код Роберта С. Мартина. И вроде бы абсолютное большинство, если не все, согласны с тем, что без нуля нам лучше. Возврат коллекций и только коллекций, заполненных или пустых, точка. Конечно, иногда мы не согласны. Но каждый раз, когда мы это делаем, создается впечатление, что мы фокусируемся на довольно узких частных случаях. И все мы знаем, что особые случаи не настолько особенные, чтобы нарушать правила.

Так почему же я до сих пор вижу в коде, который вызывает интерфейсы, нацеленные на коллекции, так много проверок null? Наши интерфейсы все еще возвращают null? Зная, что коду, вызывающему их, придется пожертвовать простотой, когда его заставят добавить проверки на null? Зная, что появятся баги, так как нулевые проверки будут забыты?

Или интерфейсы действительно хорошо себя ведут и никогда не возвращают null? И мы до сих пор, в каком-то ошибочном стремлении к надежности, засоряем код, который вызывает их нулевыми проверками? Потому что мы не нашли время, чтобы понять, что интерфейсы возвращают или не возвращают? Потому что мы пытаемся защитить вызывающий код от будущего, поскольку кто знает, как со временем изменятся интерфейсы? Надеюсь, вы видите, что ни одно из этих обоснований не имеет смысла. Оба они приводят к коду, который лжет об используемых интерфейсах, с добавлением ненужных проверок null. Один из-за лени, другой из-за попытки предсказать будущее.

Итак, чтобы ответить на вопрос, поставленный в заголовке этой записи в блоге: перестали ли мы возвращать null из интерфейсов, ориентированных на коллекции? К сожалению нет. По крайней мере, если мы должны доверять коду, вызывающему их, поскольку нулевые проверки остаются. К счастью, исправление, независимо от того, на что мы полагаемся, одно и то же. И это просто, но требует от нас быстрого мышления. Исправление выглядит примерно так: 1) удалить все проверки на null, 2) отметить, где возникают ошибки с нулевыми ссылками, и 3) обновить интерфейсы, участвующие в ошибках, чтобы они не возвращали null. И это все. Теперь приступайте к сбою своих программ с помощью нулевых ссылок в поисках простого и надежного программного обеспечения!

Первоначально опубликовано на https://www.mikaeleliasson.se 3 октября 2019 г.