Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
 Аватар для Tyson Fury
2 / 2 / 2
Регистрация: 23.10.2016
Сообщений: 139

Использование и реализация паттерна "Команда"

19.02.2017, 23:46. Показов 5274. Ответов 50
Метки нет (Все метки)

Вот схема паттерна (скриншот).
Прицепи, все довольно просто: есть инициатор (Invoker), который хочет, что бы получатель (Receiver) что либо выполнил, а само выполнение инкапсулируется классом КонкретнаяКоманда.

1. А что если инициатор и получатель это один и тот же объект? Для таких действий шаблон Команда подходит?

Например: Пользователь ввел в 9 цифр и далее нажал на кнопку Shuffle. После чего эти цифры должны перемешаться.
То есть, происходит действие над данными внутри одного класса.
Либо еще пример: Пользователь ввел в 9 цифр и программа должна проверить их на корректность.

2. И вообще, насколько часто Вы используете паттерн Команда в своих приложениях (там где есть GUI).

Вообщем помогите разобраться, а то я запутался.
Миниатюры
Использование и реализация паттерна "Команда"  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.02.2017, 23:46
Ответы с готовыми решениями:

Реализация паттерна "Команда"
есть ли у кого реализация на с++ ? Нужны примеры реализации на с++.... На Си его можно реализовать?

Реализация паттерна Observer от Microsoft
Совершенно случайно, нашел что интерфейс для данного паттерна создали за нас. Может кому-то пригодится. Пример реализации наблюдателя ...

Реализация консольного меню с использованием паттерна "Команда"
Добрые день форумчанам)) Задачка нынче такова: "Камни. Определить иерархию драгоценных и полудрагоценных камней. Отобрать камни для...

50
20.02.2017, 14:05

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
Как же я не люблю, когда нормальное обсуждение начинает скатываться до этой фигни.
Расскажите это Норвигу:)

http://norvig.com/design-patte... tterns.pdf

0
20.02.2017, 14:09

Не по теме:

Цитата Сообщение от asmquest Посмотреть сообщение
Расскажите это Норвигу
Не Норвиг поднял в этой теме вопрос о "нормальных ОО-языках". :)

0
20.02.2017, 14:33

Не по теме:

Usaga, дело в том, что "паттерны" не являются универсальными, а зависят от возможностей языка. То что они позиционируются как универсальные средства проектирования -- это не очень хорошо, это ложь. Многие паттерны -- это просто костыли, которые нужны для преодоления ограничений выразительных возможностей конкретных языков.

0
 Аватар для Tyson Fury
2 / 2 / 2
Регистрация: 23.10.2016
Сообщений: 139
20.02.2017, 14:45  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Чем плохо просто вызвать приватный метод Shuffle()?
Вот и я об этом=)
Цитата Сообщение от Usaga Посмотреть сообщение
Мне кажется, что ТС просто пытается "обсосать" данный паттерн и найти границы его применимости.
Все верно.

Цитата Сообщение от Usaga Посмотреть сообщение
Вот это я не совсем понял. Зачем тут какой-то указатель передавать?
Разве в объект команды не нужно передавать указатель на объект получателя?

Цитата Сообщение от Usaga Посмотреть сообщение
Ну это понятно. Речь идёт объекте с состоянием. Если состояния никакого не предвидится, то и усложнять всякими command ненужно, я же с этим не спорю.
Можно пример, что такое объект с состоянием?

Цитата Сообщение от Shamil1 Посмотреть сообщение
А кто (какой метод какого класса) будет создавать лямбды?
Я так и не понял, что и как должны заменить лямбда-выражения (в вопросе: применять паттерн Команда или нет)...
0
Эксперт .NET
 Аватар для Usaga
14347 / 9450 / 1360
Регистрация: 21.01.2016
Сообщений: 35,630
20.02.2017, 14:51
Цитата Сообщение от Tyson Fury Посмотреть сообщение
Разве в объект команды не нужно передавать указатель на объект получателя?
О каком получателе идёт речь? И получателе чего? Речь точно о паттерне command?

Цитата Сообщение от Tyson Fury Посмотреть сообщение
Можно пример, что такое объект с состоянием?
Любой класс имеющий хотя бы одно поле.

Цитата Сообщение от Tyson Fury Посмотреть сообщение
Я так и не понял, что и как должны заменить лямбда-выражения (в вопросе: применять паттерн Команда или нет)...
Лямбда - сокращённая и упрощённая запись анонимного (или не очень) метода\функции. Чтобы не городить классы\функции на каждый чих.
0
 Аватар для Tyson Fury
2 / 2 / 2
Регистрация: 23.10.2016
Сообщений: 139
20.02.2017, 14:56  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
О каком получателе идёт речь? И получателе чего? Речь точно о паттерне command?
На схеме паттерна Команда: класс Receiver.
0
Эксперт .NET
 Аватар для Usaga
14347 / 9450 / 1360
Регистрация: 21.01.2016
Сообщений: 35,630
20.02.2017, 15:01
Цитата Сообщение от Tyson Fury Посмотреть сообщение
На схеме паттерна Команда: класс Receiver.
Не уверен, откуда была картинка взята. Может быть данная схема описывает паттерн в контексте какой-то задачи.

Добавлено через 58 секунд
Если твоей команде не нужны никакие ссылки для работы, то придумывать какие-то receiver-ы не нужно. Просто класс с методом (скажем Do()), который может кто-то когда-нибудь вызвать.
1
 Аватар для Tyson Fury
2 / 2 / 2
Регистрация: 23.10.2016
Сообщений: 139
20.02.2017, 15:07  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Не уверен, откуда была картинка взята. Может быть данная схема описывает паттерн в контексте какой-то задачи.
Вот схема с книги: Гамма... Приемы ООП.
Такая же схема и в Вики.
Миниатюры
Использование и реализация паттерна "Команда"  
0
Эксперт .NET
 Аватар для Usaga
14347 / 9450 / 1360
Регистрация: 21.01.2016
Сообщений: 35,630
20.02.2017, 15:09
Tyson Fury, полагаю, что тут изображено то, что у нас на работе называется RelayCommand. В данном случае объект команды просто делегирует свою работу другому коду. Это не обязательно делать.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
20.02.2017, 16:45
Цитата Сообщение от Tyson Fury Посмотреть сообщение
Я так и не понял, что и как должны заменить лямбда-выражения (в вопросе: применять паттерн Команда или нет)...
Можно вместо объекта типа КонкретнаяКоманда создать (и передать в Инициатора) лямбда-функцию.

Вместо:
C#
1
2
3
4
5
6
7
8
9
void Main()
{
    Pult pult = new Pult();
    TV tv = new TV();
    pult.SetCommand(new TVOnCommand(tv));
    pult.PressButton();
 
    Console.Read();
}
Писать:
C#
1
2
3
4
5
6
7
8
9
void Main()
{
    Pult pult = new Pult();
    TV tv = new TV();
    pult.SetCommand(() => tv.On());
    pult.PressButton();
 
    Console.Read();
}
Но при этом теряется то, ради чего собственно применяют шаблон Команда.
1
Заблокирован
21.02.2017, 15:55
Цитата Сообщение от Shamil1 Посмотреть сообщение
Но при этом теряется то, ради чего собственно применяют шаблон Команда.
а что конкретно теряется? Ваши куски абсолютно аналогичны, кроме того, что Вы написали лишнюю прокладку в виде TVOnCommand, которая в данном случае просто не нужна.

Добавлено через 5 минут
Цитата Сообщение от Shamil1 Посмотреть сообщение
pult.SetCommand(() => tv.On())
там смысл основной в том, что Ваш пульт абстрагирован от того, что делает телевизор, он лишь посылает команду ему. Все нормально со вторым куском. код внутри лямбды как раз и является специализацией по тому, какому объекту посылается сообщение. то же самое, что и в первом примере через конструктор, только без лишнего кода

Добавлено через 7 минут
Цитата Сообщение от Usaga Посмотреть сообщение
Код работающий с командой не обязан знать, что и как она выполняет. Просто вызывает (когда нужно) метод запуска действия и всё
Цитата Сообщение от Usaga Посмотреть сообщение
речь идёт об объекте с состоянием, которое, если надо, можно и менять в любой момент времени
как эти два утверждения сочетаются? Если все что делает код работающий с командой -- отправляет команду, а получатель команды сам знает что с этим делать, то зачем там какое-то состояние?

Добавлено через 7 минут
Цитата Сообщение от actionpattern Посмотреть сообщение
Если все что делает код работающий с командой -- отправляет команду, а получатель команды сам знает что с этим делать, то зачем там какое-то состояние?
Вам если и нужно правки вносить, то не в отправку команды, а в обработку этой команды -- в обработчика команды, либо в объект-получатель. смысл как раз в том, что отправитель ничего не знает о реализации.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
21.02.2017, 16:55
Цитата Сообщение от actionpattern Посмотреть сообщение
а что конкретно теряется? Ваши куски абсолютно аналогичны, кроме того, что Вы написали лишнюю прокладку в виде TVOnCommand, которая в данном случае просто не нужна
В первом примере кода класс TVOnCommand знает, как надо включать телевизор. Это его зона ответственности.

Во втором примере кода Main() знает, как надо включать телевизор (как правильно составить лямбду).
Более того, если мне нужно будет ещё где-нибудь настроить эту команду (для другого пульта), мне придётся этот код (который составляет лямбду) продублировать.
Кроме того, сюда сложно нормально вклеить отмену операции, если она требуется. Пару лямбд передавать? Или - ещё хуже - две независимые лямбды передавать?
0
Эксперт .NET
 Аватар для Usaga
14347 / 9450 / 1360
Регистрация: 21.01.2016
Сообщений: 35,630
21.02.2017, 17:03
Цитата Сообщение от actionpattern Посмотреть сообщение
как эти два утверждения сочетаются? Если все что делает код работающий с командой -- отправляет команду, а получатель команды сам знает что с этим делать, то зачем там какое-то состояние?
Элементарно сочетаются: команда - самостоятельный объект произвольной сложности инкапсулирующий некоторое действие и, если нужно, некие параметры. Идея в том, что единственное, что с командой можно сделать - попытаться её запусть, а уж какие там процессы начнутся и начнутся ли вообще - уже не должно волновать ни отправителя, ни получателя, ни мимопроходителя.
0
Заблокирован
21.02.2017, 17:17
Цитата Сообщение от Shamil1 Посмотреть сообщение
В первом примере кода класс TVOnCommand знает, как надо включать телевизор. Это его зона ответственности.
во втором примере tv.On знает как включать телевизор
Цитата Сообщение от Shamil1 Посмотреть сообщение
Во втором примере кода Main() знает, как надо включать телевизор (как правильно составить лямбду).
Это без комментариев. вуду-пипл -- мейджик пипл, это, оказывается Main делает, а мужики то и не знали, откуда она появляется
Цитата Сообщение от Shamil1 Посмотреть сообщение
Кроме того, сюда сложно нормально вклеить отмену операции, если она требуется. Пару лямбд передавать? Или - ещё хуже - две независимые лямбды передавать?
это и есть наиболее чистое решение. Очевидно, что если телевизор имеет обработчик команды on, он должен иметь и обработчик комманды off, и еще целую кучу обработчиков

Добавлено через 4 минуты
Usaga, покажите какой-нибудь пример, я не понимаю, о чем вы говорите. Команда -- это отсылка сообщения обработчику, не вижу разницы, как эта отсылка реализована, и что она должна "инкапсулировать"

Добавлено через 3 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
ни получателя, ни мимопроходителя.
не знаю, что там насчет "волновать", но получатель содержит обработчик, поэтому, обработка команды -- это можно сказать его дело, и он же на нее реагирует конкретным образом
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
21.02.2017, 17:27
Цитата Сообщение от actionpattern Посмотреть сообщение
во втором примере tv.On знает как включать телевизор
Нет. tv.On знает как включать себя. tv - это экземпляр класса - конкретный прибор с кнопкой "вкл".

Чтобы включить телевизор в общем случае нужно знать, какой телевизор включать. И включение прибора обычно не сводится к нажатию кнопки "вкл". Например, может потребоваться залить воду, засыпать кофе, вставить шнур в розетку и так далее.
0
Заблокирован
21.02.2017, 17:32
Цитата Сообщение от Shamil1 Посмотреть сообщение
Нет. tv.On знает как включать себя. tv - это экземпляр класса - конкретный прибор с кнопкой "вкл".
tv одержит обработчик On, соответственно он знает как включать себя -- вызвать этот обработчик.

Добавлено через 40 секунд
Цитата Сообщение от Shamil1 Посмотреть сообщение
Чтобы включить телевизор в общем случае нужно знать, какой телевизор включать. И включение прибора обычно не сводится к нажатию кнопки "вкл". Например, может потребоваться залить воду, засыпать кофе, вставить шнур в розетку и так далее.
это не имеет никакого отношения к делу
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
21.02.2017, 17:38
Цитата Сообщение от actionpattern Посмотреть сообщение
Команда -- это отсылка сообщения обработчику
До тех пор, пока Вы не поймёте, что значит "команда" в данном контексте, Ваши сообщения лишены смысла.
Здесь обсуждается шаблон Команда, а Ваша критика относится не к нему, а к тому, что Вы сами придумали (к Вашему неправильному понимаю этого шаблона).
0
Заблокирован
21.02.2017, 17:51
Цитата Сообщение от Shamil1 Посмотреть сообщение
что значит "команда" в данном контексте
команда, в данном контексте означает то же самое что и в любом другом: дать команду некоторому объекту, для того, чтобы тот инициировал некоторое действие.

Добавлено через 4 минуты
Shamil1,
по сути дела, все ООП можно рассматривать в том же самом ключе, все объекты сконфигурированы на прием сообщений, которые можно назвать командами, только объект не обязан исполнять эту команду, он сам решает, что ему делать, и как на нее реагировать. А любая команда реализована некоторым обработчиком.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
21.02.2017, 18:37
Цитата Сообщение от actionpattern Посмотреть сообщение
команда, в данном контексте означает то же самое что и в любом другом: дать команду некоторому объекту, для того, чтобы тот инициировал некоторое действие.
Вам уже писали выше, что Команда - это самостоятельный объект со своим поведением и своим состоянием.

Если Вы хотите обсудить шаблон "Команда", то Вам обязательно нужно знать, что (по мнению автора шаблона) означает "команда" в данном контексте.
Если Вы хотите обсудить, насколько удачное название придумал автор для своего шаблона, то создайте тему в разделе "обо всём".
Если Вы хотите объяснить автору шаблона, что он имел ввиду под словом "команда", то Вам следует обратиться непосредственно к автору шаблона.
0
Заблокирован
21.02.2017, 19:02
Цитата Сообщение от Shamil1 Посмотреть сообщение
Команда - это самостоятельный объект со своим поведением и своим состояние
Во первых, функция -- это тоже самостоятельный объект со своим состоянием(не всегда, не во всех языках) и поведением.
Во-вторых, автор того утверждения так и не ответил, зачем там нужно состояние, если все что там делается -- отсылается сообщение.. Под состоянием понимается изменяемое состояние надо полагать? Зачем оно там нужно? Зачем оно нужно, в Вашем примере, и вообще?

Добавлено через 15 минут
Цитата Сообщение от Shamil1 Посмотреть сообщение
Но при этом теряется то, ради чего собственно применяют шаблон Команда.
так что, все таки, там "теряется", и ради чего он применяется, по-Вашему мнению?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2017, 19:02

Какова роль Invoker паттерна Команда?
Ели посмотреть простейший пример реализации паттерна Команда (из метанита): abstract class Command { public abstract void...

Реализация паттерна MVVM
Добрый день, форумчане. Ни разу не пользовался данным паттерном программирования, прочитал уже кучу статей, но ни одна из них не может мне...

Реализация паттерна Singleton
Добрый день. Необходимо реализовать класс Storage, объект которого будет единственным в программе. Для достижения данной цели было выбрано...

Реализация паттерна MVC
Доброго времени суток. Допустим у меня есть класс Database в котором 2 метода: class Database { public OleDbConnection...

Реализация паттерна состояние
Парни, кто шарит, помогите реализовать паттерн. "Игра перемещение по лабиринту". Как можно проще.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru