библиотеки в маркет - как правильно готовить ?

 

ни разу пока не "испекал" библиотек (исключая тупой интерфейс к DLL) годных к распространению через Маркет, но почему-бы и нет...

отсюда пачка вопросов:

- судя по документации, нельзя чтобы API в параметрах принимал указатели, невзирая на то что внутри MQL,снаружи MQL и всё это указатели на экз.класса; То есть придётся порождать класс-хендер который должен "прятать" сей указатель ?

- как правильно делать интерфейсы : если ничего кроме "public:" юзера волновать не должно, как и куда упрятываются прочие поля ? Класс-конверт и делегирование ??

- как разруливаютcя (и разруливаются ли вообще) конфликты версий ? Если библиотека v2 стала несовместимой с v1 (интерфейсы поменялись) - по хорошему должнО чтобы у юзера были обе версии, но есть смутные сомнения, что это не так.

или правильно "забить на ОО и классы" и делать интерфейсы-заглушки а-ля Си ?? (а зачем тогда весь сыр-бор)

PS/ вообще хотелось-бы увидеть хороших практик по разработке библиотек MQL.

 
Maxim Kuznetsov:

- судя по документации, нельзя чтобы API в параметрах принимал указатели, невзирая на то что внутри MQL,снаружи MQL и всё это указатели на экз.класса; То есть придётся порождать класс-хендер который должен "прятать" сей указатель ? 

Внимательно прочитал правила. Кроме ограничений по использованию ДЛЛ и очевивидных - типа, не должен приносить вред, ничего такого не увидел.

Где это написано (про указатели)? Мож не докопался. 

 
Yuriy Asaulenko:

Внимательно прочитал правила. Кроме ограничений по использованию ДЛЛ и очевивидных - типа, не должен приносить вред, ничего такого не увидел.

Где это написано (про указатели)? Мож не докопался. 

в справке по директиве #import :

Так как импортируемые функции находятся вне компилируемого модуля, компилятор не может проверить правильность передаваемых параметров. Поэтому, во избежание ошибок выполнения, необходимо точно описывать состав и порядок параметров, передаваемых в импортируемые функции. Параметры, передаваемые в импортируемые функции (как из EX4, так и из DLL-модулей), могут иметь значения по умолчанию.

В импортируемых функциях в качестве параметров нельзя использовать:

·указатели (*);

·ссылки на объекты, содержащие динамические массивы и/или указатели.

В импортируемые из DLL функции нельзя передавать в качестве параметра классы, массив строк или сложные объекты, содержащие строки и/или динамические массивы любых типов.

 
Maxim Kuznetsov:

в справке по директиве #import :

ИМХО, для ех4-5 библиотек некритично (мы же о Маркете). Классы передавать можно, а все остальное через них решается. Даже проще получается класс передал, и весь импорт.)

ЗЫ С библиотеками тоже не работал. Но вроде, по описанию, так.

зы2 Надо, кстати, на днях попробовать. 

 
Yuriy Asaulenko:

ИМХО, для ех4-5 библиотек некритично (мы же о Маркете). Классы передавать можно, а все остальное через них решается. Даже проще получается класс передал, и весь импорт.)

ЗЫ С библиотеками тоже не работал. Но вроде, по описанию, так.

зы2 Надо, кстати, на днях попробовать. 

первые два вопроса сняты. Указатели на экземпляры использовать можно, но export/import классов и интерфейсы делаются немного через зад :-) https://www.mql5.com/ru/articles/362 и в особенности https://www.mql5.com/ru/forum/127

вкратце:

  • - делается класс публичного интерфейса (class Foo) в котором: конструкторы protected, а методы виртуальны
  • - в библиотеке от него производится приватный класс (class PrivateFoo: public Foo)
  • - из библиотеки экспортируются функции ( Foo *NewFoo(); ) которые будут служить заменой "new Foo", или надо строить фабрики
FIX: наследовать такое (делать производный класс) пользователь не сможет..
Используйте EX5-библиотеки для продвижения своих разработок
Используйте EX5-библиотеки для продвижения своих разработок
  • 2012.01.06
  • //www.mql5.com/ru/users/sergeev">
  • www.mql5.com
С помощью сокрытия реализации функций/классов в ex5-файл вы сможете делиться своими ноу-хау алгоритмами с другими программистами, создавать общие проекты и продвигать их в сети. И пока команда MetaQuotes всеми силами приближает возможность прямого наследования классов из ex5‑библиотек, мы реализуем данную возможность уже сейчас.
 
Maxim Kuznetsov:

 Указатели на экземпляры использовать можно, но export/import классов и интерфейсы делаются немного через зад :-) https://www.mql5.com/ru/articles/362 и в особенности https://www.mql5.com/ru/forum/127

вкратце:

  • - делается класс публичного интерфейса (class Foo) в котором: конструкторы protected, а методы виртуальны
  • - в библиотеке от него производится приватный класс (class PrivateFoo: public Foo)
  • - из библиотеки экспортируются функции ( Foo *NewFoo(); ) которые будут служить заменой "new Foo", или надо строить фабрики
FIX: наследовать такое (делать производный класс) пользователь не сможет..
))) Как раз сейчас сижу и варганю нечто в этом роде. Советник должен вызывать по таймеру функции класса из ех5 library. Пока не идет, но если есть наработки - бросаю и иду спать.))) Завтра докуем.)
 
Yuriy Asaulenko:
))) Как раз сейчас сижу и варганю нечто в этом роде. Советник должен вызывать по таймеру функции класса из ех5 library. Пока не идет, но если есть наработки - бросаю и иду спать.))) Завтра докуем.)

есть способ упрятать приватную часть в библиотеку и при этом дозволить пользователю наследовать класс. Через делегирование. Но это весьма криво и развивать поддерживать такие библиотеки будет то ещё удовольствие.

получилось так:

  • в публичном mqh делается "почти" абстрактный класс FooAbstract в котором: конструкторы protected, все методы виртуальны но вбиты заглушки, полей нет, к данным доступ исключительно через сетеры/гетеры
  • в библиотеке пишется реализация class FooCore:FooAbstract, конструкторы переезжают в public и на них пишется экспортируемая функция (на замену new FooCore)
  • далее опять в mqh делается наконец-то class Foo:FooAbstract с единственным полем FooAbstract *core куда вручную делегируются все методы.

теперь пользователь может производить классы от Foo :-) но есть конечно вопросы про память и скорость..

Файлы:
FooLib.mqh  2 kb
FooLib.mq4  2 kb
FooTest.mq4  1 kb
 
Maxim Kuznetsov:
Зачем protected конструкторы? Почему не банальная имплементация интерфейса?
 
Maxim Kuznetsov:

есть способ упрятать приватную часть в библиотеку и при этом дозволить пользователю наследовать класс. Через делегирование. Но это весьма криво и развивать поддерживать такие библиотеки будет то ещё удовольствие.

получилось так:

  • в публичном mqh делается "почти" абстрактный класс FooAbstract в котором: конструкторы protected, все методы виртуальны но вбиты заглушки, полей нет, к данным доступ исключительно через сетеры/гетеры
  • в библиотеке пишется реализация class FooCore:FooAbstract, конструкторы переезжают в public и на них пишется экспортируемая функция (на замену new FooCore)
  • далее опять в mqh делается наконец-то class Foo:FooAbstract с единственным полем FooAbstract *core куда вручную делегируются все методы.

теперь пользователь может производить классы от Foo :-) но есть конечно вопросы про память и скорость..

Я ночью отрабатывал нечто близкое к https://www.mql5.com/ru/articles/362. Вы меня вовремя остановили. )

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

Используйте EX5-библиотеки для продвижения своих разработок
Используйте EX5-библиотеки для продвижения своих разработок
  • 2012.01.06
  • //www.mql5.com/ru/users/sergeev">
  • www.mql5.com
С помощью сокрытия реализации функций/классов в ex5-файл вы сможете делиться своими ноу-хау алгоритмами с другими программистами, создавать общие проекты и продвигать их в сети. И пока команда MetaQuotes всеми силами приближает возможность прямого наследования классов из ex5‑библиотек, мы реализуем данную возможность уже сейчас.
 
Комбинатор:
Зачем protected конструкторы? Почему не банальная имплементация интерфейса?
лучше "перебдеть" - чтобы пользователь не ткул "obj = new AbstractClass"
 
Maxim Kuznetsov:
будет ошибка компиляции. Чисто виртуальные функции же есть.
Причина обращения: