Скачать MetaTrader 5

Передача параметров или глобальные переменные

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Maria Baburina
2575
Maria Baburina  
Когда пишу код, стою перед выбором: прописать несколько глобальных переменных вначале и потом их использовать в любом месте кода или в отдельных частях/функциях объявлять новые переменные, а потом воспользоваться передачей параметров, т.е. в каждой отдельной функции пользоваться своими переменными. Какие преимущества можно выделить у того и другого способа? Особенно относительно производительности.
Комбинатор
16033
Комбинатор  
Marys_fals:
Чем локальней, тем лучше.
Vladimir Zubov
4430
Vladimir Zubov  
Лучше новые объявить переменные и корректнее и на будущие билды лучше. Код живучее будет, по опыту)
Artyom Trishkin
Модератор
77518
Artyom Trishkin  

Как "правило хорошего тона": каждая функция использует свои локальные переменные для получения входных данных, и возвращает какой-либо результат. Вот этот результат можете присвоить глобальной переменной. Ну и передачу параметров по ссылке ещё никто не запрещал. Это позволит вернуть из функции несколько различных результатов, даже разных типов.

Таким образом, функция будет "универсальным кирпичиком" для построения совершенно разных логических конструкций.
И ещё: никто не запрещает перегрузку функций: несколько функций с одним названием, но с различными входными параметрами, как по количеству, так и по типу.

Всё для вашего удобства ;)

George Merts
3747
George Merts  

Marys_fals, на мой взгляд, глобальных переменных надо всемерно избегать.  Их минусы хорошо расписаны в букварях. Из того, что помню:

  • Когда видишь глобальную переменную, даже при ее хорошем названии далеко не всегда можно понять, где она меняется, какие участки кода могут на нее влиять.
  • И наоборот, трудно понять, на какие участки кода отразится изменение глобальной переменной.
  • Как следствие - если ошибка затрагивает глобальную переменную - ее очень трудно отловить, поскольку она начинает влиять сразу на многие места программы.
  • Сложность повторного использования кода. Правильно написанный класс легко переносится в другой проект. Если же он использует глобальные переменные, их приходится "тянуть" за ним, и есть велика опасность, что придется тянуть и другие участки кода.
  • Затрудняется тестирование отдельных классов, поскольку не всегда можно отследить, все ли используемые глобальные переменные проинициализированы верно.

Вот, примерно так.

Производительность работы, на мой взгляд, мало зависит от того, глобальные или локальные переменные используются (конечно, если передача параметров не порождает собой выделения огромных блоков памяти)

Maria Baburina
2575
Maria Baburina  
Поняла, всем спасибо!)
Alexey Volchanskiy
17142
Alexey Volchanskiy  
Marys_fals:
Когда пишу код, стою перед выбором: прописать несколько глобальных переменных вначале и потом их использовать в любом месте кода или в отдельных частях/функциях объявлять новые переменные, а потом воспользоваться передачей параметров, т.е. в каждой отдельной функции пользоваться своими переменными. Какие преимущества можно выделить у того и другого способа? Особенно относительно производительности.

Как бывший embedded программист, много программировал на ассемблере и немного в курсе, как компилятор генерит машинный код функци. Конечно, при любой передаче параметров, хоть по ссылке, хоть напрямую происходят дополнительные операции по упаковке-распаковке этих параметров. Я разрабатывал критичные по скорости приложения, так что старались для критичных по таймингу функций делать переменые глобальными и вообще переписывали их на ассемблере, т.к. компилятор всегда вставляет в функцию дополнительный код, пролог и эпилог. Думаю, у MQ все примерно так же.

С другой стороны, а оно того стоит? Мусорная куча глобальных переменных не есть гуд, а прирост в скорости обычно очень незначителен, конечно, если тело функции не a=b+c; Но для таких простых функций вообще проще использовать макросы с параметрами.

Короче, надо смотреть по ситуации.

P.S Кстати, доступ к полям структуры или класса всегда медленнее, чем просто к набору таких же переменных. Ну и что? Я использую классы, это удобно и переносимо, и чихать мне на эти доли процента быстродействия, проще новый комп купить ))

Maria Baburina
2575
Maria Baburina  
VDev:

Как бывший embedded программист, много программировал на ассемблере и немного в курсе, как компилятор генерит машинный код функци. Конечно, при любой передаче параметров, хоть по ссылке, хоть напрямую происходят дополнительные операции по упаковке-распаковке этих параметров. Я разрабатывал критичные по скорости приложения, так что старались для критичных по таймингу функций делать переменые глобальными и вообще переписывали их на ассемблере, т.к. компилятор всегда вставляет в функцию дополнительный код, пролог и эпилог. Думаю, у MQ все примерно так же.

С другой стороны, а оно того стоит? Мусорная куча глобальных переменных не есть гуд, а прирост в скорости обычно очень незначителен, конечно, если тело функции не a=b+c; Но для таких простых функций вообще проще использовать макросы с параметрами.

Короче, надо смотреть по ситуации.

P.S Кстати, доступ к полям структуры или класса всегда медленнее, чем просто к набору таких же переменных. Ну и что? Я использую классы, это удобно и переносимо, и чихать мне на эти доли процента быстродействия, проще новый комп купить ))

Спасибо))
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий