Тимофей Мартынов
Тимофей Мартынов Рецензии на книги
11 декабря 2012, 21:28

Изучаю программирование на C#. Мысли.

Решил факультативно изучить язык программирования C#.

Цель?
  • Автоматизировать выполнение ряда задач по трейдингу.
  • Преодолеть панический страх перед программированием.
  • Иметь возможность самостоятельно писать скрипты для WealthLab, TSLab.

Изучаю программирование на C#. Мысли.

Сразу скажу, что мозг у меня абсолютно гуманитарный и творческий, нежели системно-технический. Хоть я и учился на Факультете Технической Кибернетики, и что-то то там линейное несложное в университете программировал, откровенно говоря после защиты диплома я даже не совсем понимал суть объектно-ориентированного программирования. Университет скорее не научил меня, а привил панический страх к программированию и уверенность в том, что это нереально просто для меня освоить что-то такое.

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

Должен сказать, что изучение даже этой, наверное, самой достурной и лоховской книжки по изучению языка C# заставляет мой мозг кипеть, как  не кипел он уже давно. Хотя с другой стороны, это особое удовольствие — получать кайф от интеллектуальной нагрузки, после того как твой мозг дремал последние лет 6.

Я вдумчиво прочел 220 страниц этой книги (из 700), реализовал на C# 19 программ, примеры которых описаны в книге. 

Чему я успел научиться?
  • чуть-чуть начал понимать суть ООП.
  • освоил понятие классов, экземпляров, методов.
  • отличие метода от поля
  • ссылки на объекты
  • вкурил в прелесть Visual Studio по созданию визуальных интерфейсов под винды
  • чуть-чуть начал врубаться как софт взаимодействует с БД
  • проверка условий, и операторы цикла — все как везде, даже ничего нового не обнаружил
  • повторил типы переменных
  • реализация массивов данных
  • дошел до инкапсуляции и немного встрял
Вообще конечно «набегом» осваивать книжку не получается. Прежде чем перейти к следующей теме, стараюсь полностью разобраться с предыдущей, хотя это может занимать целый день.

Щя вот дошел до темы «инкапсуляция при помощи свойств». Час смотрю на текст кода и не могу врубиться что к чему:)) Может просто устал.

Просто смотрю и не могу понять, зачем это:))
Изучаю программирование на C#. Мысли.


Оставил этот пример, двинул дальше.

Дальше идет следующая строчка:

public int BagsOfFeed { get; private set; }
public int FeedMultiplier { get { return FeedMultiplier; } }

здесь уж у меня совсем ступор. Не могу понять, что эти get и set делают, что это такое и как они здесь оказались.

 
76 Комментариев
  • VpnS
    11 декабря 2012, 21:34
    это свойства класса.
    используются как правило для заполнения/считывания private полей класса, т.е. для безопасности.
    хотя и без них можно прожить.
  • Максим Макаров
    11 декабря 2012, 21:34
    Инкапсуляция — способность прятать детали реализации объектов от пользователей этих объектов. За счет инкапсуляции программирование становится: проще: вам нет необходимости беспокоиться об огромном количестве строк кода, которые выполняют свою задачу, скрыто от вас. Все, что от вас требуется — создать экземпляр нужного класса и передать ему необходимые сообщения.
    С философией инкапсуляции тесно связан еще один принцип — сокрытия всех внутренних данных (то есть переменных-членов) класса. Как мы уже говорили, в идеале все внутренние переменные члены класса должны быть определены как private. В результате обращение к ним из внешнего мира будет возможно только при помощи открытых функций — членов. Такое решение, помимо всего прочего, защищает вас от возможных ошибок, поскольку открытые данные очень просто повредить…
  • siva
    11 декабря 2012, 21:37
    Обращаешься к элементам класса не напрямую, а через свойства. Что тут непонятного-то? :)
      • siva
        11 декабря 2012, 21:41
        Тимофей Мартынов, отдохни тогда. Это ещё самое начало же, лучше все понять сразу.
        Я вот ООП вообще не изучал никогда, только в универе спал на лекциях этих, но вроде как все понимаю :)
  • VpnS
    11 декабря 2012, 21:38
    вот из вики пример

    class MyClass
    {
    private int p_field;
    public int Field
    {
    get
    {
    return p_field;
    }
    private set
    {
    p_field = value;
    }
    }
    }
      • siva
        11 декабря 2012, 21:42
        Тимофей Мартынов, ты не сможешь изменить p_field извне, так как private. Почитай про public, private, protected :)
          • siva
            11 декабря 2012, 22:09
            Тимофей Мартынов, уже знаешь как делать экземпляры класса?
              • siva
                11 декабря 2012, 22:18
                Тимофей Мартынов, farmer farm = new farm();
                дальше в завимости от «открытости»/«закрытости»
                x1 = farm.variable1; (тут get)
                farm.variable1 = 5; (тут set)

                конкретно для примера:

                Farmer farm = new farm();
                Console.WriteLine(farm.BagsOfSeed); //вернет что-то, в примере 0 скорее всего )))

                НО!!! написать farm.BagsOfSeed = 5; — ошибка, так как private set (только из класса)
                • siva
                  11 декабря 2012, 22:24
                  Станислав Иванов, дальше сам, это самые азы. Нужно самому въезжать. Посмотри на ютубе видео по теме, там америкосы все по полочкам разложат.
      • VpnS
        11 декабря 2012, 21:48
        Тимофей Мартынов, ты не можешь обратиться к private полю вне класса, так как он будет невиден.
        только через set, get методы свойства.

        MyClass mc = new MyClass();

        mc.Field = 5; // так задали значение, то есть теперь у поля p_field значение 5

        int myExample = mc.Field; // так считали свойство, то есть мы считали private поле p_field
          • VpnS
            11 декабря 2012, 22:07
            Тимофей Мартынов, нужно задать в свойствах класса что хочешь делать

            private int p_field;
            private int k_field;

            public int Field
            {
            get
            {
            return p_field/k_field;
            }
            private set
            {
            p_field = value;
            k_field = 5*value;
            }
            }
            }
      • Изя 3%
        11 декабря 2012, 21:48
        Тимофей Мартынов, вместо прямого обращения к переменной (член класса) ты вызываешь метод класса. это позволяет выстроить семантику работы с членами класса. скажем читать можно изменять нельзя и тп.
  • Можно на семинар к Марсель Тазетдинов
  • Иван Константинов
    11 декабря 2012, 21:47
    Насколько я понимаю, ты начал почти с нуля? т.к. все давно забыл?
    Как тебе эта книжка для начинающего с нуля? доступно там все или расчитано всетаки на тех, кто уже что-то знает из других языков програмирования?
    Хочу тоже начать учить C# но все незнаю с какой стороны к нему подступиться… уже раза 3 пытался всякими способами :-)
      • Иван Константинов
        11 декабря 2012, 21:49
        Тимофей Мартынов, Вот и отлично! почитаем значит :-) надеюсь эта попытка будет успешна ;-) благо новый год на носу… времени будет масса…
  • jtrade
    11 декабря 2012, 21:53
    абсолютно поддерживаю!
    • jtrade
      11 декабря 2012, 21:55
      jetta, ООП — нужно с этим разобраться. Хотя, по мне Шилдт первый букварь…
      • jtrade
        11 декабря 2012, 22:00
        jetta, кстати, можно было бы сделать на сайте поддержку c# кода для вставки.
  • skatino
    11 декабря 2012, 21:54
    освоить 220 страниц… мая в акуе. большое тебе уважение.

    зы. у меня больше 15 никогда не получалось
    ззы. мне кажется ты слишком издалека начал. тебе нужно прикладное программирование. на твоем месте я бы начал с S#. разобрал бы на примере простого робота. а потом еще, и еще. а уж потом С# если понадобится
    • skatino, вы знаете что такое S и C шарп????
      и откуда ноги растут, или так от балды откомментили?
      • skatino
        11 декабря 2012, 22:12
        Профессор Преображенский, знаю…
        Первые свои программы начал писать в 1993 году, пишу до сих пор
    • jtrade
      11 декабря 2012, 22:01
      skatino, соглашусь с Профессор Преображенский, это разные вещи…
  • Максим Макаров
    11 декабря 2012, 22:02
    Обращаясь к переменной через свойства класса можно избежать ошибок которые бы возникали при прямом обращении.
    Можно при присвоении значения переменной проверять ее на вхождение в область допустимых значений. Можно блокировать ее чтение из других потоков или еще что-то…
  • Руслан
    11 декабря 2012, 22:05
    Тимофей, а я то думаю почему ты похудел и синяки под глазами большие… оказывается ты просто превращаешься в программиста :)
  • A2
    11 декабря 2012, 22:05
    Тимофей Мартынов тут все просто, когда-то, когда C# не было, но было OOP, доступ к атрибуту класса извне ты бы сделал как 1 процедура (установить новое значение атрибута с 1 параметром без возвращаемого значения) и 1 функция (получить текущее значение, без параметров). Так вот свойство и ест неявно заданные эти вещщи: геттер и сеттер, просто синтаксический сахар
  • Амадей_МФ
    11 декабря 2012, 22:09
    80% изученной информации не понадобится, чтобы учиться писать скрипты для Велз-лаб надо именно их и писать

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

    Думаю «Станислав в шапке» подтвердит :))
      • skatino
        11 декабря 2012, 22:15
        Тимофей Мартынов, глупо…
        Время ограничено. Зачем растить дерево, когда можно использовать готовый брус?
      • VpnS
        11 декабря 2012, 22:22
        Тимофей Мартынов, я думаю, что свойства тебе в ботах не понадобятся
      • VpnS
        11 декабря 2012, 23:58
        Тимофей Мартынов,

        изучай для начала:
        — events
        — ADO.Net
        — работа с ddl
      • Creed
        12 декабря 2012, 01:22
        Тимофей Мартынов, рекомендую посмотреть видео обучение по C#: smart-torrent.org/plus-plus/m10266-programmirovanie-ispolzovaniem-microsoft-net-framework-t10330.html
    • siva
      11 декабря 2012, 22:22
      Амадей_МФ, принцип парето, собака!!! :)
      Вообще, пусть читает книгу. Оно всегда пригодится. Потом в плохие годы (кризисные) если что — пойдет разработчиком junior-ом за 20 тысяч рублей, а если хорошо изучит книгу, то возьмут может и на 30 сразу :)
      Не обижайся тока тимофей, но один умный дядя сказал мне, что «программирование — второй хлеб».
      • secondi
        12 декабря 2012, 13:51
        Станислав Иванов, з/п программеров будут снижаться, когда их станет как юристов, а это очень скоро произойдет, имхо.
        • siva
          12 декабря 2012, 14:34
          secondi, оставлю без комментария это.
  • skatino
    11 декабря 2012, 22:59
    кста… знание языка это только 30% на пути к успеху…
    еще 30% — это идея и 30% — сами алгоритмы.

    10% оставим на удачу :)
  • athlant64
    11 декабря 2012, 23:06
    Тимофей, так вот зачем уходишь с РБК? Ведь изучение программинга занимает уйму времени а работа это время отнимает! Я тебя прекрасно понимаю!

    А что там с CFA? Получил сертификат уже?
  • Евгений
    11 декабря 2012, 23:20
    Книжку брось, от нее толку мало будет. Попробуй сначала сделать то, что тебе необходимо на каком-нибудь QPILE, когда сделаешь, лучше будешь понимать то, что тебе нужно изучать. Если ты не собираешься сам писать HFT, тебе не понадобятся классы, наследование, инкапсуляция и особенно полиморфизм, можно обойтись без них.
    Решай свои реальные задачи.
    • А. Г.
      11 декабря 2012, 23:49
      Евгений (evus),

      +5. Я вообще обхожусь консольными приложениями и не собираюсь углубляться в изучение перечисленных Вами разделов С#. Лучше для начала изучить работу с Trans2Quik.dll и построить робота по выставлению заявок для начала в Quik. Потом можно подумать и над другими протоколами обмена с биржей — я вот фиксом планирую заняться, так как он, говорят, универсальный.

      А для программирования не hftшных торговых алгоритмов и консольки с одним классом и кучей функций (по моему олдскульному — подпрограмм) сойдут.
      • skatino
        11 декабря 2012, 23:57
        А. Г., очень правильно все сказали

        Зы прошу прощения за минус. Хотел наоборот. А исправить нельзя
      • Евгений
        12 декабря 2012, 00:33
        А. Г., ага, я делаю точно так же и не жалуюсь вообще. Зная примерно что торгует Тимофей несложно догадаться, что оно ему ни к чему, особенно если он сам себе признается в гуманитарном складе ума)
      • Spekyl
        12 декабря 2012, 01:38
        А. Г., в принципе не согласен. И на С# можно линейные алгоритмы писать, только это напоминает бухгалтера, у которого перед компом калькулятор стоит. До пенсии дни считать…
        • А. Г.
          12 декабря 2012, 10:37
          Spekyl,

          С каким из высказанных мной двух тезисов не согласны?

          1. Для программирования и тестирования 99,5% торговых алгоритмов знание перечисленного Евгением не требуется.
          2. Для создания «привода» для выставления-снятия заявок надо изучать соответствующую документацию, а не учебники, а к учебникам обращаться, как к справочникам, в случае возникновения непонимания.
  • smax0
    12 декабря 2012, 00:47
    Тимофей Мартынов слишком все усложняешь.
    для робота то надо получить котировку, да отправить заявку, проконтролировать, что исполнилась.
    для начала хватит.
    в shocksharp есть примеры, сам по ним разобрался, хотя c# не знал никогда и книжек не читал
  • Профиль удален
    12 декабря 2012, 01:18
    Со свойствами все просто. ООП предполагает, что доступ к полям класса(объекта) извне происходит только через методы. Свойства — это те же методы, только немного другой упрощенный синтаксис. Просто как бы два метода (для чтения и записи поля класса) внутри одного свойства. Ну или если задан только get или только set, то это будет один метод.

    А запись вроде такой: public int NumberOfCows { get; set; } — это просто еще более упрощенная форма, когда даже
    не надо определять поле private int numberOfCows и код доступа к нему — все это неявно генерируется само.
  • nbvehrfr
    12 декабря 2012, 03:13
    Боюсь быть преданным анафеме, но возникает резонный вопрос — Тимофей, язык программирования это просто инструмент, не проще ли нанять человека который им владеет, либо заразить идеей если бюджет скудноват/из принципиальных соображений. А самому сконцентрироваться на формализации стратегии?
    Концентрируйтесь на главной задаче, убивать время на изучение инструмента реализации имхо, напрасная трата времени.
    • athlant64
      12 декабря 2012, 03:25
      nbvehrfr, с таким же успехом можно посоветовать новичкам не осваивать терминал Quick, ведь это инструмент, и чтобы напрасно не убивать время, нанять человека который им свободно владеет ))
  • s_i_d
    12 декабря 2012, 09:13
    Для начинающих советую почитать книгу Михаила Фленова «Библия C#». Написана очень простым и понятным языком. Для новичков самое то.
    А визуальные приложения по винду проще писать на Delphi. VCL рулит!!!
    Жаль только, что мало информации про написание роботов на Delphi.
  • FinSerfing
    12 декабря 2012, 11:22
    Настоятельно рекомендую Герберта Шилдта.
    Что-нибудь вроде: www.ozon.ru/context/detail/id/4571556/
    Он сочетает в себе навыки профессионального писателя и разработчика.
    Это позволяет ему на пальцах пояснять самые сложные концепции.
  • Lukasus
    12 декабря 2012, 12:07
    Ну что поехали? )

    Легче будет понять код с точки зрения компилятора — программы которая выполняет твою программу.

    В твоем примере в классе фермер Farmer есть такая переменная как количество коров numberOfCow. Она у тебя объявлена как внутренняя класса (private). Это означает что она может изменяться только внутри класса- это пример инкапсуляции. Это внутренне дело класса, НО менять то как тот нужно ее. Как? Придумали специальный метод — который называется свойство, он дает возможность менять внутреннюю переменную. Называют этот метод обычно как сама переменная только с большой буквы. В твоем классе есть внутренняя переменная для обозначения количество коров у фермера numbersOfCows, а свойство (то есть специальный метод для обращения к внутренней переменной) соответственно назвали NumbersOfCows. Если в своем коде тебе нужно будет задать количество коров у фермера ты напишешь например так NumbersOfCows = 5. Что сделает компилятор? Он посмотрит в класс Farmer и найдем там это свойство NumbersOfCows. Так как ты назначаешь этому свойству значение 5, то он выполнит код помеченный set (set — устанавливать) А там написано присвоить внутренней переменной numbersOfCows значение которые ты назначил в коде (5, value — это ключевое слово для обозначения любого значения что ты назначил в коде свойству NumbersOfCows), а заодно в в части set еще и вычичляют сколько мешков корма нужно, умножают количество коров на расход корма на одну корову.
    Это если ты устанавливаешь значение свойства NumbersOfCows.
    А если ты его извлекаешь, например печатаешь на экран Print (NumbersOfCows), то компилятор ищет в классе Farmer свойство NumbersOfCows и выполняет код с пометкой get (англ — получать) а там просто тебе возвращают значение внутренней переменной numbersOfCows (оператор return возвратит значение внутренней переменной в функцию Print() которая и напечатает значение на экране).
    Раньше не было свойств и программистам приходилось писать по два метода на каждую внутреннюю переменную класса для получения и назначения значения этой переменной.
  • Shredder
    12 декабря 2012, 14:56
    Тимофей, ООП нужно изучать не для того, чтобы писать «взрослые» HFT-роботы, а просто потому, что это будет таким же неотъемлемым свойством современного образованного человека, как свободное владение английским языком, например.

    Пусть ты даже потом не строчки не напишешь (возможно правы те, кто говорит, что трейдер-физик всё что ему действительно нужно сможет реализовать на простейших процедурных тулзах) но это знание — неоценимый вклад в интеллектуальный потенциал. Мыслить будешь лучше…
  • SergeyEgorov
    13 января 2013, 17:08
    А какие конкретно задачи то в трейдинге хочется запрограммировать? Я это к тому, что может быть есть менее нудный способ, нежели чтение дурацкой книжки. ИМХО лучшая книжка по методикам программирования на C# это «Принципы, паттерны и методики гибкой разработки на C#». Продается она на букс.ру за что-то там рублей триста с небольшим, вот ссылка на нее bit.ly/Ti6Iwb. А по синтаксису C# и его языковым возможностям лучше таки читать Шилдта, у него примеры не такие длинные и забубенные, все как-то попроще.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн