powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто что скажет по шаблонам проектирования программ?
23 сообщений из 23, страница 1 из 1
Кто что скажет по шаблонам проектирования программ?
    #36939760
Michael Melvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно организовать программу? Прочёл шаблоны проектирования банды черырёх, узнал одну вещь:


пересказ из книжкиЕсть интерфейс. Есть "ядро" программы. Передача из интерфейса в ядро и обратно идёт по некоторому "узкому горлу", например, посредством объекта некоего класса Command. Это позволит добавить в программу функцию "отмена".

Вопрос: Как организовать класс "Command", чтобы не пришлось его переписывать при малейших изменениях в интерфейсе или ядре.
Вопрос: Как вообще грамотно спроектировать интерфейс?

Ссылки на книжки, статьи и пр. приветствуются. Ищу давно.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36939910
Фотография Бамбукъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Melvin,

А тебе нужно команду "отмена" добавлять?
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940005
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Команда "отмена" самая простая и ето РоллБек + РефрешОлл
:))
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940015
Yossarian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, паттерн Command - не единственный способ реализации UNDO.
Во-вторых, во многих случаях при малейших изменениях интерфейса или ядра Command
переписывать не нужно. Есть исключения. И если у тебя такое исключение - пойми, в чем оно
состоит или хотя бы расскажи об этом.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940063
Michael Melvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упрощённо, выглядит это так.
Есть несколько окон (все разные, т.е. объекты разных классов), есть некое "ядро", т.е. группа классов, которая хранит и обрабатывает данные, отображаемые в интерфейсе.

Я делал вот так: (это неправильно)
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940065
Michael Melvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо же как-то через класс command.
Проблема: данных много, как мне вносить коррективы в интерфейс или ядро, не трогая класс command?
Вот, надо мне изменить ячейку в таблице, значит, я должен обратиться таблице в классе command, которая должна обратиться к этой таблице в ядре...
получается, что эта таблица обязана быть в "command". А там, получается, не только таблица, но и куча других данных...

как организовать такой класс - не знаю. В целом, в итоге, вот как должно быть:
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940068
Michael Melvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сможет ли кто-нибудь схематично, псевдокоде описать, как должно выглядеть объявление методов и переменных класса Command?
Если что-то неясно нарисовал, спрашивайте.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940117
Фотография Esofter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне всегда казалось что банда четырех вполне нормально выложила материал с примерами блек-джеком и шлюхами.

Неужели ты думаешь что кто-то будет сидеть и рисовать тебе схемы? У людей выходной, они хотят отдыхать.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940127
CervusElaphusSibiricus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо хранить проперти, которые меняешь в 2-х состояниях - до изменения и после. И от какого они объекта. И в объекте "команд" ввести функции ундо-редо. В дополнение к функции ду. Что они делают - понятно. Одна возвращает проперть в предыдущее состояние, а другая, соответственно, в последующее. При нажатии кнопки "Сохранить" списки пропертей обнуляются. Как-то так в общем и целом.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940134
Michael Melvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esofterмне всегда казалось что банда четырех вполне нормально выложила материал с примерами блек-джеком и шлюхами.

Неужели ты думаешь что кто-то будет сидеть и рисовать тебе схемы? У людей выходной, они хотят отдыхать.

Банду четырёх я читал, они на класс command только намекнули. Как его реализовать - не описывали.
Схемы рисовать не надо, просто описать приблизительно так:


private:
приблизительно такие переменные, такие методы
public:
примерно такие вот методы для того-то и того-то, вызываются для того-то и того-то

CervusElaphusSibiricusНадо хранить проперти, которые меняешь в 2-х состояниях - до изменения и после. И от какого они объекта. И в объекте "команд" ввести функции ундо-редо. В дополнение к функции ду. Что они делают - понятно. Одна возвращает проперть в предыдущее состояние, а другая, соответственно, в последующее. При нажатии кнопки "Сохранить" списки пропертей обнуляются. Как-то так в общем и целом.

Вот и вопрос - как должно выглядить "от какого они объекта" - их как-то пронумеровать? Или по адресу передавать? Данные-то от разных объектов - их сериализовать надо? Вот в этом-то и вопросы
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940210
Yossarian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Melvin
Проблема: данных много, как мне вносить коррективы в интерфейс или ядро, не трогая класс command?


Твою картинку можно перерисовать так: слева прога, справа БД, в середине SQL. По сути - тот же паттерн, только не объектный. Ты вносишь изменения в свою программу, не меняя сам язык SQL, правильно ? Вот у тебя должно быть что-то в этом роде - проблемно-ориентированный язык, реализованный в виде класса command. Какой именно - зависит от задачи. Как правило, этот язык строится на основании анализа детальных Use Cases. Которые, к слову, редко меняются (хотя и часто содержат ошибки). Допустим, у тебя есть действие "добавить строку к счету". Ты делаешь в command
метод addline, который реализует запоминание того, какая строка была добавлена и заталкивает в стек саму команду addline. Дальше метод undo сможет откатить действие.

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

Модератор: Тема перенесена из форума "Просто треп".
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940223
CervusElaphusSibiricus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Melvin
CervusElaphusSibiricusНадо хранить проперти, которые меняешь в 2-х состояниях - до изменения и после. И от какого они объекта. И в объекте "команд" ввести функции ундо-редо. В дополнение к функции ду. Что они делают - понятно. Одна возвращает проперть в предыдущее состояние, а другая, соответственно, в последующее. При нажатии кнопки "Сохранить" списки пропертей обнуляются. Как-то так в общем и целом.

Вот и вопрос - как должно выглядить "от какого они объекта" - их как-то пронумеровать? Или по адресу передавать? Данные-то от разных объектов - их сериализовать надо? Вот в этом-то и вопросы

Это зависит от платформы, на которой разрабатывать. В частности на .NET, например, есть такая штука как отражение. Т.е. имя объекта и имя его проперти можно сохранять в коллекции как простой стринг. Т.е. создаём класс - описатель со свойствами имя объекта, имя проперти, тип данных и значение. Это всё засовываем в коллекцию. Какую-нибудь хэш-таблицу. И с помощью отражения уже обрабатывать.

Кроме того есть атрибуты. Атрибуты вообще могут поменять взгляд на классическое применение шаблонов, как они описаны у тех же четырёх бандитов.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940235
Michael Melvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот я тоже смотрел в сторону БД. Фактически, там используется сериализация в строку-запрос, которая и анализируется. Но вот думаю, а правильно ли применять такой метод для взаимодействия между интерфейсом и ядром...

YossarianСоздавать же методы типа "создать счет на оборудование", "создать накладную", "создать квитанцию на уплату за газ" - неправильно, тут тебе действительно придется менять command на каждый чих.
Вырази свои действия через элементарные операции, и будет тебе щастье.

вот!! вот!! В том-то и вопрос!
Ведь "создать квитанцию на уплату за газ, используя данные, отмеченные галочками за такой-то и такой-то период с такой-то степенью детализации" - это действие по анализу данных. По идее, обработка должна быть в ядре. По первой нарисованной мною схеме я бы просто из ядра вызвал бы метод:

void СозданиеОтчётаЗаГаз(МассивГалочек,
1 /*квартал*/ ,
3 /*развернуто*/,
таблРезультат /*в эту таблицу записать результат для вывода на форму в Grid*/ );

и всё. Но как такой вот вызов пропустить через класс command?
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940245
Yossarian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Melvin

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

Воо. Вот она, проблема. Дело в том, что многие писатели умных книжек для простоты предполагают, что развитой бизнес-логики как бы нет. (ну или она на уровне "сумма перевода не может быть больше 10000$") То есть в базе лежит то же, что видно в формах. В этом случае, действительно, все так, как ты нарисовал. В твоем случае, похоже, нужен еще один объектный слой, отвечающий за преобразование данных. Тогда паттерн command будет жить не между интерфейсом и ядром, а между слоями ядра. Главное - спроектировать так, чтобы
1) не было обходных путей
2) язык команд не был слишком низкоуровневым.

Однако я бы посмотрел на другие способы реализации undo-redo, например, на вариант сохранения полного текущего состояния объекта. Это дорого, зато не требует паттерна command
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940251
Michael Melvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отличные идеи подкинул!
Единственное, сохранение полного состояния не пойдёт. Когда данных реально дохрена, а отменить надо значение ввода в ячейку... и отмен нужно около 50 или вообще неизвестно, сколько заказчик запросит - то не пойдёт.
Так в PAINT'е реализовано: сохраняется полная картинка, вот и отмен там всего-то 3 штуки.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940318
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael MelvinОтличные идеи подкинул!
Единственное, сохранение полного состояния не пойдёт. Когда данных реально дохрена, а отменить надо значение ввода в ячейку... и отмен нужно около 50 или вообще неизвестно, сколько заказчик запросит - то не пойдёт.
Так в PAINT'е реализовано: сохраняется полная картинка, вот и отмен там всего-то 3 штуки.

я бы сделал так:

бс = Базовое состояние.
оч = очередь команд.

При срабатывании конкретного события, добавлять событие с аргументами в очередь.
При срабатывании любого события, заново строить Текущее состоянии, последовательно применяя к бс(не изменяя старый объект бс).

Если в оч накопится больше команд чем, максимальное(например 15). то применить первую команду очереди к бс, и заменить старое бс на новое. и удалить данную команду из очереди.

Для отмены, выкинуть из очереди команду.


При изменении интерфейса лишь добавляем\изменяем новые события с необходимыми аргументами(аргументом является объект реализующий интерфейс команда).
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940319
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Melvin

Точно не помню, но чтобы работал Command нужна какая-то инфраструктура.

ПС. Лет 10 назад я-бы спокойно взял Win32API, и без всякий знаний от "шайки четырех" слабал бы свой собственный Paint с поддержкой Undo (причём оптимально, без оверхеда). Сегодня, как ты, сижу и думаю как-бы эдак похитрее и концептуальнее сделать простой ETL из базы. Уж интерфейсов нарисовать штук двадцать а воз и ныне там. Имплементации в них нет как нет.

Многие знания умножают печаль...
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940321
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNТекущее состоянии, последовательно применяя к бс(не изменяя старый объект
команды из очереди.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940328
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отменяемые команды, тоже желательно сохранять в стек отмененных.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940478
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN отменяемые команды, тоже желательно сохранять в стек отмененных .


Фраза понравилась.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940488
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZyK_BotaN отменяемые команды, тоже желательно сохранять в стек отмененных .


Фраза понравилась.
для того, что-бы можно было отменить отмену отмененной ранее команды.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36940527
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Melvin
Единственное, сохранение полного состояния не пойдёт. Когда данных реально дохрена, а отменить надо значение ввода в ячейку... и отмен нужно около 50 или вообще неизвестно

Как бы паттерн Command и нужен для того, чтобы не хранить ПОЛНОЕ состояние, а только изменения.

А как сделать -- да легче всего взять книгу, да прочитать.
...
Рейтинг: 0 / 0
Кто что скажет по шаблонам проектирования программ?
    #36945856
Фотография akasex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;

namespace CommandDemo
{
    [Serializable()]
    public class Command : IDisposable, ISerializable
    {
        #region Public Delegates
		public delegate void CommandCallback(object[] args); 
	    #endregion

        #region Private Fields
        private bool _disposed;
        private CommandCallback _callback;
        private object[] _arguments; 
	    #endregion

        #region Public Fields
        public CommandCallback Callback
        {
            get { return this._callback; }
            set { this._callback = value; }
        }

        public object[] Arguments
        {
            get { return this._arguments; }
            set { this._arguments = value; }
        } 
	    #endregion

        #region Constructors
        public Command()
        {
            this._disposed = false;
            this._callback = null;
            this._arguments = null;
        }

        public Command(CommandCallback callback)
        {
            this._disposed = false;
            this._callback = callback;
            this._arguments = null;
        }

        public Command(CommandCallback callback, object[] args)
        {
            this._disposed = false;
            this._callback = callback;
            this._arguments = args;
        }        
	    #endregion

        #region Disposing Methods
        ~Command()
        {
            this.Dispose();
        }

        public void Dispose()
        {
            if (!this._disposed)
            {
                if (this._callback != null)
                {
                    this._callback = null;
                }
                if (this._arguments != null)
                {
                    this._arguments = null;
                }
                this._disposed = true;
                GC.SuppressFinalize(this);
            }
        } 
        #endregion

        #region Serialization Methods
        public Command(SerializationInfo info, StreamingContext context)
        {
            this._callback = (CommandCallback)info.GetValue("Callback", typeof(CommandCallback));
            this._arguments = (object[])info.GetValue("Arguments", typeof(object[]));
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Callback", this._callback);
            info.AddValue("Arguments", this._arguments);
        }
        #endregion

        #region Public Methods
        public void Execute()
        {
            if (this._callback != null)
            {
                this._callback(this._arguments);
            }
        }

        public void Execute(object[] args)
        {
            this._arguments = args;
            this.Execute();
        }
        #endregion
    }
}
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто что скажет по шаблонам проектирования программ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]