Форум » Консультации по программированию » Структуры и классы » Ответить

Структуры и классы

Nize: Подобрался к изучению новых для меня типов данных, точнее, коле они появились, то думаю, что это упростит мне некоторые вещи, вот например типичная ситуация в моих кодах: Допустим есть набор входных параметров: input int i_StopLoss = 15; input int i_TakeProfit = 45; input int i_Slippage = 3; input int i_Space = 3; input i_Tolerance = 3; .......... Короче такой стандартный набор, который используется у меня в торговых скриптах и экспертах. Причем все значения я привык указывать в старых пунктах. И в каждом скрипте в теле программы мне приходится делать преобразование: во первых в теле программы объявлять каждый раз новые переменный типа StopLoss, TakeProfit .... и т.д., во-вторых, если котировки 5-знаков то все параметры надо умножать на 10. Для этого сейчас у меня написана простая библиотека mqh с функцией преобразования, но все-равно приходится прописывать ее в каждой программе. И еще неудобство в том, что порой в коде бывает много торговых или иных функций, и в каждую функцию во входных параметрах приходится передавать эти переменные. Можно конечно тупо сделать глобальные переменные например g_StopLoss, но думаю это как-то неказисто. Прочитал о структурах, но с ходу не понял нифига - сложно) Могут ли они мне помочь? Scriptong, я видел где-то в одной статье вы рассказывали о структурах с примерами, но я забыл в какой, подскажите чем можете

Ответов - 9

Scriptong: Nize пишет: Scriptong, я видел где-то в одной статье вы рассказывали о структурах с примерами, но я забыл в какой, подскажите чем можете О структурах я ни в одной из статей не писал. Возможно, Вы видели такую статью у другого автора. Nize пишет: Прочитал о структурах, но с ходу не понял нифига - сложно) Могут ли они мне помочь? Насколько они могут помочь в данном конкретном случае, не могу сказать, т. к. задача поставлена очень широко. По структурам же попытаюсь рассказать со своей колокольни. Возможно, мой вариант объяснения будет кому-то понятнее, чем стандартный. Структура - это объединение двух и более типов данных в виде одного типа данных. К примеру, если нам нужно описать человека или животное физиологически, то мы скажем, что он (оно) состоит из рук, ног, головы, туловища и хвоста. Причем для каждого существа количество того или иного органа разное. Тем не менее типы органов одинаковы. Чтобы не плодить для каждого существа кучу переменных, объединим нужные характеристики в структуру: struct Essence { int handCnt; // Кол-во рук int legCnt; // Кол-во ног int headCnt; // Кол-во голов ))) int bodyCnt; // Кол-во туловищ int tailCnt; // Кол-во хвостов }; Теперь нам не нужно создавать для каждого типа животного или человека по пять переменных. Достаточно указать: Essence man; // Характеристики человека Essence dog; // Характеристики собаки Essence monkey; // Характеристики обезьяны Здесь Essence - это тип данных, как int, double и т. п. Просто он более сложный, чем стандартный тип данных. А man, dog и monkey - имена переменных. Если бы делали это без структуры, то понадобилась бы простыня: int manHandCnt; int manLegCnt; int manHeadCnt; int manBodyCnt; int manTailCnt; int dogHandCnt; int dogLegCnt; int dogHeadCnt; int dogBodyCnt; int dogTailCnt; int monkeyHandCnt; int monkeyLegCnt; int monkeyHeadCnt; int monkeyBodyCnt; int monkeyTailCnt; Чтобы заполнить все характеристики человека, потребуется сделать так: man.handCnt = 2; man.legCnt = 2; man.bodyCnt = 1; man.headCnt = 1; man.tailCnt = 0; или при объявлении переменной можно сделать так: Essence man = {2, 2, 1, 1, 0}; Структуры позволяют более компактно записывать многие моменты, облегчая понимание кода. Наибольшая польза от структур там, где из однотипного набора переменных требуется создавать массивы. Возвращаясь к примеру с существами, представим, что нужно описать сотни людей, собак и обезьян. Без структур нам потребуется заводить пять отдельных массивов для каждого из существ, т. е. получим 15 массивов, о которых нужно помнить, что они должны быть синхронизированы. Со структурами это решается проще: Essence man[100]; И вот мы уже можем описывать 100 человек! Еще одно удобство структур - передача данных. Со структурой можно передать много характеристик одним махом - одной переменной, в то время как без нее нужно было бы передавать в функцию надцать переменных. Применительно к торговле структуры чаще всего используются для описания параметров ордеров. К примеру, если нужно сохранить информацию о нескольких ордерах, то объявляется не четырнадцать массивов, а один массив определенного типа: struct OrderInfo { double openPrice; double slPrice; double tpPrice; double volume; double swap; double commission; double profit; datetime openTime; datetime expiration; int magicNumber; int ticket; int type; string symbol; string comment; }; OrderInfo orderInfo[10]; orderInfo - это массив из 10 элементов, каждый из которых состоит из набора характеристик ордера, сведенных в один тип данных - OrderInfo.

Nize: Спасибо большое за доступное изложение, но это я немного перепутал, имел ввиду не структуру а классы, а как раз в структуру я врубился там ничего сложного, просто совмещение разных типов - удобно. С классами вот непонятки, это получаются как своебразные функции, вот и думаю запихать в класс нужные мне преобразования, реально? И я точно помню где-то на этом сайте была статья с примерами про классы)

Scriptong: По классам, действительно, сложнее. И в рамках какой-то одной статьи всех нюансов не описать. По этой теме пишут целые книги. Если же не углубляться в детали, а дать поверхностную картину, то можно сказать следующее. Классы - это структуры с функциями (функции в классах называют методами класса). То есть класс объединяет в себе не только данные, но и способ управления ими. В простых задачах классы, чаще всего, бесполезны. Намного эффективнее простые задачи решаются обычным процедурным методом. Преимущество классов не в скорости выполнения программ (в этом компоненте тоже может наблюдаться проигрыш, хотя и небольшой - зависит от компилятора), а в удобстве представления данных, которое позволяет одному человеку контролировать большие проекты. Именно поэтому объектно-ориентированное программирование (ООП) прочно вошло в жизнь. При использовании ООП большая задача разбивается на множество мелких задач, для каждой из которых создается отдельный класс. Далее происходит взаимодействие между классами. Причем, в отличие от процедурного метода, каждый класс настолько отвечает за свои данные, что один класс попросту не имеет права изменять данные, принадлежащие другому классу. Именно это и было бичом процедурного метода: множество глобальных переменных, которые могли бесконтрольно менять свое значение в любом месте программы. Вот, к примеру, есть два класса: class AClass { int m_classAValue; public: void SetAValue(int value) { m_classAValue = value;} int GetAValue(void) const { return m_classAValue;} }; class BClass { int m_classBValue; public: void SetBValue(int value) { m_classBValue = value;} int GetBValue(void) const { return m_classBValue;} }; Класс AClass и класс BClass хранят только по одной переменной типа int, а их методы обеспечивают установку и получение этого значения. Смысл же обоих этих классов в том, что для записи или чтения хранимого значения необходимо обратиться к другом классу за разрешением - вызвать метод Set или Get: BClass bClass; bClass.SetBValue(5); int bValue = bClass.GetBValue(); В этом примере создается "переменная" типа BClass. В итоге создается целый объект, включающий в себя два метода и одну переменную. Сначала этой переменной присваивается значение 5, а потом это значение считывается в локальную переменную. В процедурном методе эти действия записывались бы в одну строку : int bValue = 5; Для демонстрации преимуществ ООП простыми примерами не обойтись.


Nize: Scriptong пишет: Для демонстрации преимуществ ООП простыми примерами не обойтись. Ага, вот и я кумекаю как оно может жизнь облегчить а кроме усложнения обращения к функциям и получения данных не вижу пока для себя ничего путного, наверно нет у меня пока таких проектов. Но в целом что я понял, что как-бы несколько функций объединяются в один тип класса

Scriptong: Nize пишет: Но в целом что я понял, что как-бы несколько функций объединяются в один тип класса Это уже немало Получается, что Вы усвоили понятие инкапсуляции - объединение данных и методов. Дальше нужно говорить о таких свойствах классов как наследование и полиморфизм. Наследование - это в буквальном смысле создание потомка на основе родителя. То есть, создав один класс, можно на его основе создать другой класс. У родителя и потомка в итоге обязательно будут одинаковые методы и данные, но у потомка могут быть какие-то свои личные методы и данные. Чтобы проще понять это, представьте, что смотрите на Луну. Все, что видно на ней невооруженным глазом - это состав родителя (желтый круг со светлыми и темными участками). Взяв бинокль, можно увидеть, что Луна состоит из морей и материков - это состав первого потомка. Используя телескоп, получаем следующую степень детализации - горы, кратеры, впадины. Это потомок класса-родителя, который уже почти не похож на своего предка. И так далее - все больше новых деталей до такой степени, что родитель вовсе перестает угадываться в потомке. Тем не менее, класс потомка остается совместим с классом родителя, что позволяет обращаться к нему точно также, как к родителю. Полиморфизм - это возможность изменения логики одного или нескольких методов у потомка. При этом методы называются одинаково. К примеру, если у родителя метод GetValue(int a, int b) возвращал произведение значений а и b, то у потомка метод с этим же именем может возвращать сумму этих величин.

Nize: падаю ниц в ужасе что придумали демоны) насколько был гибок и удобен старенький ANSI C без этих ООП, пожалуй я лучше останусь в древнем мире)

Scriptong: Nize пишет: пожалуй я лучше останусь в древнем мире Да, на первый взгляд сложно. Но, разобравшись, уже не представляешь себе программу без ООП. Я за собой уже стал замечать, что даже простые программы пишу только в таком виде. Но это очень помогает при разработке больших программ. В качестве одного из простых примеров применения ООП посмотрите код индикатора TicksCollector (здесь). В нем ООП уже имеет смысл, т. к. там необходимо иметь возможность работы с тремя подобными сущностями (график нестандартного ТФ, график равновысоких свечей и эквиобъемный график).

Nize: да, еще я нашел ту статью это "ассиметрия и объем" там были разобраны классы, всегда же проще на примерах понимать о чем речь. Прочитал некоторые статьи в инете, и понял что я не одинок, наверно некоторым людям не дано понять прелести ООП, я всегда был ближе к низкоуровневому программированию, мне логику кода на асме прочесть проще) Вот, например Ваши коды мне сложно читать, они через чур дробленые и даже маленькое действие засунуто в отдельную процедуру, например сравнение 2-х чисел. Я же засовываю в функцию более широкий набор действий для вычислений и выполнения определенных задач, ну и стараюсь ее унифицировать для дальнейших обращений. Грубо говоря у меня на входе "руки ноги", а на выходе функции " готовый человек", а у Вас стиль иной - на входе "руки ноги" и что-б собрать человека надо еще унаследовать какие-то полу-части, полиморфизировать и в конечном счете собрать)) как-то так. Наверно это примитивно у меня, но зато легко читаемо. Вероятно нужен опыт и стаж и со временем захочется все дробить и наследовать, в принципе я уже сейчас замечаю такое за собой)

Scriptong: Nize пишет: да, еще я нашел ту статью это "ассиметрия и объем" там были разобраны классы, всегда же проще на примерах понимать о чем речь. Разобраны - слишком громко сказано. В статье приведено лишь одно преимущество классов и то для конкретного частного случая. Тема, действительно, шире. С наскока ООП не берется. Это принципиально другой способ программирования, для которого приходится долго перестраивать свое мышление. Nize пишет: у Вас стиль иной В принципе, у каждого программиста свой стиль. Это легко объясняется: способы мышления у разных людей отличаются друг от друга, а средств для достижения одной и той же цели в программировании бесчисленное множество. И никогда нельзя объективно указать, какой из способов лучше.



полная версия страницы