Как помочь студентке по инфо-тематике? - страница 9

 
Maxim Kuznetsov #:

member init list это довольно скользкое место . И у вас хорошая иллюстрация этому :

при вызове CLineByIdxAndProc(1.0,2.0,3,3) будет ошибка. Деление на 0

к чему должна быть отнесена ошибка, хотя бы для журнала ? конструктор ещё не вызывался. Экземпляр класса даже не инстанцировался, не факт что место выделено. На экземпляр нельзя сослаться никак. Были-бы исключения в языке - застрелись писать обработчик.

Точно, спасибо большое! Теперь я понял логику отказа от member initializer list в пользу readonly. Из тела конструктора можно хоть какой-нибудь условный DivideByZeroException бросить, а в контексте защиты полей readonly ничем не уступает.

С TDD подходом можно сразу добавить тест кейс с вертикальной линией и доверить реализацию стажеру.

Жаль в MQL нет автотестов. Можно конечно скриптов с юнит тестами нагородить, но это ни в какое сравнение не идет с нормальными инструментами для тестирования. Вот почему человеку, который не интересуется алготрейдингом, не стоит начинать программирование с MQL. А даже если нужен алготрейдинг, то есть смысл пойти выучить другой язык прежде чем начать программировать на MQL - так даже быстрее будет.

 
Vladislav Boyko #:

Как вы думаете, книжку какой версии C# лучше купить начинающему? Много рекомендованой литературы по C#6, но я смотрю там уже и для C#13 бестселлеры есть. Может ли быть такое, что я буду учить слишком свежий C#, а потом с легаси кода чехлы снять совсем не смогу? Или лучше сразу посвежее?

Язык совместим сверху-вниз. поэтому гнаться за последними версиями особого смысла не имеет. Те же Трюэлсон и Рихтер регулярно обновляют свои книги, большая часть которых была написана еще во времена net framework а потом со временем дополнялась нововведениями. Большее значение имеет code style в проектах. Он разный. В основном пишут либо ООП, либо функционально. Основное различие новых версий в том, что могут использоваться определенные конструкции вроде pattern matching, разыменование кортежей или типы record. Действительно фундаментальные вещи появились давно. Это await/async и tasks (~2012), generics, linq (2008), работа с потоками и базовые концепции (<2008).

 
Vasiliy Sokolov #:

Язык совместим сверху-вниз. поэтому гнаться за последними версиями особого смысла не имеет. Те же Трюэлсон и Рихтер регулярно обновляют свои книги, большая часть которых была написана еще во времена net framework а потом со временем дополнялась нововведениями. Большее значение имеет code style в проектах. Он разный. В основном пишут либо ООП, либо функционально. Основное различие новых версий в том, что могут использоваться определенные конструкции вроде pattern matching, разыменование кортежей или типы record. Действительно фундаментальные вещи появились давно. Это await/async и tasks (~2012), generics, linq (2008), работа с потоками и базовые концепции (<2008).

Понял, спасибо большое!

 
Реter Konow #:
Ну, С# точно С++ косплеет.)) Практически с него он и начался. Майкрософт взяли С++ и на его основе сделали свой язык Си шарп. Это ж известный факт.))

Да, примерно в 2000 г. первая версия шарпа была доступна для подписчиков MSDN, которым тогда был я. Помню, мне приходили физические посылки от MS, которые я получал в местном почтовом отделении. Содержание - книги по программированию, за что до сих пор спасибо.

По тем временам, разрабы мне писали, что уровень студентов в  Санта-Кларе давно ниже плинтуса.

 
Alexey Volchanskiy #:

Да, примерно в 2000 г. первая версия шарпа была доступна для подписчиков MSDN, которым тогда был я. Помню, мне приходили физические посылки от MS, которые я получал в местном почтовом отделении. Содержание - книги по программированию, за что до сих пор спасибо.

По тем временам, разрабы мне писали, что уровень студентов в  Санта-Кларе давно ниже плинтуса.

Да, богатый у вас опыт. 

Собственно, я вспомнил на чем основано мое мнение, что C# это "ответ" Майкрософта С++. Когда начинал пробовать учить шарп, наткнулся на курс, где в прологе автор подробно рассказывал откуда взялся язык С шарп, а также кто и зачем его создал. При этом он активно сравнивал и противопоставлял его именно С++, показывая насколько шарп лучше в усвоении и продуманнее во всем. 

На мой дилетаньский взгляд, Java тоже "производый" язык. Врядли МS лепил ответ ему. Но это имхо.
 
Vladislav Boyko #:
почему в C# не стали добавлять параметрические макросы? Я думаю, тот факт, что макросы усложняют чтение кода (при грамотном использовании - улучшают, как по мне) вряд-ли является достаточным что бы отказаться от их добавления. Должно быть что-то еще.

На сколько адекватным считается желание намазывать макросами подобным образом:

#define _memberInitializerList _set(sunday), _set(monday), _set(tuesday), _set(wednesday), _set(thursday), _set(friday), _set(saturday)
class CDayOfWeekFilterBase
  {
private:
   const bool sunday;
   const bool monday;
   const bool tuesday;
   const bool wednesday;
   const bool thursday;
   const bool friday;
   const bool saturday;
//---
#define _set(a) a(from.##a)
protected:
              CDayOfWeekFilterBase(const CDayOfWeekFilterBase& from) : _memberInitializerList {}
#undef _set
#define _set(a) a(a_##a)
public:
              CDayOfWeekFilterBase(bool a_sunday, bool a_monday, bool a_tuesday, bool a_wednesday, bool a_thursday, bool a_friday,bool a_saturday)
                 : _memberInitializerList {}
#undef _set
  };
#undef _memberInitializerList

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

Меня бы материли если бы я делал так при работе в команде?

После MQL открываю потом visual studio (C#) и чувствую себя каким-то ограниченным без макросов.

Подсветку макросов на сайт не завезли, поэтому на сайте оно не очень хорошо визуально воспринимается.

 
Реter Konow #:
Да, богатый у вас опыт. 

Собственно, я вспомнил на чем основано мое мнение, что C# это "ответ" Майкрософта С++. Когда начинал пробовать учить шарп, наткнулся на курс, где в прологе автор подробно рассказывал откуда взялся язык С шарп, а также кто и зачем его создал. При этом он активно сравнивал и противопоставлял его именно С++, показывая насколько шарп лучше в усвоении и продуманнее во всем. 

На мой дилетаньский взгляд, Java тоже "производый" язык. Врядли МS лепил ответ ему. Но это имхо.

Это не опыт богатый, а я старый, через 2 недели будет 60 ))

Как я помню, шарп стартанул в 2000 г. и я сразу им заинтересовался, так как MS в г**но вкладываться не будет. Тогда VC++ 98 был крайне неудобным языком для создания десктоп приложений. С этим убогим MFC ( Microsoft Foundation Classes ) создать сложную форму было мучением, примерно, как сейчас на MQL )) А использование  ODBC (Open Database Connectivity) для работы с БД было танцем с бубном.

И в то же время на рынке были два замечательных продукта — Delphi и C++Builder, где гуй создавался в визуальном режиме, а работа с БД была просто сказкой. И у них обоих были крутые расширения Pascal и C++, например свойства. Я в 90-е владел агентством по аренде квартир и все ПО для работы с БД квартир писал сам, на Делфи и FoxPro. Был такой великолепный пакет для работы с БД, потом его купил MS и за несколько лет убил.

Когда появился первый релиз шарпа, я с изумлением увидел в нем все нововведения  C++Builder! А потом Борланд заявил, что развитие Билдера прекращается. Среди программистов на RSDN ходили слухи, что MS подчистую скупил Билдер и на его основе сделал C#. Очень даже верю, это на Западе обычная практика.

 
Vladislav Boyko #:

На сколько адекватным считается желание намазывать макросами подобным образом:

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

Меня бы материли если бы я делал так при работе в команде?

После MQL открываю потом visual studio (C#) и чувствую себя каким-то ограниченным без макросов.

Подсветку макросов на сайт не завезли, поэтому на сайте оно не очень хорошо визуально воспринимается.

Я работал в иностранных фирмах, там всегда есть талмуд под названием CodeStyle, где описано, что можно и что нельзя использовать, вплоть до стиля форматирования исходников. В шарпе убрали дефайны в целях безопасности, я так думаю. И общей деградации среднего слоя программистов — мидлов.

 
Vladislav Boyko #:

На сколько адекватным считается желание намазывать макросами подобным образом:

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

Меня бы материли если бы я делал так при работе в команде?

После MQL открываю потом visual studio (C#) и чувствую себя каким-то ограниченным без макросов.

Подсветку макросов на сайт не завезли, поэтому на сайте оно не очень хорошо визуально воспринимается.

У меня бы ты устал обосновывать необходимость этих самых function-like macros. Они фича чистого С, в плюсах же, уже давным-давно признаны злым злом. В MQL, к сожалению, в виду отсутствия  большинства (я бы сказал, что всех) вкусняшек вокруг template, приходится их использовать, но очень иногда и в очень специфических случаях, а тащить их в бизнес-логику - это либо реальная безысходность, требующая обоснований перед тех-лидом, либо по пальцам молотком за это.

PS. В твоем случае, если реально боишься когда-либо забыть в двух местах проапгрейдить, данные оборачиваются в структуру, а у структуры делается два конструктора, один копированием, в котором this = other, а вот другой, тот, который все значения должен принять. Соответственно, проапгрейдить тебе нужно только параметрический конструктор структуры, а дальше уже компилятор тебе на все места укажет. Правильная, масштабируемая архитектура называется.

 
Vladimir Simakov #:
В твоем случае, если реально боишься когда-либо забыть в двух местах проапгрейдить, данные оборачиваются в структуру

В том случае я не боялся забыть проапгрейдить, а просто лень было копипастить с минимальными отличиями; получился оверкилл из мира DRY. Тот базовый класс нужен только для передачи параметров. А производный класс реализует всего 2 метода, хотя я и там умудрился намазать.

//+------------------------------------------------------------------+
//| CDayOfWeekFilterBase.mqh                                         |
//+------------------------------------------------------------------+
#define _memberInitializerList _set(sunday), _set(monday), _set(tuesday), _set(wednesday), _set(thursday), _set(friday), _set(saturday)
class CDayOfWeekFilterBase
  {
protected:
   const bool sunday;
   const bool monday;
   const bool tuesday;
   const bool wednesday;
   const bool thursday;
   const bool friday;
   const bool saturday;
//---
#define _set(a) a(from.##a)
protected:
              CDayOfWeekFilterBase(const CDayOfWeekFilterBase& from) : _memberInitializerList {}
#undef _set
#define _set(a) a(a_##a)
public:
              CDayOfWeekFilterBase(bool a_sunday, bool a_monday, bool a_tuesday, bool a_wednesday, bool a_thursday, bool a_friday,bool a_saturday)
                 : _memberInitializerList {}
#undef _set
  };
#undef _memberInitializerList

//+------------------------------------------------------------------+
//| CDayOfWeekFilter.mqh                                             |
//+------------------------------------------------------------------+

//--- Вместо #include "TimeMgr.mqh"
class CTimeMgr 
  {
public:
   static MqlDateTime curr;
  };
MqlDateTime CTimeMgr::curr;
//---

#define _check(a)                                                                               \
   switch((ENUM_DAY_OF_WEEK)(a))                                                                \
     {                                                                                          \
      case SUNDAY: return(sunday);                                                              \
      case MONDAY: return(monday);                                                              \
      case TUESDAY: return(tuesday);                                                            \
      case WEDNESDAY: return(wednesday);                                                        \
      case THURSDAY: return(thursday);                                                          \
      case FRIDAY: return(friday);                                                              \
      case SATURDAY: return(saturday);                                                          \
      default:                                                                                  \
         Print(__FUNCTION__" Unexpected day of the week: ", EnumToString(ENUM_DAY_OF_WEEK(a))); \
         return(false);                                                                         \
     }
//---

class CDayOfWeekFilter : public CDayOfWeekFilterBase
  {
public:
   bool checkSpecific(const MqlDateTime &var) { _check(var.day_of_week)            }
   bool checkCurrent()                        { _check(CTimeMgr::curr.day_of_week) }
        CDayOfWeekFilter(const CDayOfWeekFilterBase &config) : CDayOfWeekFilterBase(config) {}
  };

//---
#undef _check