Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Pastushak
79899
Vladimir Pastushak  

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

Вот пример

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
12246
Ihor Herasko  
Vladimir Pastushak:

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

Вот пример

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

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

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

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

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

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

типа

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

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

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

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

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

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

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

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

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

Dmitry Fedoseev
46184
Dmitry Fedoseev  
Vladimir Pastushak:

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

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

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

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

Vladimir Pastushak
79899
Vladimir Pastushak  
Dmitry Fedoseev:
Описание структуры может быть за пределами класса (и  даже желательно). Но в классе могут быть объявлены члены с типом этих структур, и ничего передавать не придется.  
Дим если не сложно пример покажите, буду весьма признателен...
Dmitry Fedoseev
46184
Dmitry Fedoseev  
   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
7401
Alexey Kozitsyn  
Vladimir Pastushak:

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

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

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

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

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

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

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

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

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

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