Хороший случай для шаблона нулевого объекта? (Предоставить некоторые услуги с почтовой службой) - PullRequest
1 голос
/ 01 апреля 2010

Для веб-сайта, над которым я работаю, я создал объект службы мультимедиа, который я использую как во внешней, так и во внутренней (CMS). Этот объект службы мультимедиа управляет мультимедиа в локальном хранилище (БД); он предоставляет возможность загружать / вставлять видео и загружать изображения.

Другими словами, посетители сайта могут сделать это в интерфейсе, но администраторы сайта также могут сделать это в интерфейсе.

Мне бы хотелось, чтобы этот сервис отправлял по почте администраторам, когда посетитель загрузил / внедрил новый носитель в веб-интерфейс, но воздерживался от их отправки по почте, когда они сами загружали / вставляли носитель в бэкэнд.

Поэтому я начал задаваться вопросом, является ли это хорошим случаем для передачи нулевого объекта, имитирующего функциональность почты, службе мультимедиа в бэкэнде. Я подумал, что это может пригодиться, когда они решат, что бэкэнд должен также реализовать функциональность почты.

В упрощенном виде я хотел бы сделать что-то вроде этого:

Frontend:

$mediaService = new MediaService( new MediaRepository(), new StandardMailService() );

Backend:

$mediaService = new MediaService( new MediaRepository(), new NullMailService() );

Как вы относитесь к этому? Имеет ли это смысл? Или я готовлюсь к проблемам в будущем?

1 Ответ

3 голосов
/ 01 апреля 2010

Я фанат этого паттерна. Я также фанат переименования объектов в соответствии с семантикой.

Как вы знаете, вы получаете от NullObject два преимущества:
1) избегайте проверок на ноль в вашем коде
2) объединить поведение в объект, который представляет то, что происходит семантически, когда возвращается ноль.

Если у вас есть оператор if, который возвращает ноль, когда администраторы загружают, тогда да, я думаю, что захват в объекте дешев и потенциально полезен, даже если вероятность отправки почты для бэкэнд-загрузок мала. Если вместо этого вы рассматриваете почтовую службу как службу уведомлений, то у вас могут быть FrontendNotificationService (которая отправляет почту) и BackendNotificationService (которая в настоящее время не отправляет почту, но может накапливать полезную статистику о загрузках (сколько, общий размер и т. Д.). .).

Если ничего из вышеперечисленного не соответствует действительности, то я бы лично нашел конструктор без NullMailService более читабельным, а конструктор со StadndardMailService - более читабельным.

Хорошая новость заключается в том, что рефакторинг легко выполнить, если вы решите, что он полезен, или отмените его, если хотите опробовать свой NullService и обнаружите, что он бесполезен.

НТН,
Berryl

...