Запись почти оффтоп, но думаю кому-то будет интересна.
Почему 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() содержит инфу с расчитанной стоимостью мероприятия
насколько интуитивно я понял, мы передаем в инкапсулированный класс переменные при помощи КОНСТРУКТОРА.
Этот метод выполняется самым первым при работе с инкапсулированным классом, и с него начинается работа:
две упомянутые в констркукторе функции ничо сложного из себя не представляют:
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(). которая и ведет расчеты. Но и здесь блять ничего необычного!!!
Остается понять, что происходит с «секретными» инкапсулированными переменными cakeWriting,NumberOfPeople и FancyDecorations.
Вот здесь типа вся соль!
И опять ничерта не понятно:)))
Что мы сделали в этом коде?
получили значение cakeWriting в обработку на местном уровне?
это свойство, которое типа определяет поместится ли надпись на торте.
Что в итоге стало с CakeWriting и cakeWriting после этого свойства?
Вообще не понятно, нахер их дублировать:)))
Более интересна история с переменной numberofPeople, ибо ее использует наш главный метод расчета стоимости.
Что происходит с ней?
Так. В этот момент я понял, что мой мозг отказывается думать:)
Продолжим геморрой завтра=)
полный текст
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.
счас в планах параллельно изучить курс программирования торговых роботов Игоря Чечета и Дмитрия Власова.
хочу-таки также посмотреть чо дельного сказал Марсель в своем
вебинаре по дата-майнингу
"//??? наху* здесь эта строчка нужна я не понимай"
Там все в одну функцию укладывается СalculateCost() которую можно сделать private на той форме или сделать статической в отдельном классе расчетов, нафига создавать экземпляр класса то. В общем, вам до робота как до парижа раком… увы…
Я сам программирую с 12 лет (сейчас 30), начинал с бейсика и компьютера ПК-01 Львов подключенного к ЧБ телеку, но на рынке торгую руками, т.к. робот никогда не сможет показать такую же доходность и плавную кривую эквити как человек (про HFT, арбитраж и другое инфраструктурное дрочево речь не идет).
программирование мне интересно и не только по рыночным мотивам
Может пойти по другому пути все же разобрать программу какую то уже написанную которую планируешь писать ))
Это делают даже такие программисты как макароники
По сути для задач обработки данных это особо и не нужно, создавать какую-то иерархию классов, а потом из них создавать модель системы из реальных объектов. Для этого действительно подходят специализированные пакеты типа Матлаб. А то, что все пишут под .NET — так потому, что сами платформы создавались под .NET и проще использовать его возможности по встраиванию пользовательского программного кода.
И вот эта путаница с членами-данными класса и его свойствами — private-данные класса скрыты от всех извне и никто не может к ним обращаться, что сделано с целью безопасности данных. И потому, что внешнему миру не обязательно знать, что за начинка у объекта внутри и как он работает. А вот через публичные свойства это можно делать — такая связь с внешним миром — value это как раз и есть то значение такого же типа как и само свойство, которое мы хотим присвоить с помощью метода set.
А там где непонятно зачем строка с cakeWriting — по логике когда меняется число людей, то меняется длина надписи, и это и делается в строке this.CakeWriting = cakeWriting;. Тут уже значение количества людей обновлено выше и можно с помощью вызова метода set свойства CakeWriting обновить значение. Просто какой-то муторный пример.
Это как раз иллюстрация того, о чем я писал — без понимания назначения нет смысла изучать технологии.
В твоем примере ООП вообще нафиг не нужно. Использовать технологии только потому что это круто => генерить говнокод.
Главное качество кода — его понятность. Тут же вообще не понятно. Зачем плодить классы с инкапсулированными свойствами? Тут достаточно было написать функуию в одну строку.
Понимая бессмысленность и бесполезноть работы ты ее возненавидишь.
Не лезь пока в ООП на стадии создания своих классов — изучай и используй только чужие.
Пока лезть в ООП бесполезно — не потому что тупой — нужен опыт, а у тебя его нет.
float CalculateCakePrice(int GuestsCount,bool IsDecorated, string CongratulationsString)
{
return GuestsCount* 25 + IsDecorated?10:0 + CongratulationsString.lehgth() * 5;
}
Сорь за оффтоп.