Скачать MetaTrader 5

Вопрос по разделению кода

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Знаете ли вы, что MQL5 способен создавать собственные графические инструменты?
Vladimir Pastushak
68855
Vladimir Pastushak 2016.02.17 08:41 

Как разбить код на части и включаемые файлы правильно, первый раз с таким сталкиваюсь по этому задаю вопрос к опытным спецам

Вот пример

class WL : public C_Object
  {
private:
   MqlTick           tick;
   struct STRUCT_SYMBOL // Структура символа
     {    
      bool              TRADING_IS_ALLOWED;      // Обновлять
      double            INDIKATOR_VOLUME;        // Обновлять
     };
   struct STRUCT_WATCH_LIST // Структура сохраненных листов
     {
      string            NAME_LIST;
     };
   STRUCT_WATCH_LIST WatchList[];
   STRUCT_SYMBOL     SymbolMass[];
}

ТО есть класс наследуется от другого класса  и содержит структуру, в примере структуру я сократил, далее идут методы по работе с массивом структуры

этих методов штук 40-50 может больше пока не знаю.

Хочу каждый метод Вынести во включаемый файл или иначе как то организовать структуру кода что бы в самом советнике не городить 10 000 -20 000 строк кода в которых потом затруднен поиск.

Единственное что на текущий момент вижу это отправлять массив структуры по ссылке

типа

func(STRUCT_SYMBOL & str)

Мне кажется это не самый удачный выбор.

Что можно сделать ?

Ihor Herasko
9046
Ihor Herasko 2016.02.17 09:12  
Vladimir Pastushak:

Как разбить код на части и включаемые файлы правильно, первый раз с таким сталкиваюсь по этому задаю вопрос к опытным спецам

Вот пример

ТО есть класс наследуется от другого класса  и содержит структуру, в примере структуру я сократил, далее идут методы по работе с массивом структуры

Зачем структура объявлена в теле класса? Ведь она в таком случае не будет доступна вне этого класса. Объявление структуры лучше вынести в какой-то включаемый файл, доступ к которому будет  из любого другого участка кода.

этих методов штук 40-50 может больше пока не знаю  

Хочу каждый метод Вынести во включаемый файл или иначе как то организовать структуру кода что бы в самом советнике не городить 10 000 -20 000 строк кода в которых потом затруднен поиск.

Методы класса лучше располагать в одном включаемом файле. В VS это файл реализации (cpp), а в MQL аналог заголовочного файла (в VS - h) и файл реализации тогда уж можно объединить в один файл. Чтобы уменьшить размер файла реализации в идеале все методы сводятся к одной-двум строкам, которые вызывают различные утилиты. А вот для утилит - собственные включаемые файлы (утилиты для работы со строками, для работы с графикой, для работы с файлами и т. д.)

 Единственное что на текущий момент вижу это отправлять массив структуры по ссылке 

типа

Мне кажется это не самый удачный выбор.

Что можно сделать ?

Как раз наоборот - все структуры и массивы лучше передавать по ссылке. Если метод не должен изменять данные в структуре/массиве, то тогда и ссылка должна быть константной.
Vladimir Pastushak
68855
Vladimir Pastushak 2016.02.17 09:16  
Ihor Herasko:

Зачем структура объявлена в теле класса? Ведь она в таком случае не будет доступна вне этого класса. Объявление структуры лучше вынести в какой-то включаемый файл, доступ к которому будет  из любого другого участка кода.

Методы класса лучше располагать в одном включаемом файле. В VS это файл реализации (cpp), а в MQL заголовочный файл (h) и файл реализации тогда уж можно объединить в один файл. Чтобы уменьшить размер файла реализации в идеале все методы сводятся к одной-двум строкам, которые вызывают различные утилиты. А вот для утилит - собственные включаемые файлы (утилиты для работы со строками, для работы с графикой, для работы с файлами и т. д.)

Как раз наоборот - все структуры и массивы лучше передавать по ссылке. Если метод не должен изменять данные в структуре/массиве, то тогда и ссылка должна быть константной.

Правильно ли я понял, что лучше все структуры вынести за пределы класса, в отдельный инклюдник ?

И при работе с методами передача структуры по ссылке не затруднит работу кода, и не повлияет на скорость работы ?

Мне бы простой пример если не сложно...

Dmitry Fedoseev
42905
Dmitry Fedoseev 2016.02.17 09:20  
Vladimir Pastushak:

Правильно ли я понял, что лучше все структуры вынести за пределы класса, в отдельный инклюдник ?

И при работе с методами передача структуры по ссылке не затруднит работу кода, и не повлияет на скорость работы ?

Мне бы простой пример если не сложно...

Описание структуры может быть за пределами класса (и  даже желательно). Но в классе могут быть объявлены члены с типом этих структур, и ничего передавать не придется.  

Vladimir Pastushak
68855
Vladimir Pastushak 2016.02.17 09:21  
Dmitry Fedoseev:
Описание структуры может быть за пределами класса (и  даже желательно). Но в классе могут быть объявлены члены с типом этих структур, и ничего передавать не придется.  
Дим если не сложно пример покажите, буду весьма признателен...
Dmitry Fedoseev
42905
Dmitry Fedoseev 2016.02.17 09:22  
   struct STRUCT_SYMBOL // Структура символа
     {    
      bool              TRADING_IS_ALLOWED;      // Обновлять
      double            INDIKATOR_VOLUME;        // Обновлять
     };
   struct STRUCT_WATCH_LIST // Структура сохраненных листов
     {
      string            NAME_LIST;
     };

class WL : public C_Object
  {
private:
   MqlTick           tick;

   STRUCT_WATCH_LIST WatchList[];
   STRUCT_SYMBOL     SymbolMass[];
}
Alexey Kozitsyn
6421
Alexey Kozitsyn 2016.02.17 09:24  
Vladimir Pastushak:

Правильно ли я понял, что лучше все структуры вынести за пределы класса, в отдельный инклюдник ?

И при работе с методами передача структуры по ссылке не затруднит работу кода, и не повлияет на скорость работы ?

Мне бы простой пример если не сложно...

Если Вы имеете дело со структурой, которая потенциально может быть использована в другом классе - желательно вынести. 

Вы не сможете передать ни структуру, ни массив в функцию/метод по значению. Только по ссылке. 

Да, в качестве примера, можете посмотреть структуру стандартной библиотеки mql. 

Vladimir Pastushak
68855
Vladimir Pastushak 2016.02.17 09:25  
Dmitry Fedoseev:
Большое спасибо, я понял, в моем случае работа должна быть с одним массивом структур, в Вашем примере если я правильно понял в каждом экземпляре класса будет создаваться индивидуальный массив структур.
Vladimir Pastushak
68855
Vladimir Pastushak 2016.02.17 09:26  
Alexey Kozitsyn:

Если Вы имеете дело со структурой, которая потенциально может быть использована в другом классе - желательно вынести. 

Вы не сможете передать ни структуру, ни массив в функцию/метод по значению. Только по ссылке. 

Да да, я в курсе про передачу массивов и структур а так же объектов.. Спасибо !
Dmitry Fedoseev
42905
Dmitry Fedoseev 2016.02.17 09:26  
Vladimir Pastushak:
Большое спасибо, я понял, в моем случае работа должна быть с одним массивом структур, в Вашем примере если я правильно понял в каждом экземпляре класса будет создаваться индивидуальный массив структур.
Нет. В вашем случае тоже индивидуальные для каждого экземпляра создаются.
Dmitry Fedoseev
42905
Dmitry Fedoseev 2016.02.17 09:27  
Раскидать методы по файлам тоже можно. Методы же могут располагаться за пределами тела класса. Значит вместо метода пишем include... а код в файл.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий