SASGIS

Веб-картография и навигация

FlightRadar+SAS

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: vdemidov, Tolik

Re: FlightRadar+SAS

Сообщение vdemidov » 30 июн 2011, 20:58

vasketsov писал(а):А интерфейс тут нафиг не нужен просто потому что Show(obj), реализованная внутри плагина, как раз и будет рисовать через интерфейс хоста. Раз иконки и все прочие параметры-настройки в плагине - он и дергает за ниточки рисования хост. То есть сам хост ровным счётом ничего не делает с данными плагина, он вообще не знает, что там за данные вообще и как их рисовать в частности. Он только умеет обойти все элементы плагина.

Никакого сам рисовать никогда не будет. Плагин живет в бекграунде и доступа к ГУЮ не будет иметь никогда. Примите это как данность или пишите свою программу для этого плагина.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 157 раз.

Re: FlightRadar+SAS

Сообщение vasketsov » 30 июн 2011, 22:11

vdemidov писал(а):Никакого сам рисовать никогда не будет

У меня стойкое ощущение, что это непонятно кому оппонирование не разобравшись в сути предложения.
Предлагаю прочитать всё ещё раз сначала медленно и трижды. Если по прежнему будет непонятно - перейти в режим "желания разобраться и подумать" и повторить процедуру.
Хинт: никто не писал, что плагин сам что-то рисует. Тем более что как бы ни было реализовано хранение данных для отображения и собственно отображение, это ровным счётом никакого отношения к итератору не имеет. Рисование должно быть отделено от данных, а сами данные - от итератора.
Хинт номер 2: никогда в истории и нигде в мире элемент, подлежащий итеративному перечислению, не имеет ничего общего с итератором и интерфейсом итерации, так как всегда и везде итератор максимально абстрактен и позволяет по щелчку пальцев менять итерируемую сущность.
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 198 раз.

Re: FlightRadar+SAS

Сообщение IC7K » 01 июл 2011, 00:24

да... ну вот опять :(

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

я со своей стороны написал бы интерфейс взаимодействия с источником данных и все дела..
сильный поедает вкусного
IC7K
Новичок
 
Сообщения: 19
Зарегистрирован: 25 фев 2011, 14:35
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.

Re: FlightRadar+SAS

Сообщение vasketsov » 02 июл 2011, 19:25

IC7K писал(а):если разработчик лучше знает как надо, то почему бы ему не сделать готовый шаблон? к чему эти разговоры?

Весь смысл данного раздела как раз в том, что разработчик(и) этой конкретной программы советуются с другими, в том числе тоже разработчиками, в том числе и такими, для которых разработка ПО - не хобби, а профессия. Поэтому понятие "лучше знает" здесь неприменимо, а применим опыт, чаще всего личный.
Тема о плагинах вообще - тому подтверждение.
Ради интереса сходите туда и поглядите насчёт того, когда и кем впервые озвучена идея полного исключения гуя из плагинов. В своё время я с этим так жёстко наелся, что исключения из этого правила до сих пор помню, хотя с того проекта минуло уже больше 10 лет. Там было сильное "связывание" между компонентами системы, и в итоге при отсутствии ошибок (с точки зрения ТЗ) в среднем раз в полгода команда из десятка кодеров просто переписывала с нуля интерфейс взаимодействия хоста и его "клиентов". Минимум четырежды. Но там у народа было дофига времени на такие дела, чего не скажешь о здешних разработчиках.
А сейчас мне тут этим пенять - это даже не смешно, это явный признак того, что оппонент даже не захотел попробовать разобраться.

А разбираться есть в чём. Дело в том, что в соответствии с концепцией взаимодействия хоста-плагина для любого плагина, хост понятия не имеет, что там плагин напридумывал делать, какие у него настройки, какие иконки надо рисовать, и т.п. В свою очередь плагин не имеет права ничего заранее предполагать по поводу взаимодействия хоста и юзера (например, юзер отключил хинты), а также конкретной реализации хоста за пределами утверждённого интерфейса взаимодействия (может хост будет не на экране рисовать самолётики, а в виде таблицы их выдавать рядом со своими данными GPS). В этом смысле если в новой версии Delphi пропадёт Canvas, то не должна возникать необходимость переписывания плагинов. Если коротко - плагин знает ЧТО рисовать, а хост - КАК рисовать. Любые отходы от этого правила - потенциальная задница с необходимостью переписывания кода хоста и плагина.

В этом смысле предложенный ранее список
function GetLonLat: TDoublePoint;
function GetBitmapSize: TPoint;
function GetFixedInBitmap: TPoint;
function GetPictureBits: PColor32;
function GetHintText: WideString;
function GetInfoHTML: WideString;
это и есть обобщённый ответ от плагина хосту на вопрос, что именно надо рисовать.
А так как инициатором рисования (точнее в общем случае - обновления информации) одного конретного элемента может быть как плагин, так и хост, то совершенно очевидна необходимость выделения рисования в отдельную процедуру с возможностью её прямого вызова.

Следующий тезис до банального прост. Так как итератор по сути абстрактен, для его реализации через интерфейс элемента потребуется либо прямое приведение типов интерфейсов фактически через тот же указатель, либо наследование интерфейсов (всё же язык-то используется строго типизированный). Первый способ идиотичен своей избыточностью. Второй идиотичен своей избыточностью вдвойне, кроме того совершенно не факт, что любые 2 интерфейса одного объекта могут быть получены на стороне хоста друг из друга через QueryInterface, полагаться на это нельзя. Но что самое плохое - оба способа очевидно не из разряда "написал и забыл".

Вот и выходит, что вариантов-то сделать просто и железобетонно - не так уж и много. К написанному могу добавить только, что внутри плагина вызов Show(obj) оборачивается в примитив синхронизации (например, критическую секцию или мьютекс или ещё какой изврат в соответствии с потребностью, так как в соответствии с предпосылкой, данные у нас валятся из стороннего источника в отдельном потоке или даже нескольких потоках) и перенаправляется в хост, при этом Obj уже "разыменовывается" и в процедуру ShowMePlease отдаётся живой реальный интерфейс объекта. Раньше чем в этот момент он (рисовабельный интерфейс конкретного рисовабельного элемента) вообще не требуется. В итоге мухи отделены от котлет, данные от отображения, а итератор как дедушка Ленин вечно живой.
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 198 раз.

Re: FlightRadar+SAS

Сообщение vdemidov » 02 июл 2011, 21:36

vasketsov писал(а):А так как инициатором рисования (точнее в общем случае - обновления информации) одного конретного элемента может быть как плагин, так и хост, то совершенно очевидна необходимость выделения рисования в отдельную процедуру с возможностью её
прямого вызова.

Нифига. Раз уж вы соглашаетесь, что только хост знает как рисовать, то согласитесь, что только он может точно знать когда, в каком треде и с какой синхронизацией или без онной это нужно делать. Плагин может только подсказать ему, что вот данные изменились. Для этого плагин предоставляет нотифаер, который и дергает при изменениях. А уж как на него будет реагировать хост-программа это ее программы дело.
Код: Выделить всё
  IObjectTracker = interface
    function GetObjectSet: IObjectSet;    //выдает набор объектов
    function GetNotifier: IJclNotifier;   // Нотифаер, который рассылает уведомления об изменениях в наборе объектов.   
  end;

Согласен можно не морочить голову с отдельным интерфейсом IObjectSet, а просто воспользоваться стандартным IEnumUnknown
Он будет универсальным, а уж потом хост-программа будет проверять экземпляры на соответствие поддерживаемым ею интерфесам.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 157 раз.

Пред.

Вернуться в Раздел для разработчиков программы SAS.Планета

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2