Я люблю этот запах кода. Сначала я нахожу решение увлекательным. Во-вторых, индикатор (проверка на нуль) часто НЕ является проблемой, в большей степени, чем в большинстве кодовых запахов. Но в этом и заключается красота запахов кода. Они дают нам указание на то, что что-то МОЖЕТ быть не так, но мы должны проверить это сами и решить, действительно ли что-то нужно исправить.

Итак, давайте начнем с рассмотрения примера проблемы:

Здесь у нас есть пример кода с сайта электронной коммерции. На этих сайтах довольно типично разрешить вам зарегистрироваться в качестве гостя, а не создавать учетную запись.

Вот один из таких алгоритмов, в котором мы определяем скидку, применяемую к заказу. Если пользователь оформляет заказ как гость (объект клиента равен нулю), мы используем скидку по умолчанию. В противном случае мы используем заработанную клиентом скидку.

Глядя на этот метод, наша проверка на null кажется довольно безобидной. Это разумный способ реализовать необходимый функционал.

Теперь давайте посмотрим на другой метод из того же класса:

Здесь у нас происходит то же самое, мы должны знать, регистрируется ли пользователь как гость или нет. И теперь мы можем начать видеть часть проблемы. Наши нулевые проверки разбросаны по всему коду. Мы можем предположить, что эта логика является общей, поэтому мы должны часто проверять, является ли клиент нулевым для заказа.

Это запах нашего кода. Частые проверки на один и тот же null.

Итак, что нам с этим делать? Здесь мы можем применить очень классное исправление, используя так называемый нулевой объект. Нулевые объекты — это специальные классы, которые заменяют нулевое значение в нашем коде, чтобы мы могли упростить наш код. Давайте посмотрим, как это делается.

Сначала мы создаем класс NullCustomer. Это наш нулевой объект. Обратите внимание на два метода, которые он имеет. Помните, где используются эти методы?

Затем мы создаем наш NullCustomer и используем его вместо того, чтобы устанавливать для клиента значение null. Таким образом, мы делаем нулевую проверку только один раз.

А теперь мы можем вернуться к нашему классу заказов и исправить методы getDiscount и processOrder. Поскольку наш нулевой объект реализует эти методы, нам больше не нужно выполнять какие-либо проверки в нашем коде. Это упрощает нашу основную бизнес-логику.

На самом деле, наш getDiscount стал настолько простым, что мы можем вообще отказаться от него.

Это сила Null Object, используемая для устранения запаха кода Null Check. Я действительно думаю, что это классная техника для решения относительно распространенной проблемы.

Удачного кодирования!

Подпишитесь на мою рассылку здесь.

Посетите нас: thinkster.io | Facebook: @gothinkster | Твиттер: @GoThinkster