В Command / Query, как вернуть связанные с операцией сообщения обратно вызывающей стороне - PullRequest
0 голосов
/ 26 февраля 2009

Часто, когда мы выполняем команды или запрашиваем наши объекты, появляется дополнительная информация об операции, которую мы должны вернуть вызывающей стороне. Э.Г.

bool IsSomethingOkayToDo ()

В этом случае, если false, мы могли бы, чтобы вызывающий абонент знал, почему это было нехорошо.

В C # обычно я делаю:

строковая причина; foo.IsSomethingOkayToDo (без причины);

(Или в случае нескольких причин вы могли бы передать в списке.)

Это лучший способ? Предполагая, что я хочу придерживаться функций, свободных от команд / запросов и побочных эффектов, есть ли другие альтернативы, одобренные ОО?

1 Ответ

0 голосов
/ 26 февраля 2009

Один из вариантов - вернуть несколько значений. В Python это просто и считается идиоматическим:

isOK, reason = foo.is_something_ok_to_do()

Тема множественных возвращаемых значений - и как их использовать в разных контекстах - поднималась SO несколько раз:

Элегантные способы возврата нескольких значений из функции Является ли Pythonic для функции, возвращающей несколько значений?

Разделение команд и запросов может быть выполнено тривиально, путем добавления состояния к объекту, записывающему результаты действия. Однако могут быть негативные побочные эффекты, такие как проблемы параллелизма (см. Страницу Wikipedia ). Например:

foo.do_something()
is_ok = foo.did_something_succeed()
reason = foo.something_success_reason()

Каждая из них является либо командой, которая не возвращает значение, либо запросом, который возвращает значение и не изменяет состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...