Декомпозиция обработки событий от множества объектов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Декомпозиция обработки событий от множества объектов

Сообщение jangle » 23.07.2013 (Вт) 23:02

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

1 вариант - события от всех контролов обрабатываются в главной форме. При этом в FormMain получается каша из десятков обработчиков.
Во всем этом начинаешь быстро путаться.

2 вариант - события от каждого контрола обрабатывать в своем классе. В FormMain вообще нет обработчиков. Но при этом запутывается логика
взаимодействия этих классов. Опять фигня выходит

Вопрос как же все таки упростить и структурировать такой код?

Изображение

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Декомпозиция обработки событий от множества объектов

Сообщение Debugger » 23.07.2013 (Вт) 23:51

Смотри паттерн проектирования "фасад".
У каждого компонента есть свой интерфейс, в котором содержатся методы, нужные остальным. При помощи этого интерфейса связываешь их друг с другом. Должно помочь - когда будешь добавлять фичи, будут меняться только те компоненты, которые должны меняться.
Added:
Ещё смотри "Subscriber".
И вообще, почитай про паттерны - что-нибудь натолкнёт на верную мысль.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Декомпозиция обработки событий от множества объектов

Сообщение jangle » 24.07.2013 (Ср) 0:17

А можно пример такого интерфейса?

Допустим у нас есть 3 класса. CLASS1, CLASS2, CLASS3

CLASS1 - генерирует событие, которое должно быть обработано 2 и 3 классом

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Декомпозиция обработки событий от множества объектов

Сообщение Debugger » 24.07.2013 (Ср) 1:06

У тебя каждый компонент с каждым связан?

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Декомпозиция обработки событий от множества объектов

Сообщение Debugger » 24.07.2013 (Ср) 1:15

Вообще, неправильно я сказал. Если мы говорим именно о VB6, можно сделать куда элегантнее. Пусть CLASS1 имеет какие-то свойства (для чистоты архитектуры - желательно только на чтение) и имеет какие-то события:
Код: Выделить всё
CLASS1:
Event ButtonClicked(args)
Event ListClicked(args)
Function GetName()
...

И Class2,3 имеют метод AttachClass1:
Код: Выделить всё
Dim WithEvents cl As CLASS1
Sub AttachClass1(c As CLASS1)
   Set cl = c
End Sub

Теперь CLASS2 и 3 могут ловить события первого класса и при необходимости получать от него данные.

Если каждый компонент связан с (почти) каждым, стоит задуматься о том, правильно ли спроектировано приложение. Уж лучше поставить один компонент "во главу" - тогда все будут связаны с одним, что уже не очень плохо.

ADDED:
Перечитал первый пост :D думаю, ты до этого сам дошел.
Расскажи про детали.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.07.2013 (Ср) 10:57

jangle писал(а):Вопрос как же все таки упростить и структурировать такой код?

Я бы сделал, чтобы каждый контрол имел события (генерируемые им) и методы (в необходимом количестве) для внесения в него данных.
А после этого в форме надо разместить переходники между ними, т. е. на события повесить хендлеры, которые прокидывают данные в методы других контролов.
Как-то так.

PS: Скорее всего, это тоже как-то называется. Но нужно думать, а не искать подходящие паттерны, на мой взгляд.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Декомпозиция обработки событий от множества объектов

Сообщение jangle » 24.07.2013 (Ср) 12:09

Вообще я думал для каждого контрола сделать "обертку". Допустим у нас в программе есть следующие объекты:

1. Form1 - форма
2. TextBox - текстовое поле на форме
3. CommandButton - кнопка на форме

При нажатии CommandButton в TextBox пишется строка: "Привет мир!"

Попробуем реализовать паттерн "фасад" если я правильно его понимаю. В событии FormLoad создаем экземпляр класса MainProc.
Больше никакого кода в форме нету.
В событии Class_Initialize класса MainProc создаем по экземпляру (WithEvents) классов TextBox и CommandButton.
Т.е. в сами контролы мы ничего не пишем, а просим сделать это класс-обертку, события тоже принимаем из этих классов.
Вся обработка вертится в классе MainProc. Это и есть паттерн "фасад" ?

Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Декомпозиция обработки событий от множества объектов

Сообщение jangle » 24.07.2013 (Ср) 12:25

Вообще в чем смысл "прокладок" class TextBox и class CommandButton - чтобы в MainProc попадали только нужные программе событие, а не каша из обработчиков. Чтобы изолировать там весь "говнокод"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.07.2013 (Ср) 12:29

jangle писал(а):Чтобы изолировать там весь "говнокод"

Говнокод - он везде говнокод :D

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re:

Сообщение jangle » 24.07.2013 (Ср) 12:32

Qwertiy писал(а):
jangle писал(а):Чтобы изолировать там весь "говнокод"

Говнокод - он везде говнокод :D


Плохо когда он в основном потоке программы. Поэтому я хочу загнать его в изолированные отсеки, и задраить переборки.
Чтобы говнокод общался с основной программой только через эвенты и методы классов. Иначе проект просто пойдет на дно.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.07.2013 (Ср) 12:35

jangle писал(а):Чтобы говнокод общался с основной программой только через эвенты и методы классов.

А не писать говнокод совсем не вариант?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re:

Сообщение jangle » 24.07.2013 (Ср) 13:01

Qwertiy писал(а):
jangle писал(а):Чтобы говнокод общался с основной программой только через эвенты и методы классов.

А не писать говнокод совсем не вариант?


Не вариант потому что он уже написан.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 25

    TopList