Интересное мнение про ООП - страница 3

 
Alexandr Andreev:

)  можно и на ассемблере. Вопрос в том где проще.

И не надо меня ставить в ту или другую сторону.... я не приверженец чего то одного

Никто никого не ставит. Я просто к тому, что сейчас фишки ФП есть и в современных ООП языках, как и фишки ООП в мультипарадигменных. К тому же многие фишки ФП преподносящиеся как нечто особенное и удивительное, по факту те же яйца только в профиль. Они давно были и существовали, типа замыканий в Паскале или отложенное выполнение функции в Си, когда передается указатель на нее а не результат ее работы. Про передачу параметров по значению вообще в любом языке есть, то что в примере в статье приводится вообще работатать почти не где кроме js работать не будет (разве что в Питоне еще).

 
fxsaber:

Не умею ООП. Но примитивные вещи из него использую. Из недавнего, выкладывал очень простой код.


Начал его писать в ФП, когда еще не понимал, что мне в итоге нужно будет смотреть.

Закончил через примитивные элементы ООП. Возможно, потерял навыки ФП, но тут ООП показался гораздо проще и читабельнее.


Код очень простой и короткий (описание). Если его напишите на ФП, будет интересно сравнить.

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

хотелось бы что-бы Дмитрий Федосеев написал свою версию, а потом Expert его затроллил своей)
 
fxsaber:

Не умею ООП. Но примитивные вещи из него использую. Из недавнего, выкладывал очень простой код.


Начал его писать в ФП, когда еще не понимал, что мне в итоге нужно будет смотреть.

Закончил через примитивные элементы ООП. Возможно, потерял навыки ФП, но тут ООП показался гораздо проще и читабельнее.


Код очень простой и короткий (описание). Если его напишите на ФП, будет интересно сравнить.

Калькулятор как высвобожусь посмотрю обязательно. А Вы телепат, собирался спрашивать в другой теме, но спрошу здесь,- по Вашему опыту отладки в "боевом режиме" - возможны ли в МТ4 и в МТ5 "дыры" в данных T_OHLC_V?

Т.е. возможна ли такая ситуация, что к примеру после любых тормозов(обрыв связи, подвисание терминала, подвисание системы), новые данные сначала поступят с пропуском, а потом пропуск/"дыра" будет вписана как бы внутрь массива? Конечно напишу свой такой детектор для индикаторов и экспертов, а может у Вас уже есть такой опыт проверки и можно не беспокоится.

И нет у меня опыта ФП(или есть, но не знал о названии), автоматное куда отнести? ), мне думается обхожусь процедурной парадигмой.

зы. запрос перезапросил)

 
Aleksey Mavrin:

Странная статья. ООП ничем от процедурного стиля в худшую сторону не отличается, т.к. в нём по умолчанию можно сделать всё в процедурном стиле, а наоборот нельзя без страшного раздувания кода, т.е. ООП это "надстройка над", а не принципиально другой стиль.

Если в статье действительно о функциональном, а не процедурном (что не так уж и очевидно, если придираться), то зачем сравнивать то, у чего совершенно различные области применения.

Топик стартер, вы сами то пишите и сейчас говорили о каком? функциональном или процедурном?

С появлением ООП очень он меня отпугивал инкапсуляциями и наследованиями и прочими морфизмами, с которых популярно начинать введение в ООП. Писали бы просто, что данные вместе с функциями в одном блоке - классе. Но потом привык, что мода такая - каждый раз придумывать новую терминологию. Когда нужен ООП - без проблем, но так как он по моему скромному мнению в 2 раза прожорливее и тормознее процедурного варианта, максимально обхожусь процедурным.

А вопрос возник, т.к. хотел услышать мнения о ФП и других вариантах, кроме ООП и процедурного, может у кого супер положительный опыт. И полагаю мудро использовать какой-то устойчивый в функционировании микс и не фанатеть особо.

 
Петер, перелогинься
 
Fast235:

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

Портянка.

#property strict
#property script_show_inputs

input double inPerformance = 100; // Сколько процентов дает система за период
input double inGift = 50;         // Награда управляющего в процентах (< 100)
input int inN = 12;               // Сколько расчетных периодов

struct BASE
{
  double Investor;
  double Manager;
  double Summary;

  // Если управляющий снимает деньги в конце каждого расчетного периода.
  void Set1( const double Performance, const double Gift, const int N )
  {
    this.Investor = ::MathPow(1 + (Performance - 1)* (1 - Gift), N);
    this.Manager = (this.Investor - 1) * Gift / (1 - Gift);
    this.Summary = this.Investor + this.Manager;

    return;
  }

  // Если ничего не делалось в расчетные периоды.
  void Set2( const double Performance, const double Gift, const int N )
  {
    this.Summary = ::MathPow(Performance, N);
    this.Manager = (this.Summary - 1) * Gift;
    this.Investor = this.Summary - this.Manager;

    return;
  }

  // Если управляющий снимает деньги в конце каждого расчетного периода и реинвестирует их.
  void Set3( const double Performance, const double Gift, const int N )
  {
    this.Summary = ::MathPow(Performance, N);
    this.Investor = ::MathPow(1 + (Performance - 1)* (1 - Gift), N);
    this.Manager = this.Summary - this.Investor;

    return;
  }

  void operator *=( const double Deposit = 1 )
  {
    this.Investor *= Deposit;
    this.Manager *= Deposit;
    this.Summary *= Deposit;

    return;
  }
#define TOSTRING(A) #A + " = " + ::DoubleToString(A, 4) + " "
  string ToString( const bool FlagName = true ) const
  {
    return(FlagName ? TOSTRING(Investor) + TOSTRING(Manager) + TOSTRING(Summary)
                    : ::StringFormat("||%-12.4f||%-12.4f||%-12.4f||", this.Investor, this.Manager, this.Summary));
  }
#undef TOSTRING

};

struct PAMM
{
  double Performance; // Доходность за расчетный период
  double Gift;        // Вознагражение управляющего.
  int N;              // Сколько расчетных периодов.

  BASE Base1; // Если управляющий снимает деньги в конце каждого расчетного периода.
  BASE Base2; // Если ничего не делалось в расчетные периоды.
  BASE Base3; // Если управляющий снимает деньги в конце каждого расчетного периода и реинвестирует их.

  void Set( const double dPerformance, const double dGift, const int iN )
  {
    this.Performance = dPerformance;
    this.Gift = dGift;
    this.N = iN;

    this.Base1.Set1(1 + this.Performance / 100, this.Gift / 100, this.N);
    this.Base2.Set2(1 + this.Performance / 100, this.Gift / 100, this.N);
    this.Base3.Set3(1 + this.Performance / 100, this.Gift / 100, this.N);
  }

  void operator *=( const double Deposit = 1 )
  {
    this.Base1 *= Deposit;
    this.Base2 *= Deposit;
    this.Base3 *= Deposit;

    return;
  }

  string GetDescription( void ) const
  {
    return("Доходность за расчетный период " + ::DoubleToString(this.Performance, 1) + "%\n" +
           "Вознагражение управляющего " + ::DoubleToString(this.Gift, 1) + "%\n" +
           "Количество расчетных периодов. " + (string)this.N);
  }

  string ToString( const bool FlagName = true, const bool FlagDescription = true ) const
  {
    return(FlagDescription ? "Данные для инвестиционного счета со следующими характеристиками:\n\n" + this.GetDescription() +
                             "\n\nКонечный результат для Инвестора, Управляющего и Суммарно:"
                             "\n\nЕсли управляющий снимает деньги в конце каждого расчетного периода (1).\n" + this.Base1.ToString(FlagName) +
                             "\n\nЕсли ничего не делалось в расчетные периоды (2).\n" + this.Base2.ToString(FlagName) +
                             "\n\nЕсли управляющий снимает деньги в конце каждого расчетного периода и реинвестирует их (3).\n" + this.Base3.ToString(FlagName)
                           : this.Base1.ToString(FlagName) + this.Base2.ToString(FlagName) + this.Base3.ToString(FlagName));
  }
};

void OnStart()
{
  PAMM Pamm;

  Pamm.Set(inPerformance, inGift, inN);

  Print(Pamm.ToString());

  string Str = Pamm.GetDescription() + "\n   ";

  for (int i = 1; i <= 3; i++ )
    Str += ::StringFormat("||%-12s||%-12s||%-12s||", "Investor" + (string)i, "Manager" + (string)i, "Summary" + (string)i);

  for (int i = 1; i <= inN; i++ )
  {
    Pamm.Set(inPerformance, inGift, i);

    Str += StringFormat("\n%-2d:", i) + Pamm.ToString(false, false);
  }

  Print(Str);
}

Формально, наверное, это ООП. Но самая его примитивная часть. Однако, без нее не смог. Возможно, тупо мозг перестроился на другое и клепаю такое.

 

Пётер ахахах прекрати

Мой подход, ведро - горшок

Мой подход. Ядро - Движок.
Мой подход. Ядро - Движок.
  • 2018.12.05
  • www.mql5.com
В этой ветке, я хочу рассказать о своем подходе в программировании. Заранее предупреждаю, - здесь не будет обсуждений GUI...
 
Maxim Dmitrievsky:

Пётер ахахах прекрати

Мой подход, ведро - горшок

что-то кстати давно его не видно..

неужто действительно под другими никами пошёл ? 

 
Maxim Kuznetsov:

что-то кстати давно его не видно..

неужто действительно под другими никами пошёл ? 

поговаривают, что ушел создавать сильный ИИ

 
Maxim Dmitrievsky:

поговаривают, что ушел создавать сильный ИИ

Лишь бы не случилось чего, а то COVID не дремлет...