Используете ли вы ООП в программировании на MQL4 и MQL5? - страница 8

 
Georgiy Merts:

Вы, наверное, не заметили static. static переменные доступны только в том модуле, в котором были объявлены.

 
pavlick_:

Вы, наверное, не заметили static. static переменные доступны только в том модуле, в котором были объявлены.

Static и модули тут друг другу не мешают. Любая переменная доступна только в том модуле, в котором объявлена. В данном случае - как я понял, на глобальном уровне.

А проблема этого static в том, что представь (давай на "ты"), что в своих модулях такую же переменную объявили все трое. При сливании кодов - эта переменная будет размещена в ОДНОЙ области памяти.

Static - это хороший инструмент, но использовать его надо с осторожностью.

 
А проблема этого static в том, что представь (давай на "ты"), что в своих модулях такую же переменную объявили все трое. При сливании кодов - эта переменная будет размещена в ОДНОЙ области памяти.
Это неправда. В каждом модуле будет свое объявление static переменной (возможно даже разных типов) и каждый модуль будет оперировать своей собственной, модификация которой не будет влиять на другие из других модулей. Вася пишет 1.c, Маша 2.c, никаких конфликтов там не будет.
 
pavlick_:
Это неправда. В каждом модуле будет свое объявление static переменной (возможно даже разных типов) и каждый модуль будет оперировать своей собственной, модификация которой не будет влиять на другие из других модулей. Вася пишет 1.c, Маша 2.c, никаких конфликтов там не будет.

Это если мы говорим о члене класса, причем, классы - называются по-разному. Но из представленного кода это не следует.

Видно, что объявлена глобальная перменная static-типа, значит, она будет занимать одно и то же место, хотя объявляться может в разных местах несколько раз.

И даже если это локальная переменная, объявленная в разных модулях - она также будет занимать одну и ту же область памяти.

Очередной раз убеждаюсь в необходимости венгерской нотации, и всемерного избегания глобальных переменных...  Скажем, в моей Лиге ТС только одна глобальная переменная CExpert eMainExpert; все остальные - только локальные или члены классов. Есть достаточно много static-членов класса, чаще всего это константы.

 
Georgiy Merts:

Это если мы говорим о члене класса, причем, классы - называются по-разному. Но из представленного кода это не следует.

Видно, что объявлена глобальная перменная static-типа, значит, она будет занимать одно и то же место, хотя объявляться может в разных местах несколько раз.

И даже если это локальная переменная, объявленная в разных модулях - она также будет занимать одну и ту же область памяти.

Очередной раз убеждаюсь в необходимости венгерской нотации, и всемерного избегания глобальных переменных...  Скажем, в моей Лиге ТС только одна глобальная переменная CExpert eMainExpert; все остальные - только локальные или члены классов. Есть достаточно много static-членов класса, чаще всего это константы.

Нет, ну не веришь мне, посмотри в сети. Ещё раз - static глобальные переменные из разных модулей не будут пересекаться. Если по умному - то у них внутреннее связывание

Linkage

A name that denotes object, reference, function, type, template, namespace, or value, may have linkage. If a name has linkage, it refers to the same entity as the same name introduced by a declaration in another scope. If a variable, function, or another entity with the same name is declared in several scopes, but does not have sufficient linkage, then several instances of the entity are generated.

The following linkages are recognized:

  • internal linkage. The name can be referred to from all scopes in the current translation unit.
Any of the following names declared at namespace scope have internal linkage:
  • variables, functions, or function templates declared static;
  • ...
 

Я считаю, глобальные переменные нужно хотя бы именовать так, чтобы в коде было понятно, что это глобальная переменная, а не локальная.  Я обычно использую префикс из двойного подчёркивания:   int __time;

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

 
pavlick_:


Советую посмотреть на себя в зеркало и задать такой вопрос: "кто я такой" и быть чуть-чуть поскромнее и не показывать свою безграмотность.

 
Andrei:

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

Ограничение доступа тоже миф, и это скорее несет вред чем пользу так как становится невозможно передавать переменные из одного класса в другой.

Был тут аргумент что бывает когда программист не трезв и может взять "не те" переменные, ну дык он может с таким же успехом попортить код в других местах.

Кому как?! Без плана даже трезвый архитектор не построит дом; что-нибудь да забудет?! Есть даже писатели, которые начинают писать свои романы без плана и эти романы не скончаемые и всегда просят продолжения в своем повествовании. Все предельно ограничено во времени и месте. Спросите множество людей о произошедшей ситуации и каждый ее будет описывать и дополнять по своему. Так что тут, все дело в психике и в отдельности - в сформированном характере человека. Кому как вздумается - пусть так и пишет. Его право.

 

ООП использую лишь в том случае, когда в системе программирования, например в MQL5, встроен уже готовый класс объектов и его удобно использовать в тексте своей пгм.

Я сам классы объектов не создаю. Потому что не хотел бы тратить время на выяснение, как это делать. Кроме того, я привык думать в парадигме (умное слово) процедурного программирования.

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

 
Georgiy Merts:

1. Как раз наследование для того и нужно, чтобы не держать в голове цепочку наследования.

2. И потом - как раз и ограничить доступ, чтобы не влезть и не испортить ничего.

Запросил интерфейс, в нем одни чисто виртуальные функции, ничего испортить нельзя.

1. Невозможно понять наследный класс без того чтобы знать что откуда взялось. Создается головная боль на пустом месте

2. Баги интерфейса добавляются к багам кода плюс код становится нечитаемым. Дайте такой код людям и увидите что все будут плеваться и чертыхаться.

Причина обращения: