Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2015, 11:20   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Проектирование логики работы ПО

Доброго времени!

Переписываю одну софтину, возникла ситуация:
Есть программная часть, скажем интерфейс IManager - создается всегда и существует от начала времен и до коллапса вселенной.
Есть пользовательская часть, визуальная, скажем IManagerUI - он есть, когда есть окно ManagerWindow.

Следовательно MnagerWindow реализует IManagerUI, которому передается
существующий экземпляр IManager. IManagerUI начинает управлять IManager. Добавили данные через UI - соотв. интерфейс IManagerUI прозрачно добавит данные в IManager и рисует их.

но вот беда снова IManagerUI не в курсе новых данных в IManager (добавили элемент, изменили сущ. элемент, удалили), поступивших НЕ от ManagerWindow. Нужен какой-то сервер уведомлений... куда копать?

Или может надо как-то иначе посмотреть?
Человек_Борща вне форума Ответить с цитированием
Старый 29.06.2015, 13:23   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Добавить INotify с методами нужных уведомлений.
В IManager добавить Subscribe/Unsubscribe методы, с аргументом INotify который следует уведомлять о событиях.

Класс, который имплементирует IManagerUI имплементирует так же и INotify, подписывается на события, и т.д.
waleri вне форума Ответить с цитированием
Старый 29.06.2015, 15:28   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Следовательно MnagerWindow реализует IManagerUI, которому передается
Почему это следовательно? IManagerUI должен создаваться программной частью IManager при возникновении ManagerWindow. Или вообще он должен существовать как часть IManager. Я бы делал так, но не зная специфики сложно что-то утверждать.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 29.06.2015, 16:15   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
IManagerUI должен создаваться программной частью IManager при возникновении ManagerWindow.
Почему? Сейчас я пришел к выводу, что ManagerWindow реализует IManagerUI а тот подписывается на события IManager, а затем просто рисует в окне то, что говорят события.

Задача простая - переписать все на интерфейсы, отделить котлеты от мух, т.е. к коде Manager ни в коем случае не лезть в UI.
Было:
Код:
function TManager.add(sValue: string): integer; cdecl;
var
  i: integer;
begin
  Result := fLIst.Add(sValue);
  MainForm2000.ListBox12.add(sValue);
Стало:
Код:
function TManager.add(sValue: string): integer; cdecl;
var
  i: integer;
begin
  Result := fLIst.Add(sValue);
  log('IManager.add(sValue = "' + sValue + '") = ' + IntToStr(Result));
  for i := 0 to fSubscriptions.Count - 1 do
  begin
    if Assigned(fSubscriptions[i]) then
    begin
      fSubscriptions[i].NewItemNotify(EVENT_DIRECTION_AFTER, EVENT_MANAGER_ADD, Result, fList[Result]);
    end;
  end;
end;
Если бы данные приходили только от GUI, я бы не замарачивался, но источником данных может быть как пользователь, так и дополнение к программе, которое качает что-то без видимых окон.

Последний раз редактировалось Человек_Борща; 29.06.2015 в 16:18.
Человек_Борща вне форума Ответить с цитированием
Старый 29.06.2015, 16:25   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Почему? Сейчас я пришел к выводу, что ManagerWindow реализует IManagerUI а тот подписывается на события IManager, а затем просто рисует в окне то, что говорят события.
Потому что это усложняет процесс. Но это чисто мое мнение, решать Вам.
Цитата:
Задача простая - переписать все на интерфейсы, отделить котлеты от мух, т.е. к коде Manager ни в коем случае не лезть в UI.
То что Вы приводите в примере называется абстрагирование. Этот процесс в данном случае никак не связан с тем, о чем мы говорим.
Это первое. И второе. Я знаю что это не правильно, но первый код намного читабельней второго. Уже поэтому второй нуждается в переработке.
Нельзя переписать:
Код:
MainForm2000.ListBox12.add(sValue);
в вызов:
Код:
AddListBox(Target: ListBox; sValue: String);
?
Просто сделайте обертку, скрывающие детали реализации. А уже конкретный Target передадите по обстоятельствам. Этот код будет работать например в Лазарусе и под линукс например. А если выделите все эти обертки типа AddListBox в отдельный юнит/модуль, то сможете оперативно менять его под разные платформы (например, под планшеты).
Цитата:
Если бы данные приходили только от GUI, я бы не замарачивался, но источником данных может быть как пользователь, так и дополнение к программе, которое качает что-то без видимых окон.
Тем более GUI тут не причем и эти базовые действия должны быть предусмотрены еще выше.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 29.06.2015 в 19:37.
Utkin вне форума Ответить с цитированием
Старый 30.06.2015, 16:27   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Потому что это усложняет процесс. Но это чисто мое мнение, решать Вам.
Именно этого я и добиваюсь. Механизм подписки поможет в случае когда слушателем будет C++ приложение к примеру и оно будет фиксировать данные у себя. Писать статические методы тут совсем не катит.
Код бажный не оптимизированный, потому что из демо-примера который пишу, чтобы понять как это работает.

Цитата:
Тем более GUI тут не причем и эти базовые действия должны быть предусмотрены еще выше.
GUI должен быть в курсе того, что он сам выяснить не может. Не вешать же таймер для перечитывания 100500 строк из базы и отрисовки?

Последний раз редактировалось Человек_Борща; 30.06.2015 в 17:04.
Человек_Борща вне форума Ответить с цитированием
Старый 30.06.2015, 18:15   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Переписывайте на шарпе с использованием WPF, там уже есть биндинг, который это умеет
На делфях если всё еще VCL там, то подглядеть как они запилили это в TDBEdit и прочих контролах из той же вкладки.
В целом, зависит от задачи, но втихаря что-то там перерисовывать на экране - это не кошерно. Пользователь тыкал в одну строку таблицы, а там уже что-то обновилось и непонятно что выбралось, а нужная строка куда-то ускакала.
pu4koff вне форума Ответить с цитированием
Старый 30.06.2015, 20:53   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Не вешать же таймер для перечитывания 100500 строк из базы и отрисовки?
Нужно отрисовывать только те строки, которые показываются юзерам, а не 100500. Задача вполне посильная. Если Вы в каждом месте где надо рисоваться будете обрабатывать сообщения, то программа все время только этим и будет заниматься.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 30.06.2015, 22:32   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
IManagerUI начинает управлять IManager. Добавили данные через UI - соотв. интерфейс IManagerUI прозрачно добавит данные в IManager и рисует их.
Мне кажется, что проблема тут. IManagerUI не должен управлять IManager-ом, он должен лишь отправлять ему команды и данные к ней и подписываться на изменения, а IManager должен колбасить данные сам.

Либо, если в данной архитектуре IManager -- интерфейс манипуляций данными, механизм подписки должен быть реализован как-то отдельно. В DB-компонентах Delphi сделано именно так, за подписку отвечает TDataSource, если не ошибаюсь.
Vapaamies вне форума Ответить с цитированием
Старый 30.06.2015, 23:40   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Переписывайте на шарпе с использованием WPF, там уже есть биндинг, который это умеет
Так и LiveBindings на delphi это умеет. Проблема в том что я отказался от Delphi. C# не вариант, ему нужна VM для исполнения.



Цитата:
В целом, зависит от задачи, но втихаря что-то там перерисовывать на экране - это не кошерно. Пользователь тыкал в одну строку таблицы, а там уже что-то обновилось и непонятно что выбралось, а нужная строка куда-то ускакала.
IManager - сервис на ПК. IManagerUI может быть GUI для сервиса, или же вообще расширением хрома.
Я имею ввиду ситуацию, когда есть GUI IManagerUI над IManager, одновременно с этим для IManager по HTTP приходит новый элемент для вставки в список и вот тут нужно как-то сообщить в IManagerUI о том что, что-то добавилось и надо бы это отрисовать если есть куда(эл-т будет в поле зрения).

Когда юзер работает в UI, само ничего из ниоткуда не придет и не изменится, просто потому что в двух местах сразу быть нельзя)
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгебра логики LiR1Ka Помощь студентам 3 07.06.2011 22:37
Алгебра логики. Александр95 Помощь студентам 3 12.04.2011 16:02
алгебра логики вредина123 Помощь студентам 0 12.12.2010 19:08
Развитие логики Lemo Помощь студентам 5 04.11.2009 14:23
Проектирование и разработка информационной системы на примере работы отдела кадров - delphi lesha oskol Помощь студентам 3 24.01.2009 18:14