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

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

19.02.2017, 23:46. Показов 5055. Ответов 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
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
20.02.2017, 05:40
Цитата Сообщение от Tyson Fury Посмотреть сообщение
1. А что если инициатор и получатель это один и тот же объект? Для таких действий шаблон Команда подходит?
Такое возможно, хоть и не сказать, что это красивое решение. Тут можно долго рассуждать.

Цитата Сообщение от Tyson Fury Посмотреть сообщение
2. И вообще, насколько часто Вы используете паттерн Команда в своих приложениях (там где есть GUI).
Мы на работе стараемся не злоупотреблять данным паттерном. В большинстве случаев, всё что нужно - просто вызвать метод класса (презентера, контроллера, модели представления). Заворачивание этого вызова в команду - излишнее усложнение на пустом месте. Кстати, кто сказал, что данный паттерн только для GUI?

Команда хорошо подходит там, где нужнен механизм отмены действий, возможность замены команды другой или вынесение логики опредления доступности команды в неё саму. Т.е. штука полезная, но не везде и всюду.
1
 Аватар для Tyson Fury
2 / 2 / 2
Регистрация: 23.10.2016
Сообщений: 139
20.02.2017, 06:34  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Мы на работе стараемся не злоупотреблять данным паттерном. В большинстве случаев, всё что нужно - просто вызвать метод класса (презентера, контроллера, модели представления). Заворачивание этого вызова в команду - излишнее усложнение на пустом месте.
Я практикуюсь программировать на Qt (С++), там есть система сигналов/слотов и вот хоть убейте, но не понимаю в чем польза от этого паттерна. Он все только усложняет.

Когда Инициатор и Получатель разные объекты, в команду приходится передавать указатель на обоих (в моем случае), разве это нормально? Или я что то не так делаю? =)

Я правильно понимаю: главная цель паттерна -- реализовать возможность отмены (отката) операции. И если приложение не нуждается в этом, тогда данный паттерн не нужен?
0
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
20.02.2017, 07:36
Цитата Сообщение от Tyson Fury Посмотреть сообщение
Я практикуюсь программировать на Qt (С++), там есть система сигналов/слотов и вот хоть убейте, но не понимаю в чем польза от этого паттерна. Он все только усложняет.
Как раз-таки упрощает. И это не "команда", это - Observer (наблюдатель, подписчик).

Цитата Сообщение от Tyson Fury Посмотреть сообщение
Когда Инициатор и Получатель разные объекты, в команду приходится передавать указатель на обоих (в моем случае), разве это нормально? Или я что то не так делаю? =)
Вот это я не совсем понял. Зачем тут какой-то указатель передавать?

Цитата Сообщение от Tyson Fury Посмотреть сообщение
Я правильно понимаю: главная цель паттерна -- реализовать возможность отмены (отката) операции. И если приложение не нуждается в этом, тогда данный паттерн не нужен?
Нет. Цель паттерна "Команда" - в выделении некоторой задачи в отдельный класс включающий и все необходимые параметры (если возможно). Код работающий с командой не обязан знать, что и как она выполняет. Просто вызывает (когда нужно) метод запуска действия и всё. Отмена этого действия - просто одна из фишек данного паттерна.
1
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
20.02.2017, 09:47
Любую проблему можно решить добавлением ещё одного уровня абстракции... Кроме проблемы слишком большого количества уровней абстракции.

Прежде, чем применять какой-либо шаблон программирования, сначала определитесь, зачем вы это делаете.

Цитата Сообщение от Tyson Fury Посмотреть сообщение
Например: Пользователь ввел в 9 цифр и далее нажал на кнопку Shuffle. После чего эти цифры должны перемешаться.
Чем плохо просто вызвать приватный метод Shuffle()?
1
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
20.02.2017, 10:10
Цитата Сообщение от Shamil1 Посмотреть сообщение
Прежде, чем применять какой-либо шаблон программирования, сначала определитесь, зачем вы это делаете.
Мне кажется, что ТС просто пытается "обсосать" данный паттерн и найти границы его применимости.
1
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
20.02.2017, 10:14
Не нужен. Даже в java лямбды завезли. В плюсах-то, с его std::function, тем более.
1
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
20.02.2017, 10:15
Цитата Сообщение от Voivoid Посмотреть сообщение
Не нужен.
Слишком категоричное заявление.
1
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
20.02.2017, 10:19
Цитата Сообщение от Usaga Посмотреть сообщение
Слишком категоричное заявление.
Ну да, если пишешь на Java 6 ( или на чем нибудь еще более древнем ), то наверное еще может пригодиться
1
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
20.02.2017, 10:23
Voivoid, данный паттерн может быть полезен, если нужно действие выделить в отдельный объект, а не только для компенсации бедных возможностей языка.
1
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
20.02.2017, 10:31
Цитата Сообщение от Usaga Посмотреть сообщение
если нужно действие выделить в отдельный объект
Замыкай все что тебе нужно в лямбде.

Цитата Сообщение от Usaga Посмотреть сообщение
а не только для компенсации бедных возможностей языка.
Ну приведи контр-пример того, когда вся эта развесистая иерархия окажется удобнее, чем одна простая лямбда
1
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
20.02.2017, 10:39
Цитата Сообщение от Voivoid Посмотреть сообщение
Замыкай все что тебе нужно в лямбде.
... и состояние тоже?..

Цитата Сообщение от Voivoid Посмотреть сообщение
Ну приведи контр-пример того, когда вся эта развесистая иерархия окажется удобнее, чем одна простая лямбда
Да нет никакой развесистой архитектуры. Есть интерфейс (или абстрактный класс) и его реализация и больше ничего. Лямбды - это очень хорошо, но я не очень представляю, чтобы лямбды можно было складывать в очередь, опрашивать их состояние (типа CanExecute) перед выполнением, или как-то добиваться возможности "отката действия" (типа такого: var backCommand = command.GetRevertCommand();command.Execute();).

Я не настаиваю, что лямбды нельзя использовать, потому что есть такая "заумная" штука как команда. Просто у неё есть своя применимость.
1
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
20.02.2017, 10:47
Цитата Сообщение от Usaga Посмотреть сообщение
чтобы лямбды можно было складывать в очередь
Не знаю как в других языках, но в плюсах это делается элементарно std::queue<std::function<...>>;

Цитата Сообщение от Usaga Посмотреть сообщение
опрашивать их состояние (типа CanExecute) перед выполнением, или как-то добиваться возможности "отката действия"
Попахивает нарушением SRP ( single responsibility principle ).
1
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
20.02.2017, 10:50
Цитата Сообщение от Voivoid Посмотреть сообщение
Попахивает нарушением SRP ( single responsibility principle ).
Ниразу. Объект умеет что-то сделать, объект умеет сказать может ли он это сделать, объект умеет "сделать назад" (ну это уже сильно опционально). И больше ничего.

Цитата Сообщение от Voivoid Посмотреть сообщение
Не знаю как в других языках, но в плюсах это делается элементарно std::queue<std::function<...>>;
Ну это понятно. Речь идёт объекте с состоянием. Если состояния никакого не предвидится, то и усложнять всякими command ненужно, я же с этим не спорю.
1
Заблокирован
20.02.2017, 10:54
Цитата Сообщение от Usaga Посмотреть сообщение
Лямбды - это очень хорошо, но я не очень представляю, чтобы лямбды можно было складывать в очередь, опрашивать их состояние (типа CanExecute) перед выполнением
В нормальных ООП-языках это все легко делается, лямбда там такой же Ъ-объект, который может все.
1
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
20.02.2017, 11:00
asmquest, ещё раз повторю: речь идёт об объекте с состоянием, которое, если надо, можно и менять в любой момент времени. Лямбда такого не позволит. Тогда на помощь и приходит Command.

Добавлено через 3 минуты
Да и строгая типизация, приносимая использованием объекта класса, тоже может быть полезна.
1
Заблокирован
20.02.2017, 11:16
Цитата Сообщение от Usaga Посмотреть сообщение
речь идёт об объекте с состоянием, которое, если надо, можно и менять в любой момент времени. Лямбда такого не позволит.
Позволит в нормальных ООП-языках
1
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
20.02.2017, 11:26
Цитата Сообщение от asmquest Посмотреть сообщение
впрочем, даже в говноязыках, которые поддерживают замыкания, такое тоже возможно
Ну и чем оно будет лучше\проще применения класса с парой методов?

Добавлено через 5 минут
Вообще, дискуссия начинает перетекать в спор "лямбда vs метод класса".
1
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
20.02.2017, 12:13
Цитата Сообщение от Voivoid Посмотреть сообщение
Не нужен. Даже в java лямбды завезли. В плюсах-то, с его std::function, тем более.
А кто (какой метод какого класса) будет создавать лямбды?
1
20.02.2017, 13:16

Не по теме:

Цитата Сообщение от asmquest Посмотреть сообщение
Позволит в нормальных ООП-языках
Как же я не люблю, когда нормальное обсуждение начинает скатываться до этой фигни. ]:->

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.02.2017, 13:16
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru