Является ли анонимная функция хорошим способом реализации шаблона команды? - PullRequest
1 голос
/ 15 июня 2009

Я совершенно новичок в этом паттерне ...

Ответы [ 3 ]

5 голосов
/ 15 июня 2009

Если у вас есть лямбды, вам совсем не нужна половина «шаблонных» «шаблонов».

Factory? Это просто функция, возвращающая новые объекты. Посетитель? Duh! Команда? Анонимная функция. Переводчик? Функция, которая принимает строку или что-то еще. Стратегия? Это функция!

Это просто лямбды, функции и замыкания.

Проблема в том, что от 1/3 до 1/2 из них были в основном сокрытием недостатков в C ++, которых нет в других языках. Хотя я больше не большой поклонник Perl, я должен признать, что сообщество Perl впервые зацепило это (или, по крайней мере, самое смешное). Они указали, что многие из этих так называемых шаблонов на самом деле были реализацией функционального программирования на C ++.

Так что да, вы можете использовать анонимные (или иначе названные) функции, где вы будете использовать шаблон Command.

2 голосов
/ 15 июня 2009

Если ваша команда поддерживает только одну операцию, вы можете безопасно использовать анонимную функцию.

Однако для каждой команды нередко бывает более одной операции. Например. DoCommand / UndoCommand для отмены / повторной обработки. Или CanExecuteCommand / ExecuteCommand, чтобы включить / отключить функции пользовательского интерфейса для команды. Или что-то вроде GetLocalizedCommandName. Я бы использовал интерфейс в этих случаях (вместо, например, набора анонимных функций).

0 голосов
/ 15 июня 2009

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

(Если кто-то хотел быть педантичным, описание GoF паттерна Copmmand конкретно описывает использование объекта для инкапсуляции, исключая реализацию на основе функций, хотя это было бы придиркой).

...