Re[7]: Слабое связывание в процедурном языке
От: Stanislav V. Zudin Россия  
Дата: 28.07.24 14:43
Оценка:
Здравствуйте, zelenprog, Вы писали:


SVZ>>Ну раз нет возможности использовать полиформизм на уровне кода, значит придётся использовать полиморфизм на уровне данных.

SVZ>>В качестве примера можно подсмотреть стек TCP, виндовый WinAPI — структуры переменного размера, в начале размер и тип данных. Внутри обработчика анализ заголовка и передача по цепочке. Т.е. в какой-то точке программы будут собраны все обработчики.

Z>А можно простой пример?

Z>Чтобы было понятнее?

WinAPI: https://learn.microsoft.com/en-us/windows/win32/controls/lvn-getdispinfo

Для множества уведомлений set/get используется единая схема.
Шлётся сообщение WM_NOTIFY, в качестве параметра — указатель на структуру с данными.
Все структуры имеют одинаковую структуру:

typedef struct tagNMLVFINDITEMA {
  NMHDR       hdr;
  int         iStart;
  LVFINDINFOA lvfi;
} NMLVFINDITEMA, *LPNMLVFINDITEMA;

typedef struct tagLVDISPINFOW {
  NMHDR   hdr;
  LVITEMW item;
} NMLVDISPINFOW;

и т.д.


Первым идёт заголовок NMHDR, в нём лежит код уведомления.
В зависимости от кода уведомления указатель на void кастится к нужной структуре.

Т.е. все твои отправители уведомлений используют одну и ту же функцию для отправки сообщений.
Если концепция указателей в твоём языке отсутствует, то массив байт создать можно? В этом случае, чтобы отправить уведомление надо выделить блок памяти нужного размера, сериализовать в него свою структуру с данными, массив отправить в диспетчер. Диспетчер десериализует заголовок, подсмотрит тип сообщения и вызовет нужную функцию, которая уже десериализует структуру целиком и обработает уведомление.
Т.е. тут у тебя диспетчер знает о всех обработчиках, но зато остальные части приложения знают только о диспетчере.

в Си все эти преобразования происходят без копирования памяти. А в твоём случае —

SVZ>>Если есть доступ к ОСи (надеюсь, язык не совершенно оторван от реалий), то можно использовать системозависимые механизмы для обмена данными, выше камрады об этом упомянули.


Z>Через файлы обмен будет очень медленным — это самый крайний вариант.


А через сокет? Работа с localhost (наверное в 99% операционок) реализована через память (внутри драйвера), без обращения к железу.
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.