Тимофей Мартынов
Тимофей Мартынов личный блог
12 декабря 2012, 18:54

Чем для гуманитария оборачивается изучение C#.

Запись почти оффтоп, но думаю кому-то будет интересна.
Почему C#? Вроде как это наиболее продвинутый способ написания торговых роботов. Вот и изучаю основы.

Еще один ответ на вопрос зачем это надо, — это попытка впоследствии автоматизировать датамайнинг. (поиск стат. закономерностей из набора данных). Как сделать это максимально быстро без использования программирования я не знаю. 

-----------------------------------------------------
Вчера писал о том, как у меня возник ступор...

Хороший пример, и все встает на свои места. Разбираю по полочкам

Делаем вот такую программку:
Чем для гуманитария оборачивается изучение C#.

Программка забирает три значения
1. Количество людей на пире (int)
2. украсить ли еду (bool)
3. что написать на торте? (string)

И выдает значение суммы, сколько это будет стоить.

Каждый доп. рот — это доп бабос,
украсить — еще надбавочка
Ну и за каждую буковку на торте нада заплатить
а если челов больше 8, то надо взять большой торт, к-й стоит еще дороже

Как только меняешь параметр, идет автоматический перерасчет стоимости.

Создается класс birthdayParty (его опишем чуть позже)
ну и его экземпляр:
BirthdayParty birthdayParty;

1. Мы определяем новый объект birthdayParty, которому передаем три параметра по умолчанию.
2. Вызываем ф-ю показа стоимости мероприятия ()

        public Form1()
        {
            InitializeComponent();
            birthdayParty = new BirthdayParty((int)numericUpDown2.Value, FancyDecor.Checked, textBox1.Text);
            DisplayBirthdayPartyCost();
        }

3. Через функцию DisplayBirthdayPartyCost() мы:
    1. забираем обрезанный (если слишком длинный) текст с поздравлением, пишем его  
    2. Выводим СТОИМОСТЬ (248,50 на картинке) из метода birthdayParty.CalculateCost(), который описан здесь же в form1:

        private void DisplayBirthdayPartyCost()
        {
            textBox1.Text = birthdayParty.CakeWriting; — получили «отрезанный» кусок поздравления, если он оказался слишком длинным
            decimal Cost = birthdayParty.CalculateCost(); — получили значение расчетов из метода CalculateCost()
            birthdayCost.Text = Cost.ToString(«c»); — и вывели его в текстовую метку, там где стоит 248,50 на картинке
        }

4. Далее есть три обработчика формы, если 

а), поменяется крутилка с количеством гостей numericUpDown2.Value
б). поменяется текст поздравления textBox1.Text
в). или значение галки FancyDecor.Checked

Каждый раз мы отправляем новый параметр экземпляру класса birthdayParty и вызываем функцию DisplayBirthdayPartyCost(), чтобы поменять стоимость на экране,

Класс BirthdayParty при этом является инкапсулированным

Какие обращения к классу мы используем?
birthdayParty.CakeWriting
birthdayParty.CalculateCost()


а также через обработчики событий ( я их здесь не указал) через:
birthdayParty.CalculateCostOfDecorations(FancyDecor.Checked);
birthdayParty.NumberOfPeople = (int)numericUpDown2.Value;
birthdayParty.CakeWriting = textBox1.Text;

Три последние мы используем для передачи данных классу, а 
birthdayParty.CalculateCost() содержит инфу с расчитанной стоимостью мероприятия

насколько интуитивно я понял, мы передаем в инкапсулированный класс переменные при помощи КОНСТРУКТОРА.
Этот метод выполняется самым первым при работе с инкапсулированным классом, и с него начинается работа:

Чем для гуманитария оборачивается изучение C#.

две упомянутые в констркукторе функции ничо сложного из себя не представляют:

        private void CalculateCakeSize()
        {    
            if (NumberOfPeople <= 4) CakeSize = 8;
            else CakeSize = 16;
        }

        public void CalculateCostOfDecorations(bool fancy)
            {
                fancyDecorations = fancy;
                if (fancy) CostOfDecorations = (NumberOfPeople + 15.00M) + 50M;
                else CostOfDecorations = (NumberOfPeople + 7.50M) + 30M;
            }

Самый большой интерес представляет функция CalculateCost(). которая и ведет расчеты. Но и здесь блять ничего необычного!!!
Чем для гуманитария оборачивается изучение C#.

Остается понять, что происходит с «секретными» инкапсулированными переменными cakeWriting,NumberOfPeople и FancyDecorations.

Вот здесь типа вся соль!
Чем для гуманитария оборачивается изучение C#.

И опять ничерта не понятно:)))
Что мы сделали в этом коде?
получили значение cakeWriting в обработку на местном уровне?
это свойство, которое типа определяет поместится ли надпись на торте.
Что в итоге стало с CakeWriting и cakeWriting после этого свойства?
Вообще не понятно, нахер их дублировать:)))

Более интересна история с переменной numberofPeople, ибо ее использует наш главный метод расчета стоимости.
Что происходит с ней?
Чем для гуманитария оборачивается изучение C#.

Так. В этот момент я понял, что мой мозг отказывается думать:)
Продолжим геморрой завтра=)

полный текст 

BirthdayParty.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace example_20
{
    //у нас получился полностью изолированный класс
    class BirthdayParty
    {
        public const int CostOfFoodPerPerson = 25;
        public decimal CostOfDecorations = 0;
        private bool fancyDecorations;
        public int CakeSize;
        // это конструктор, которому мы передаем три параметра
        public BirthdayParty(int numberOfPeople, bool fancyDecorations, string cakeWriting) 
        {
            //«спускаем» полученные параметры в локальный уровень
            this.numberOfPeople = numberOfPeople; 
            this.fancyDecorations = fancyDecorations;
            CalculateCakeSize(); //вычисляем размер торта
            this.CakeWriting = cakeWriting;
            //вычисляем стоимость украшений, но как мы ее передадим во вне?
            CalculateCostOfDecorations(fancyDecorations);
        }
        //это внутренний метод расчета размера торта исхода из количества гостей   
        private void CalculateCakeSize()
        {    
            if (NumberOfPeople <= 4) CakeSize = 8;
            else CakeSize = 16;
        }
        private string cakeWriting = "";
        //Это? конструктор? или? свойство?, который получает строку и определяет, поместится ли она на торте:))
        public string CakeWriting
        {
            get { return this.cakeWriting; } //приняли строчку с надписью текста
            set
            {                            //а это то, что бы возвращаем
                int maxLength;
                if (CakeSize == 8) maxLength = 16; 
                else maxLength = 40;
                //откуда берется value хуй его знает //наверна значение принятой переменной
                if (value.Length > maxLength)
                {
                    MessageBox.Show(«слишком много букв для » + CakeSize + " дюймового торта");
                    if (maxLength > this.cakeWriting.Length) maxLength = this.cakeWriting.Length;
                    //обрезать поздравительную надписть по максимальной длине
                    this.cakeWriting = cakeWriting.Substring(0, maxLength);
                }
                else
                {
                    this.cakeWriting = value;
                }
            }
        }
        //метод расчета стоимость торта и суммарная стоимость пиршества
        public decimal CalculateCost()
        {
            //CostOfDecorations и CostOfFoodPerPerson — это постоянные, определены выше
            //не пойму где определяется NumberOfPeople????
            decimal TotalCost = CostOfDecorations + (CostOfFoodPerPerson * NumberOfPeople);
            decimal CakeCost;
            if (CakeSize == 8) CakeCost = 40M + CakeWriting.Length * .25M;
            else CakeCost = 75M + CakeWriting.Length * .25M;
            //возвращаем сумму двух переменных
            return TotalCost + CakeCost;
        }
        private int numberOfPeople;
        //еще одно свойство? чтобы получить из внешнего мира число людей и работать с ним?
        public int NumberOfPeople
            {
                get { return numberOfPeople; }
                set
                {//получили число, запускаем его внутрь кода при помощи «numberOfPeople = value;»
                    //запускаем расчет стоимости украшений и расчет величины
                    numberOfPeople = value;
                    CalculateCostOfDecorations(fancyDecorations);
                    CalculateCakeSize();
                    //??? нахуй здесь эта строчка нужна я не понимай
                    this.CakeWriting = cakeWriting;
                }
            }
        //метод расчета стоимости украшений 
        public void CalculateCostOfDecorations(bool fancy)
            {
                fancyDecorations = fancy;
                if (fancy) CostOfDecorations = (NumberOfPeople + 15.00M) + 50M;
                else CostOfDecorations = (NumberOfPeople + 7.50M) + 30M;
            }
    }
}


Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace example_20
{
    public partial class Form1: Form
    {
     //ошибся с объявлением:)   public int NumberOfPeople = 1;
        DinnerParty dinnerParty;
        BirthdayParty birthdayParty;
     ;   public Form1()
        {
            InitializeComponent();
            dinnerParty = new DinnerParty((int)numericUpDown1.Value, HealthyOption.Checked, FancyDecorations.Checked);
            //где описан?
            DisplayDinnerPartyCost();
            birthdayParty = new BirthdayParty((int)numericUpDown2.Value, FancyDecor.Checked, textBox1.Text);
            DisplayBirthdayPartyCost();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private void label5_Click(object sender, EventArgs e)
        {
        }
        //с помощью этого метода мы передаем информацию 
        private void DisplayBirthdayPartyCost()
        {
            textBox1.Text = birthdayParty.CakeWriting;
            decimal Cost = birthdayParty.CalculateCost();
            birthdayCost.Text = Cost.ToString(«c»);
        }
        private void DisplayDinnerPartyCost()
        {
            decimal cost2 = dinnerParty.CalculateCost(HealthyOption.Checked);
            label3.Text = cost2.ToString(«c»);
        }
        private void FancyDecor_CheckedChanged(object sender, EventArgs e)
        {
            birthdayParty.CalculateCostOfDecorations(FancyDecor.Checked);
            DisplayBirthdayPartyCost();
        }
        private void numericUpDown2_ValueChanged(object sender, EventArgs e)
        {
            birthdayParty.NumberOfPeople = (int)numericUpDown2.Value;
            DisplayBirthdayPartyCost();
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            birthdayParty.CakeWriting = textBox1.Text;
            DisplayBirthdayPartyCost();
        }
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            dinnerParty.NumberOfPeople = (int)numericUpDown1.Value;
            DisplayDinnerPartyCost();
        }
        private void FancyDecorations_CheckedChanged(object sender, EventArgs e)
        {
            dinnerParty.CalculateCostOfDecorations(FancyDecorations.Checked);
            DisplayDinnerPartyCost();
        }
        private void HealthyOption_CheckedChanged(object sender, EventArgs e)
        {
            dinnerParty.SetHealthyOption(HealthyOption.Checked);
            DisplayDinnerPartyCost();
        }
        private void label6_Click(object sender, EventArgs e)
        {
        }
        
    }
}




upd.
счас в планах параллельно изучить курс программирования торговых роботов Игоря Чечета и Дмитрия Власова.

хочу-таки также посмотреть чо дельного сказал Марсель в своем вебинаре по дата-майнингу
36 Комментариев
  • Студент
    12 декабря 2012, 19:01
    ))) Тима улыбнул
      • Этот ресурс помойка.рф
        12 декабря 2012, 19:09
        Тимофей Мартынов, Странный какой-то путь ты выбрал.
      • Студент
        12 декабря 2012, 19:11
        Тимофей Мартынов, я в детстве програмил паскаль, немного си… через более чем 15 лет самого тяжело заставить сесть за написание… каждый должен своим делом заниматься… Программирование отвлекает от ручного управления полетами
      • Алексей (rwsmart)
        12 декабря 2012, 22:50
        Тимофей Мартынов, зато учит мозг мыслить структурно. и логические связи строить. писал про дисциплину — вот тебе и дисциплина.
  • Bubellar
    12 декабря 2012, 19:04
    На куй бездей пати=)
      • Bubellar
        12 декабря 2012, 19:09
        Тимофей Мартынов, Помню как то в Маткаде считал очень сложную модель, расшумление картинки, которая была зашумлена случайным генератором. В оригинале там был портрет, так вот спустя 2-х недельные мучения этот матперематкад мне очистил от шума иии… это было плять похоже на елочку! Вот тогда у меня случился почти нервный срыв=)))
  • somebody
    12 декабря 2012, 19:12
    Не проще ли поставить задачу специальным людям?
    • Vlаdimi®
      12 декабря 2012, 19:17
      IDDQD, действительно…
    • Vlаdimi®
      12 декабря 2012, 19:18
      IDDQD, и тогда не нужно будет понимать — цитирую:
      "//??? наху* здесь эта строчка нужна я не понимай"
    • Евгений
      12 декабря 2012, 21:07
      IDDQD, не понимая того, как это делается, можно и переплатить и не получить в итоге желаемого.
  • Счастливый Конец
    12 декабря 2012, 19:22
    Да… какой винегрет то на форме, то по русски, то по английски… а давай еще на хинди напиши чего…
    Там все в одну функцию укладывается СalculateCost() которую можно сделать private на той форме или сделать статической в отдельном классе расчетов, нафига создавать экземпляр класса то. В общем, вам до робота как до парижа раком… увы…
  • iRus
    12 декабря 2012, 19:24
    Ох, какой нечитабельный код тут, как кодер это говорю))
  • Rober46
    12 декабря 2012, 19:25
    программируя на С+++ гуманитарий случайно вызвал дьявола ))))
  • Полковник Айвс
    12 декабря 2012, 20:28
    Отвечая на вопрос в названии темы скажу, что оборачивается гемороем, потерей времени и разочарованием. ДЛя того чтобы воплощать в коде хорошо работающие вещи, нужно иметь алгоритмический склад ума и любить программирование само по себе. Если этого нет и писать код не в кайф — ничего хорошего не получится. Выдающиеся вещи получаются только тогда когда человек занимается любимым делом.
    Я сам программирую с 12 лет (сейчас 30), начинал с бейсика и компьютера ПК-01 Львов подключенного к ЧБ телеку, но на рынке торгую руками, т.к. робот никогда не сможет показать такую же доходность и плавную кривую эквити как человек (про HFT, арбитраж и другое инфраструктурное дрочево речь не идет).
    • Игорь Рябушкин
      13 декабря 2012, 20:01
      Полковник Айвс, алгоритмический склад ума и аналитический склад ума — по сути, одно и тоже, по моему.
  • sds
    12 декабря 2012, 20:37
    В 89 когда сдавал ассемблер пргу, делал проще… писал задание на паскале, переводил в код ассембелера, убирал «лишнее» что прога выдала, все преременные имена присваивал свои и вперёд на перфокарты… и работало!!!
    Может пойти по другому пути все же разобрать программу какую то уже написанную которую планируешь писать ))
  • Полковник Айвс
    12 декабря 2012, 20:44
    Разбирать чужой код, особенно без разметки и комментов — занятие очень на любителя :) Асм реально рулит даже сейчас, если нужно писать критический по производительности модуль, благо все языки для удовлетворения свойству полноты ассемблерные вставки поддерживают. Текущее программирование особенно дотнет — это просто швах по отношению к стабильности и производительности. Скоро вообще для «программистов» начнут делать конструкторы вроде того что есть в тслабе.
  • Максим Виссарионович
    12 декабря 2012, 21:01
    По-моему, Тимофей нашел самую дебильную книгу по СиШарп.
  • Жадный Яша
    12 декабря 2012, 21:18
    Чувак, c# — язык не для майнинга. Может все-таки R?
  • UlySseS
    12 декабря 2012, 23:12
    С# УЖЕ ПОШТО УЧИТЬ НАДО, ЧТОБЫ В НИДЗЯ СВОИ ИНДЮКИ ПИСАТЬ ИЛИ СВОЮ ПРОГУ, ЧТОБЫ НАПРЯМУЮ ПОДКЛЮЧИТЬСЯ.
    Это делают даже такие программисты как макароники
  • Brad Tick
    13 декабря 2012, 08:53
    Потратьте с недельку на изучение объектно-ориентированного программирования (ООП) как такового, чтобы понять зачем все эти классы и объекты, наследование, инкапсулирование и прочие вещи. Это ведь то, на чем зиждется все программирование под .NET и все ООП-языки. В дальнейшем просто будет совершенно другое мышление при написании программ — голова будет работать над тем какую иерархию классов создать, и как потом из этих классов создать реальные объекты, которые будут решать задачу.

    По сути для задач обработки данных это особо и не нужно, создавать какую-то иерархию классов, а потом из них создавать модель системы из реальных объектов. Для этого действительно подходят специализированные пакеты типа Матлаб. А то, что все пишут под .NET — так потому, что сами платформы создавались под .NET и проще использовать его возможности по встраиванию пользовательского программного кода.
    • Brad Tick
      13 декабря 2012, 09:06
      C#4.0 и платформа .NET 4 для профессионалов (Нейгел) — часть 1 из книжки довольно подробно разжевывает. Есть еще C#4.0 на примерах (Ватсон) — тоже довольно неплохо разжевано, с примерами, но основные моменты программирования разбросаны по всей книге.
      • Brad Tick
        13 декабря 2012, 09:10
        Есть такой идеолог Гради Буч, у него книга есть «Объектно-ориентированный анализ и проектирование», там как бы рассматривается вся идеология ООП в плане создания систем. Но книжка старая. С# и .NET там нет.
        • Brad Tick
          13 декабря 2012, 09:23
          У Вас нет понимания того, что есть классы, а есть объекты, как реальные экземпляры классов. Может быть отдельная иерархия классов, и отдельно от этого всего можно создать большое количество объектов, у которых тоже будет иерархия (самый главный объект «приложение» включает в себя множество других объектов, которые в свою очередь могут включать в себя другие объекты).

          И вот эта путаница с членами-данными класса и его свойствами — private-данные класса скрыты от всех извне и никто не может к ним обращаться, что сделано с целью безопасности данных. И потому, что внешнему миру не обязательно знать, что за начинка у объекта внутри и как он работает. А вот через публичные свойства это можно делать — такая связь с внешним миром — value это как раз и есть то значение такого же типа как и само свойство, которое мы хотим присвоить с помощью метода set.
          • Brad Tick
            13 декабря 2012, 09:35
            Метод set — он задает значение свойству, а get — выдает наружу так сказать, а у Вас наоборот написано в комментариях к тексту.

            А там где непонятно зачем строка с cakeWriting — по логике когда меняется число людей, то меняется длина надписи, и это и делается в строке this.CakeWriting = cakeWriting;. Тут уже значение количества людей обновлено выше и можно с помощью вызова метода set свойства CakeWriting обновить значение. Просто какой-то муторный пример.
  • StockChart.ru
    13 декабря 2012, 17:27
    Тимофей,

    Это как раз иллюстрация того, о чем я писал — без понимания назначения нет смысла изучать технологии.
    В твоем примере ООП вообще нафиг не нужно. Использовать технологии только потому что это круто => генерить говнокод.
    Главное качество кода — его понятность. Тут же вообще не понятно. Зачем плодить классы с инкапсулированными свойствами? Тут достаточно было написать функуию в одну строку.
    Понимая бессмысленность и бесполезноть работы ты ее возненавидишь.
    Не лезь пока в ООП на стадии создания своих классов — изучай и используй только чужие.
    Пока лезть в ООП бесполезно — не потому что тупой — нужен опыт, а у тебя его нет.
    • StockChart.ru
      13 декабря 2012, 17:31
      Ну вот так НАДО решать эту задачу:

      float CalculateCakePrice(int GuestsCount,bool IsDecorated, string CongratulationsString)
      {
      return GuestsCount* 25 + IsDecorated?10:0 + CongratulationsString.lehgth() * 5;
      }
  • Alex S.
    14 января 2016, 18:33
    ахахаха… Комментарии в коде программы)) жжете. Я в том же духе дипломную программу комментировал (php). Думал потом поменяю, ага, поменял… не только не поменял, но и коды скриптов так и распечатал, вот тут до меня и дошло, чего это комиссия сидит улыбу давит)))
    Сорь за оффтоп.

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

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