Запись почти оффтоп, но думаю кому-то будет интересна.
Почему 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 на той форме или сделать статической в отдельном классе расчетов, нафига создавать экземпляр класса то. В общем, вам до робота как до парижа раком… увы…