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

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

19.02.2017, 23:46. Показов 5471. Ответов 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
14743 / 9517 / 1364
Регистрация: 21.01.2016
Сообщений: 35,910
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
14743 / 9517 / 1364
Регистрация: 21.01.2016
Сообщений: 35,910
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
14743 / 9517 / 1364
Регистрация: 21.01.2016
Сообщений: 35,910
20.02.2017, 15:09
Tyson Fury, полагаю, что тут изображено то, что у нас на работе называется RelayCommand. В данном случае объект команды просто делегирует свою работу другому коду. Это не обязательно делать.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
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
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
21.02.2017, 16:55
Цитата Сообщение от actionpattern Посмотреть сообщение
а что конкретно теряется? Ваши куски абсолютно аналогичны, кроме того, что Вы написали лишнюю прокладку в виде TVOnCommand, которая в данном случае просто не нужна
В первом примере кода класс TVOnCommand знает, как надо включать телевизор. Это его зона ответственности.

Во втором примере кода Main() знает, как надо включать телевизор (как правильно составить лямбду).
Более того, если мне нужно будет ещё где-нибудь настроить эту команду (для другого пульта), мне придётся этот код (который составляет лямбду) продублировать.
Кроме того, сюда сложно нормально вклеить отмену операции, если она требуется. Пару лямбд передавать? Или - ещё хуже - две независимые лямбды передавать?
0
Эксперт .NET
 Аватар для Usaga
14743 / 9517 / 1364
Регистрация: 21.01.2016
Сообщений: 35,910
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
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
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
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
21.02.2017, 17:38
Цитата Сообщение от actionpattern Посмотреть сообщение
Команда -- это отсылка сообщения обработчику
До тех пор, пока Вы не поймёте, что значит "команда" в данном контексте, Ваши сообщения лишены смысла.
Здесь обсуждается шаблон Команда, а Ваша критика относится не к нему, а к тому, что Вы сами придумали (к Вашему неправильному понимаю этого шаблона).
0
Заблокирован
21.02.2017, 17:51
Цитата Сообщение от Shamil1 Посмотреть сообщение
что значит "команда" в данном контексте
команда, в данном контексте означает то же самое что и в любом другом: дать команду некоторому объекту, для того, чтобы тот инициировал некоторое действие.

Добавлено через 4 минуты
Shamil1,
по сути дела, все ООП можно рассматривать в том же самом ключе, все объекты сконфигурированы на прием сообщений, которые можно назвать командами, только объект не обязан исполнять эту команду, он сам решает, что ему делать, и как на нее реагировать. А любая команда реализована некоторым обработчиком.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
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
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru