Книга: Экстремальное программирование. Разработка через тестирование

Нуль-объект (Null Object)

Нуль-объект (Null Object)

Как реализовать специальные случаи использования объектов? Создать специальный объект, представляющий собой специальный случай. Специальный объект должен обладать точно таким же протоколом, что и обычный объект, но он должен вести себя специальным образом.

В качестве примера рассмотрим код, который я позаимствовал из java.io.File:

java.io.File

public boolean setReadOnly() {

SecurityManager guard = System.getSecurityManager();

if (guard!= null) {

guard.canWrite(path);

}

return fileSystem.setReadOnly(this);

}

В классе java.io.File можно обнаружить 18 проверок guard!= null. Я преклоняюсь перед усердием, с которым разработчики библиотек Java стараются сделать файлы безопасными для всего остального мира, однако я также начинаю немножко нервничать. Будут ли программисты Oracle и в будущем столь же аккуратны, чтобы не забыть проверить результат выполнения метода getSecurityManager() на равенство значению null?

В рамках альтернативного решения можно создать новый класс LaxSecurity, который вообще не генерирует исключений:

LaxSecurity

public void canWrite(String path) {

}

Если кто-то пытается получить SecurityManager, однако предоставить такой объект нет возможности, вместо него мы возвращаем LaxSecurity:

SecurityManager

public static SecurityManager getSecurityManager() {

return security == null? new LaxSecurity(): security;

}

Теперь мы можем не беспокоиться о том, что кто-то забудет проверить результат выполнения метода на равенство значению null. Изначальный код становится существенно более чистым:

File

public boolean setReadOnly() {

SecurityManager security = System.getSecurityManager();

security.canWrite(path);

return fileSystem.setReadOnly(this);

}

Однажды во время выступления на конференции OOPSLA нас с Эр

ихом Гаммой (Erich Gamma) спросили, можно ли использовать «Нуль-объект» (Null Object) в рамках одного из классов JHotDraw. Я принялся рассуждать о преимуществах такой модернизации, в то время как Эрих посчитал, что для этого нам придется увеличить код на десять строк, при этом мы избавимся от одного условного оператора – преимущество сомнительно. (К тому же аудитория была весьма недовольна нашей несогласованностью.)

Оглавление книги


Генерация: 1.166. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз