Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью. Получи вознаграждение!
Maria Baburina
1665
Maria Baburina 2015.04.06 22:36 
Когда пишу код, стою перед выбором: прописать несколько глобальных переменных вначале и потом их использовать в любом месте кода или в отдельных частях/функциях объявлять новые переменные, а потом воспользоваться передачей параметров, т.е. в каждой отдельной функции пользоваться своими переменными. Какие преимущества можно выделить у того и другого способа? Особенно относительно производительности.
Комбинатор
15652
Комбинатор 2015.04.06 23:45  
Marys_fals:
Чем локальней, тем лучше.
Vladimir Zubov
3461
Vladimir Zubov 2015.04.07 00:58  
Лучше новые объявить переменные и корректнее и на будущие билды лучше. Код живучее будет, по опыту)
Artyom Trishkin
69150
Artyom Trishkin 2015.04.07 01:26  

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

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

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

George Merts
3325
George Merts 2015.04.07 05:41  

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

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

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

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

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

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

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

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

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

Maria Baburina
1665
Maria Baburina 2015.04.08 13:55  
VDev:

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

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

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

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

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