dr-mart

Чем для гуманитария оборачивается изучение 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.
счас в планах параллельно изучить курс программирования торговых роботов Игоря Чечета и Дмитрия Власова.

хочу-таки также посмотреть чо дельного сказал Марсель в своем вебинаре по дата-майнингу
★4
36 комментариев
))) Тима улыбнул
avatar
Студент, программирование просто бесит:)))
Тимофей Мартынов, Странный какой-то путь ты выбрал.
Тимофей Мартынов, я в детстве програмил паскаль, немного си… через более чем 15 лет самого тяжело заставить сесть за написание… каждый должен своим делом заниматься… Программирование отвлекает от ручного управления полетами
avatar
Тимофей Мартынов, зато учит мозг мыслить структурно. и логические связи строить. писал про дисциплину — вот тебе и дисциплина.
avatar
На куй бездей пати=)
avatar
Bubellar, это точно. Ну его нах такую бездёй пати
Тимофей Мартынов, Помню как то в Маткаде считал очень сложную модель, расшумление картинки, которая была зашумлена случайным генератором. В оригинале там был портрет, так вот спустя 2-х недельные мучения этот матперематкад мне очистил от шума иии… это было плять похоже на елочку! Вот тогда у меня случился почти нервный срыв=)))
avatar
Bubellar, ))
avatar
Не проще ли поставить задачу специальным людям?
avatar
IDDQD, действительно…
avatar
IDDQD, и тогда не нужно будет понимать — цитирую:
"//??? наху* здесь эта строчка нужна я не понимай"
avatar
IDDQD, не понимая того, как это делается, можно и переплатить и не получить в итоге желаемого.
avatar
Да… какой винегрет то на форме, то по русски, то по английски… а давай еще на хинди напиши чего…
Там все в одну функцию укладывается СalculateCost() которую можно сделать private на той форме или сделать статической в отдельном классе расчетов, нафига создавать экземпляр класса то. В общем, вам до робота как до парижа раком… увы…
Ох, какой нечитабельный код тут, как кодер это говорю))
avatar
программируя на С+++ гуманитарий случайно вызвал дьявола ))))
avatar
Отвечая на вопрос в названии темы скажу, что оборачивается гемороем, потерей времени и разочарованием. ДЛя того чтобы воплощать в коде хорошо работающие вещи, нужно иметь алгоритмический склад ума и любить программирование само по себе. Если этого нет и писать код не в кайф — ничего хорошего не получится. Выдающиеся вещи получаются только тогда когда человек занимается любимым делом.
Я сам программирую с 12 лет (сейчас 30), начинал с бейсика и компьютера ПК-01 Львов подключенного к ЧБ телеку, но на рынке торгую руками, т.к. робот никогда не сможет показать такую же доходность и плавную кривую эквити как человек (про HFT, арбитраж и другое инфраструктурное дрочево речь не идет).
avatar
Полковник Айвс, спасибо за мнение.

программирование мне интересно и не только по рыночным мотивам
Полковник Айвс, алгоритмический склад ума и аналитический склад ума — по сути, одно и тоже, по моему.
avatar
В 89 когда сдавал ассемблер пргу, делал проще… писал задание на паскале, переводил в код ассембелера, убирал «лишнее» что прога выдала, все преременные имена присваивал свои и вперёд на перфокарты… и работало!!!
Может пойти по другому пути все же разобрать программу какую то уже написанную которую планируешь писать ))
avatar
Разбирать чужой код, особенно без разметки и комментов — занятие очень на любителя :) Асм реально рулит даже сейчас, если нужно писать критический по производительности модуль, благо все языки для удовлетворения свойству полноты ассемблерные вставки поддерживают. Текущее программирование особенно дотнет — это просто швах по отношению к стабильности и производительности. Скоро вообще для «программистов» начнут делать конструкторы вроде того что есть в тслабе.
avatar
По-моему, Тимофей нашел самую дебильную книгу по СиШарп.
Чувак, c# — язык не для майнинга. Может все-таки R?
avatar
Bocman, C# универсален. В том числе и для дата майнинга. А вот R — только для дата майнинга.
avatar
Bocman, что такое ЭР?
Тимофей Мартынов, www.r-project.org/
avatar
С# УЖЕ ПОШТО УЧИТЬ НАДО, ЧТОБЫ В НИДЗЯ СВОИ ИНДЮКИ ПИСАТЬ ИЛИ СВОЮ ПРОГУ, ЧТОБЫ НАПРЯМУЮ ПОДКЛЮЧИТЬСЯ.
Это делают даже такие программисты как макароники
avatar
Потратьте с недельку на изучение объектно-ориентированного программирования (ООП) как такового, чтобы понять зачем все эти классы и объекты, наследование, инкапсулирование и прочие вещи. Это ведь то, на чем зиждется все программирование под .NET и все ООП-языки. В дальнейшем просто будет совершенно другое мышление при написании программ — голова будет работать над тем какую иерархию классов создать, и как потом из этих классов создать реальные объекты, которые будут решать задачу.

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

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

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

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

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

теги блога Тимофей Мартынов

....все тэги



UPDONW
Новый дизайн