19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 533
1

Как соединить паттрен стратегия с пользовательсикм интерфейсом

02.10.2019, 17:00. Показов 1256. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Имеется несколько вариантов поведения некого объекта. Все они реализуются через некий интерфейс, например ISignaler. Есть список этих объектов

C#
1
2
3
4
        /// <summary>
        /// Сигналеры
        /// </summary>
        private List<ISignaler> _signalers;

У каждого сигналера есть набор параметров, которые надо дать пользователю редактировать. В интерфейсе пользователь будет выбирать сигналер и раскрывать его на редактирование где будет задавать параметры. Как правильно применить тут ООП и паттерны, чтобы было универсально и не зависело от визуальной платформы? (может быть и WinForm и WPF или даже WEB-интерфейс.

Напрашивается сделать для каждого объекта-сигналера (или для группы сигналеров) специальный класс, который будет взаимодействовать между сигналером и визуальном компонентом. Естественно этот класс будет поддерживать спец. интерфейс с методом editб который будет вызываться когда юзер нажмет "редактировать".
Но на сколько это правильно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2019, 17:00
Ответы с готовыми решениями:

Стратегия (как лучше)
Пишу форум. Всего две таблицы - для тем и для сообщений. Каждой теме соответсвуют несколько...

Как называется эта стратегия?
эт старая стратегия, ты еще там типа бога управляешь первобытными, и помойму там идет война между...

Стратегия открытия СДЛ - как лучше?
Возможно Вам такой вопрос кажется тупым, но все же.. Сейчас занимаюсь созданием СДЛ-а с хорошим...

Множественность гибридов как стратегия эволюции и эволюционной селекции
Все живые существа, от клеток, бактерий и вирусов, населяющие наш мир - нашу планету Земля являются...

8
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
03.10.2019, 15:08 2
Цитата Сообщение от megabax Посмотреть сообщение
чтобы было универсально и не зависело от визуальной платформы? (может быть и WinForm и WPF или даже WEB-интерфейс.
Непонятно, чего Вы хотите добиться. Форма редактирования для разных "визуальных платформ" будет разной.

Цитата Сообщение от megabax Посмотреть сообщение
Напрашивается сделать для каждого объекта-сигналера (или для группы сигналеров) специальный класс, который будет взаимодействовать между сигналером и визуальном компонентом. Естественно этот класс будет поддерживать спец. интерфейс с методом editб который будет вызываться когда юзер нажмет "редактировать".
Ещё более непонятно.
Когда юзер нажмёт "редактировать" будет что-то происходить в интерфейсе. Например, открываться форма для редактирования. Каким образом сюда прикрутить класс с методом edit и за что этот класс будет отвечать?
Сигналеры - это некие сущности? Для взаимодействия между сущностями и визуальными компонентами обычно используют специальный класс - презентер/контроллер/итп - и обычно такой класс один на экранную форму.
0
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 533
03.10.2019, 16:26  [ТС] 3
Цитата Сообщение от Shamil1 Посмотреть сообщение
Каким образом сюда прикрутить класс с методом edit и за что этот класс будет отвечать?
Изначально я предполагал, что этот класс, например, прочитает значение полей объекта, значения которых пользователь будет менять. Присвоит, их, например, значениям Text разных TextBox. Если это bool, тогда значению Checked компонента CheckBox. Вызовет модальный диалог, потом поместит измеренные значения обратно в объект. Но как быть, если потом понадобиться переделать прогу на WPF или на ASP.NET? Сначала вроде как напрашиваются методы edit_read и edit_save.
Потом я подумал, что хорошо бы что-бы форма программно формировалась и написал нечто вроде:
C#
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
        /// <summary>
        /// Добавить поля
        /// </summary>
        /// <param name="infos">Поля или свойства</param>
        /// <param name="y">Текущая позиция</param>
        private void add_fields(MemberInfo[] infos)
        {
            foreach (MemberInfo info in infos)
            {
                object[] attrs = info.GetCustomAttributes(typeof(FieldSerializationAttribute), true);
                if (attrs.Length == 0) continue;
                FieldSerializationAttribute attr = attrs[0] as FieldSerializationAttribute;
                if (!attr.is_serialization) continue;
                Type obj_filed_type = get_object_field_type(info);
                if (obj_filed_type == typeof(bool))
                {
                    add_conponent(new CheckBox(), info, info.Name, 20, 15);
                }
                else
                {
                    int width=add_conponent(new Label(), null, info.Name, 20, 0);
                    if (obj_filed_type == typeof(decimal)) add_conponent(create_numeric_up_down(3), info, info.Name, 25 + width, 0);
                    if (obj_filed_type == typeof(int)) add_conponent(create_numeric_up_down(0), info, info.Name, 25 + width, 0);
                    if (obj_filed_type == typeof(string)) add_conponent(new TextBox(), info, info.Name, 25 + width, 0);
                }
                _curr_top += 25;
            }
        }
Ну и подумал, что необходим все таки паттерн MVC. То есть в качестве вьюхи у меня будет форма из WinForms, и контроллер, который будет передавать данные ядру программы и получать от него данных. Если потребуется сменить платформу интерфейса - тогда надо будет переписать только контроллер.
Цитата Сообщение от Shamil1 Посмотреть сообщение
Сигналеры - это некие сущности?
По сути, да. Это реализация различных поведений. И у каждого сигналера могут быть свои наборы настраиваемых параметров.
0
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
03.10.2019, 19:21 4
Цитата Сообщение от megabax Посмотреть сообщение
Присвоит, их, например, значениям Text разных TextBox.
Цитата Сообщение от megabax Посмотреть сообщение
Но как быть, если потом понадобиться переделать прогу на WPF или на ASP.NET?
Писать другой код. Код, присваивающий значения винформовским текстбоксам, в любом случае не подойдет для WPF или ASP.NET.

Цитата Сообщение от megabax Посмотреть сообщение
Если потребуется сменить платформу интерфейса - тогда надо будет переписать только контроллер.
Вы хотите генерировать Представление в рантайме? Не думаю, что это позволит сэкономить время на разработку.
0
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 533
04.10.2019, 08:27  [ТС] 5
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вы хотите генерировать Представление в рантайме? Не думаю, что это позволит сэкономить время на разработку.
А какие есть альтернативы? Создавать для каждого сигналера (или иного объекта) форму и прописывать алгоритм заполнения туда и обратно?
типа вот такого:
C#
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
public class ChannelFilterFormFillerSmart : AbstractFilterForm
    {
        /// <summary>
        /// Фильтр
        /// </summary>
        public SmartChannel smart_channel;
 
        /// <summary>
        /// Заполнить форму
        /// </summary>
        public override void fill_form()
        {
            form.chbSmartFilterEnabled.Checked = smart_channel.enable;
            form.cbTradeSimbolSmart.Text = smart_channel.lead_ticker;
            form.cbIntervalSmart.Text = smart_channel.lead_interval;
            form.nudChannelFilterCountSmart.Value = smart_channel.count;
            form.nudChannelFilterKSigmaSmart.Value = Convert.ToDecimal(smart_channel.k_sigma);
            form.nudChannelFilterWidthSmart.Value = smart_channel.channel_width_for_return;
            form.cbTickerUpSmart.Text = smart_channel.ticker_when_penetration_up;
            form.cbTickerDownSmart.Text = smart_channel.ticker_when_penetration_down;
            form.chbCashUpSmart.Checked = smart_channel.ticker_when_penetration_up.Trim() == "";
            form.chbCashDownSmart.Checked = smart_channel.ticker_when_penetration_down.Trim() == "";
            form.nudOverFlow.Value = smart_channel.over_flow_count;
            form.chbUseConcreteItemBan.Checked = smart_channel.use_concrete_item_ban;
        }
 
        /// <summary>
        /// Заполнить объект
        /// </summary>
        public override void fill_object()
        {
            smart_channel.enable=form.chbSmartFilterEnabled.Checked;
            smart_channel.lead_ticker=form.cbTradeSimbolSmart.Text;
            smart_channel.lead_interval=form.cbIntervalSmart.Text;
            smart_channel.count=Convert.ToInt32(form.nudChannelFilterCountSmart.Value);
            smart_channel.k_sigma=Convert.ToDouble(form.nudChannelFilterKSigmaSmart.Value);
            smart_channel.channel_width_for_return=form.nudChannelFilterWidthSmart.Value;
            smart_channel.ticker_when_penetration_up=form.cbTickerUpSmart.Text;
            smart_channel.ticker_when_penetration_down=form.cbTickerDownSmart.Text;
            smart_channel.over_flow_count= Convert.ToInt32(form.nudOverFlow.Value);
            smart_channel.use_concrete_item_ban=form.chbUseConcreteItemBan.Checked;
        }
    }
0
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
04.10.2019, 09:04 6
Цитата Сообщение от megabax Посмотреть сообщение
А какие есть альтернативы? Создавать для каждого сигналера (или иного объекта) форму и прописывать алгоритм заполнения туда и обратно?
В .NET MVC есть специальные классы и методы расширения, которые делают это за Вас. Так же есть команда меню для автоматической генерации вью по модели (один раз во время разработки).
Так же можно использовать библиотеки типа AutoMapper.

В винформз используется специальный механизм датабайнд. Достаточно при добавлении контрола на форму прописать ему значение соответствующего свойства.
1
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 533
04.10.2019, 09:27  [ТС] 7
Цитата Сообщение от Shamil1 Посмотреть сообщение
В винформз используется специальный механизм датабайнд. Достаточно при добавлении контрола на форму прописать ему значение соответствующего свойства.
Спасибо буду пользовать.
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
04.10.2019, 23:36 8
Цитата Сообщение от megabax Посмотреть сообщение
У каждого сигналера есть набор параметров, которые надо дать пользователю редактировать. В интерфейсе пользователь будет выбирать сигналер и раскрывать его на редактирование где будет задавать параметры. Как правильно применить тут ООП и паттерны, чтобы было универсально и не зависело от визуальной платформы? (может быть и WinForm и WPF или даже WEB-интерфейс.
Напрашивается сделать для каждого объекта-сигналера (или для группы сигналеров) специальный класс, который будет взаимодействовать между сигналером и визуальном компонентом. Естественно этот класс будет поддерживать спец. интерфейс с методом editб который будет вызываться когда юзер нажмет "редактировать".
Но на сколько это правильно.
В этом вашем single-dispatch-oop варианта два:

1) Делаешь «универсальную структуру данных» (можно повторить JSON или типа того), которую будет понимать любая визуальная платформа (пишешь под каждую адаптеры) и строить по ней динамически интерфейс для редактирования. Тогда твой ISignaler должен иметь метод(ы) типа
C#
1
2
3
4
5
6
interface Signaler {
 
    Properties ToProperties();
 
    void From(Properties properites);
}
Или типа того.

2) Делаешь общую «универсальную» обёртку поверх этих твоих визуальных платформ и используешь её в своём сигналере, типа такого:

C#
1
2
3
4
5
6
7
8
interface Editor {
 
    void editNumber(out int number);
 
    void editText(out string text);
 
    ...
}
C#
1
2
3
4
interface Signaler {
 
    editIn(Editor editor);
}
Ну там, насколько фантазия позволяет.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
12.10.2019, 22:36 9
C#
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
    public interface ISignaler
    {
        void Perform();
    }
 
    public class Concrete1Signaler : ISignaler
    {
        public void Perform()
        {
            //TODO
        }
    }
 
    public class Concrete2Signaler : ISignaler
    {
        public void Perform()
        {
            //TODO
        }
    }
 
    public class InputParams
    {
        public int Property { get; set; }
    }
 
    //если сигналеры взаимозаменяемы то нужна AbstractFactory
    //иначе удобнее FactoryObject 
    public class SignalerFactoryObject
    {
        public static ISignaler CreateSignaler(InputParams @params)
        {
            if(@params == null)
            {
                throw new NullReferenceException();
            }
            else if(@params.Property == 1)
            {
                return new Concrete1Signaler();
            }
            else if(@params.Property == 2)
            {
                return new Concrete2Signaler();
            }
            throw new NotImplementedException();
        }
    }
 
    //GUI
    
    public class GUI
    {
        public GUI()
        {
            
        }
 
        public void Action(InputParams @params)
        {
             SignalerFactoryObject.CreateSignaler(@params);
        }
    }
0
12.10.2019, 22:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2019, 22:36
Помогаю со студенческими работами здесь

Как делать игру жанра, стратегия какой нужен редактор?
я не знаю как делать игру жанра стратегия какой нужен редактор? OpenGL+ДЕЛФИ?

Как работать с интерфейсом?
Никак не могу разобраться с этими кнопками, лейблами, боксами, да и найти то ничего про них не...

Как создать программу с интерфейсом на с++?
Общая идея такова. Нужно сделать в С++ (использую C++ Builder 6 Enterprise) Программу которая в...

Как создаются библиотеки с интерфейсом?
Здравствуйте уважаемые форумчане! Помогите разобраться с таким вопросом. Скажем я создал форму,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru