Опрос по реализации системы команд в программе

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Опрос по реализации системы команд в программе

Сообщение Sharfik » 31.12.2014 03:02:04

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

Вы пишете код с командой, что то вроде:
Код: Выделить всё
OwnerApplication.Command('GetPoint MyCar');
.....


Как реализовать функцию Command()
Вар.1
function Command(CmdStr:String):Variant;
или урезано и узко под win
function Command(CmdStr:String):OleVariant;

+ Прямое получение параметра.
- Нельзя проверить что команда была выполнена, если разработчик чужой команды не реализовал заполнение Result..
- Сложная обработка без документации

Итоговый код:
Код: Выделить всё
rValue:=OwnerApplication.Command('GetPoint MyCar');
if rValue<>null then
begin
   rValue.....
end;


Вар.2
Код: Выделить всё
function Command(CmdStr:String):Integer;
//Функция возвращает меньше 0, если не найдена или не выполнена правильно.
//Или возвращает индекс для обращения к Массиву/Списку текстовому куда может при необходимости быть помещен ответ выполнения процедуры сторонней.

-Не в одну строку решение, ответ не получается напрямую.
-Многим не понравится хранение ответов как строк или списком переменных

Итоговый код:
Код: Выделить всё
rValue:=OwnerApplication.Command('GetPoint MyCar');
if rValue>-1 then
begin
   tmpStr:=OwnerApplication.CommandResults(rValue);
   ...Parse(tmpStr);
end;
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Опрос по реализации системы команд в программе

Сообщение stanilar » 31.12.2014 05:54:55

Если подразумевается, что плагины будут совсем сторонние (и кроссплатформенные),то не надо использовать функции вообще. Берите пример с майкрософта: procedure DoSomethink(const Par1 : Pointer; const Par2 : Pointer; const Out1 : Pointer; const Out2 : Pointer); Par1, Par2 - адрес памяти с входными параметрами; Out1, Out2 - адрес памяти, под результат. Сама процедура не должна выделять память под Par1 - Out2 . Структуры входных/выходных параметров задается отдельно.

Для родного fpc сделайте обертку над этими процедурами в любом удобном Вам виде. А если не лень, то и в обоих предложенных вариантах.

Sharfik писал(а):Вы пишете код с командой, что то вроде:
Код: Выделить всё
OwnerApplication.Command('GetPoint MyCar');



Самая плохая идей, она подходит только для функций, которые будут вызываться несколько раз за всю жизнь программы. Нет проверки типов, нет самой синтаксической обособленности процедуры (т.е. procedure GetPoint(MyCar) ). Огромные затраты времени на поиск необходимой функции. Все равно, по хорошему, придется писать процедуры-оболочки, если функционал будет часто использоваться.

P.S. Так до конца и не понял, кто, чего и откуда тянет.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Опрос по реализации системы команд в программе

Сообщение Vapaamies » 31.12.2014 10:07:37

Статьи GunSmoker-а об архитектуре плагинов уже прочитаны? Интерфейсы как средство реализации плагинов вроде бы кроссплатформенны, если не привязывать их к GUID, а получать обычной функцией.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Опрос по реализации системы команд в программе

Сообщение Sharfik » 31.12.2014 21:22:52

Vapaamies писал(а):Статьи GunSmoker-а об архитектуре плагинов уже прочитаны? Интерфейсы как средство реализации плагинов вроде бы кроссплатформенны, если не привязывать их к GUID, а получать обычной функцией.

Глянул, и заодно вспомнил где видел рекомендацию по использованию WideString. Его статьи имеют одну особенность, они для Delphi, а Delphi ориентированность программы не подразумевает не какой кросплатформенности даже через годы разработки софта. ИМХО, лучше узко заточить под FPC, пускай передаются типы известные только ему, но зато среда разработки открыта и не ограничивает нас негде.

stanilar писал(а):Самая плохая идей, она подходит только для функций, которые будут вызываться несколько раз за всю жизнь программы. Нет проверки типов, нет самой синтаксической обособленности процедуры (т.е. procedure GetPoint(MyCar) ). Огромные затраты времени на поиск необходимой функции. Все равно, по хорошему, придется писать процедуры-оболочки, если функционал будет часто использоваться.

P.S. Так до конца и не понял, кто, чего и откуда тянет.

Ты не так все понял. Не каких procedure GetPoint(MyCar) не предусмотрено. Это команда, а не процедура. Открой коммандную строку win/lin и вбей любую команду, тоже самое имелось ввиду. Как и откуда рождается команда в рамках темы не важно, это отдельная dll с обработкой команды и ее объявлением. У меня мысли расходятся в общем мнении по поводу вопроса "а что если надо будет получить результат чего то".
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Опрос по реализации системы команд в программе

Сообщение sign » 05.01.2015 07:19:10

Sharfik писал(а):не подразумевает не какой...
Не каких procedure GetPoint(MyCar) не предусмотрено

Рекомендую вспомнить правописание частиц не и ни.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Опрос по реализации системы команд в программе

Сообщение Sharfik » 05.01.2015 08:27:30

sign писал(а):Рекомендую вспомнить правописание частиц не и ни.

За замечание, спасибо. Но вспоминать не придется, некогда не запоминал правилами без практического смысла и с обоснованием на воздухе.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Опрос по реализации системы команд в программе

Сообщение zub » 05.01.2015 13:52:42

У меня сделано в виде
Код: Выделить всё
function Command(CmdStr:String):Integer;

для связи команд между собой реализован некий "стек" в который можно пихать и "выпихивать" разные типизированные значения, команда возвращает код ошибки, а результат работы команды лежит на вершине стека.
т.е. возможны конструкции вида.
Код: Выделить всё
GetPointAndPushToStack;GetPointAndPushToStack;DrawLineFromStack

первые 2 запрашивают у пользователя координаты и ложат их в стек, третья вытаскивает из стека 2 значения типа TVertex3D и строит по ним линию на чертеже. Вобщем довольно удобно, но нужно в рантайме проверять типы лежащие в "стеке".
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Опрос по реализации системы команд в программе

Сообщение Дож » 12.01.2015 17:45:30

Ты не так все понял. Не каких procedure GetPoint(MyCar) не предусмотрено. Это команда, а не процедура. Открой коммандную строку win/lin и вбей любую команду, тоже самое имелось ввиду. Как и откуда рождается команда в рамках темы не важно, это отдельная dll с обработкой команды и ее объявлением. У меня мысли расходятся в общем мнении по поводу вопроса "а что если надо будет получить результат чего то".


Чтобы сделать так, нужно хранить где-то отображение название->функция (массивом, хешом или другой коллекцией):
Код: Выделить всё
// этой функцией плагины регистрируют свои функции
procedure RegistFunc(const Name: PAnsiChar; Func: TGlobalFunc);
// получение функции по названию
function GetGlobalFunc(Name: PAnsiChar): TGlobalFunc;


Отдельный вопрос в том как объявить TGlobalFunc. Можно так:
Код: Выделить всё
type
  TGlobalFunc = function (Params: array of Const): Variant;

function GlobalCall(Name: PAnsiChar; Params: array of Const): Variant;
var
  Func: TGlobalFunc;
begin
  Func := GetGlobalFunc(Name);
  if Func = nil then
    // 'function Name not found' scenario
  Result := Func(Params);
end;


Итого, использование:
Код: Выделить всё
// плагин a
RegistFunc('a', @a);
// плагин b
RegistFunc('b', @b);

// Вызываем
GlobalCall('a', [1, GlobalCall('b', []), 'test']);
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Опрос по реализации системы команд в программе

Сообщение Sharfik » 12.01.2015 18:28:14

Дож писал(а):Чтобы сделать так, нужно хранить где-то отображение название->функция.............


Можно, а можно еще чтобы при загрузке у Dll проверялось наличие функции определенной, которой будут строку передавать. :) Если есть, то регистрировать имя и библиотеку как команду.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Опрос по реализации системы команд в программе

Сообщение zub » 13.01.2015 00:18:49

>>Если есть, то регистрировать имя и библиотеку как команду.
1dll=1"команда"? не стоит так делать, лучше 1dll=несколько схожих "команд". В зкаде сейчас ~140 "команд", с учетом что каждая длл тащит с собой копию rtl - набежит нехило "мусора"

>>Можно, а можно еще чтобы при загрузке у Dll проверялось...
независимо от подхода хранить соответствие имен-адресов всёравно надо
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Опрос по реализации системы команд в программе

Сообщение stanilar » 13.01.2015 05:04:54

Дож писал(а):отображение название->функция


Это отображение возникает при экспорте функций из DLL. Причем совместимо с проверкой компилятора. Мне непонятно зачем нужно реализовывать этот простой механизм таким странным способом.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Опрос по реализации системы команд в программе

Сообщение Sharfik » 13.01.2015 11:28:49

stanilar писал(а):Это отображение возникает при экспорте функций из DLL. Причем совместимо с проверкой компилятора. Мне непонятно зачем нужно реализовывать этот простой механизм таким странным способом.

5 раз читал, пытался понять смысл слов. Набор букв :shock:
При экспорте функции какое отображение? При экспорте функции получаем только адрес функции, который надо записать куда то и под именем хранить. В моем случае записывается имя базовой команды для dll и функция.
zub писал(а):>>Если есть, то регистрировать имя и библиотеку как команду.
1dll=1"команда"? не стоит так делать, лучше 1dll=несколько схожих "команд". В зкаде сейчас ~140 "команд", с учетом что каждая длл тащит с собой копию rtl - набежит нехило "мусора"

У тебя в зкад, как я понял, вообще библиотек нет. Все через unit сделал. Т.е. никто кроме тебя к твоей программе не может прицепить плагин, для этого его надо компилировать заново с программой. Даже база данных весьма изощренным способом сделана. И ты рассматриваешь dll с одной командой как одну команду, а я как группы команд у которых входная точка одна, а дальше как сделаешь. Из одной команды всегда можно через псевдоимена сделать три.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Опрос по реализации системы команд в программе

Сообщение zub » 13.01.2015 12:42:04

Плагины раньше, когда юзал делфи, были, сейчас только папка plugins и нерабочий механизм подключения dllок остались, убрал т.к. считаю что на данном этапе развития fpc это не реализуемо. Вернее реализуемо - но либо очень криво, либо на очень низком уровне. Сам механизм регистрации и использования 'команд' легко позволяет вернуться обратно на dll - буду их юзать если доживу до появления аналога bpl))
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Опрос по реализации системы команд в программе

Сообщение Sharfik » 13.01.2015 13:01:12

zub писал(а):Плагины раньше, когда юзал делфи, были, сейчас только папка plugins и нерабочий механизм подключения dllок остались, убрал т.к. считаю что на данном этапе развития fpc это не реализуемо. Вернее реализуемо - но либо очень криво, либо на очень низком уровне. Сам механизм регистрации и использования 'команд' легко позволяет вернуться обратно на dll - буду их юзать если доживу до появления аналога bpl))

Так вот зачем эта папка :) У меня все работает нормально, если не планировал в них загонять формы, то проблем не было бы. Хотя я и проблемы с формами обошел. Есть косяк только с такими вещами как всплывающие подсказки и popupmenu.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Опрос по реализации системы команд в программе

Сообщение stanilar » 13.01.2015 17:41:27

Sharfik писал(а): При экспорте функции получаем только адрес функции


Т.е. для вызовы функций ты пишешь нечто вроде такого: 1234567879^. Или ты пишешь название функции, а компилятор за тебя подставляет адрес?
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

След.

Вернуться в Общее

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

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

Рейтинг@Mail.ru