Re[18]: JetBrains
От: so5team https://stiffstream.com
Дата: 17.04.16 19:02
Оценка: +1
Здравствуйте, mgu, Вы писали:

S>>Можно поинтересоваться, что такое C++9 и зачем в контексте разговора про C++11 и MSVS2013 вы говорите про "знакомство со сборщиком мусора"?


mgu>

mgu>Visual C++ 2008 (also known as Visual C++ 9.0) was released in November 2007. This version supports .NET 3.5.

mgu>( https://en.wikipedia.org/wiki/Visual_C%2B%2B )

Похоже, вы из тех, кто владеет языком программирования Visual C++.

mgu>Про сборщик мусора говорю в качестве примера заимствования из других, знакомых мне языков.


Может расскажите, где и когда C++11 позаимствовал у кого-нибудь сборщик мусора?

В качестве подсказки: когда речь идет о C++11, то это не версии Visual C++. Это ISO-шный стандарт C++ от 2011-го года.

mgu>Опять, я про "вообще", а вы в ответ частный случай. Конкретно код AlexGin-а у меня не вызвал столь безаппеляционного заявления.


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

mgu>Предъявите свой код, чтобы мы хотя бы могли одним глазком увидеть Совершенство.


Найти примеры кода несложно, соответствующая ссылка присутствует в каждом посте.
Кроме того, я и в бытность профессиональным программистом писал так себе, ни в коем разе не претендуя на совершенство (тем более на Совершенство). А сейчас и подавно. Проблема, однако, в том, что AlexGin делает это еще хуже.
Re[15]: JetBrains
От: mgu  
Дата: 17.04.16 19:14
Оценка:
Здравствуйте, qxWork, Вы писали:

mgu>>И я объясню по-другому: у Майкрософта дела в смысле продаваемости ещё лучше. Вот только в последние годы это достигается вовсе не качеством продукта.

W>А Вы, оказывается, эксперт во всем. Снимаю шляпу.

Да не эксперт, просто чувствую проделки Майкрософта на собственной шкуре. А знание ЕЕЕ относится к основам.

mgu>>А чем тогда занимаются сотни других программистов?

W>Кто чем. Кто шьет другие костюмы, кто подводные лодки конструирует. Некоторые пуговицы пришивают.
W>С какой целью интересуетесь?

Просто был озадачен: если один шьёт костюм, то что делает масса других портных? У вас же не кустарное производство.

mgu>>А вы удалите свой опыт в JetBrains, замените имя и способ связи. И ждите похоронку.

W>Классно, а вместо него что написать? Груши околачивал?

Н-да, сразу видны особенности "коробочной" конторы, опыта взаимодействия с заказчиками не наблюдается. "Ну, придумайте сами, ведь вы же программист!" (с).

W>А что вместо другого опыта писать?


Сделайте небольшой рефакторинг опыта, например, оставьте опыт в JetBrains, заметите явные следы, а название конторы измените на, скажем, BestTrueSoft.

W>Он проверяется на раз любым даже бестолковым рекрутером.


Это если проверяется. Вы недооцениваете бестолковость инженеров человеческих навыков.

W>>>И что я должен сделать когда это резюме приедет ко мне?

mgu>>А что, вы помимо написания продукта в одно лицо ещё и все резюме обрабатываете?! Аркадий Паровозов, перелогиньтесь!
W>Зачем все? Но все интересные резюме в ReSharper и частично в другие .NET-команды проходят через меня.

Откликнитесь на другие вакансии.

А "интересные" по каким критериям? Спрашиваю не корысти ради (у вас с опытом больше 6 лет не требуются), просто любопытно с целью повышения образованности.
Re[18]: JetBrains
От: mgu  
Дата: 17.04.16 19:24
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>Здравствуйте, so5team, Вы писали:


S>>Можно поинтересоваться, что такое C++9


BZ>98


Visual C++ 2008 (also known as Visual C++ 9.0) ( https://en.wikipedia.org/wiki/Visual_C%2B%2B )

S>>и зачем в контексте разговора про C++11 и MSVS2013 вы говорите про "знакомство со сборщиком мусора"?


BZ>очевидно потому что он якобы включён в стандарт. он же не знает как дела обстоят на самом деле


Он включён в дополнительные возможности.

A __gc type is a C++ language extension that simplifies .NET Framework programming by providing features such as interoperability and garbage collection.


https://msdn.microsoft.com/en-us/library/4xs93xhk.aspx
Re[11]: JetBrains
От: mgu  
Дата: 17.04.16 19:39
Оценка:
Здравствуйте, devromik, Вы писали:

mgu>>Выделил ключевые слова, определяющие черты личности, возможно, они принесли вам успех.


D> Психолог?


Нет, "программер, чо?".

D>Насчёт IDEA: https://www.youtube.com/watch?v=ZS6t7p2gZW8


Что только люди ни обсуждают! У них, наверно, интернет телефонный.
Re[19]: JetBrains
От: mgu  
Дата: 17.04.16 21:12
Оценка: -1
Здравствуйте, so5team, Вы писали:

S>Здравствуйте, mgu, Вы писали:


S>>>Можно поинтересоваться, что такое C++9 и зачем в контексте разговора про C++11 и MSVS2013 вы говорите про "знакомство со сборщиком мусора"?


S>Похоже, вы из тех, кто владеет языком программирования Visual C++.


Придирка засчитана (клянусь SQL-92), да, действительно это "среда разработки", однако и С++ в ней с диалектными особенностями. Заранее признаЮ, что MFC, VCL, ATL -- это также не языки и даже не стандарты С++, однако за ними часто и языка-то не видно.
mgu>>Про сборщик мусора говорю в качестве примера заимствования из других, знакомых мне языков.

S>Может расскажите, где и когда C++11 позаимствовал у кого-нибудь сборщик мусора?


Взглянул на стандарт С++11 -- появились лямбды! Тогда снимаю своё заявление насчёт "сборщика мусора" и заменяю на корректную лямбду, которой не осталось, пожалуй, только в HTML-е. Суть от этого не меняется: то, что узкому специалисту по С++ кажется откровением свыше, давно используется в других языках.

S>В качестве подсказки: когда речь идет о C++11, то это не версии Visual C++. Это ISO-шный стандарт C++ от 2011-го года.


Да-да-да, как и HTML5, который везде требуется, вот только ничем полностью не поддерживается, так что приходится писать с диалектными особенностями.

S>Вы, помнится, удивлялись, почему вам сложно найти работу.


В моём возрасте уже давно ничему не удивляются.

S>Если и вы программируете так, как это демонстрирует AlexGin, то это не удивительно. И ваш стиль общения, с демонстрацией незаурядных болтологических качеств, -- это всего лишь отягчающий фактор.


А что, вышел стандарт программиста Аутист-11? Мне просто по должностным обязанностям приходилось писать на человеческом языке столько же, сколько и на компьютерном, оттого и кажущаяся болтливость.

S>Найти примеры кода несложно, соответствующая ссылка присутствует в каждом посте.

S>Кроме того, я и в бытность профессиональным программистом писал так себе, ни в коем разе не претендуя на совершенство (тем более на Совершенство). А сейчас и подавно. Проблема, однако, в том, что AlexGin делает это еще хуже.

Взглянул на ваше позднее творчество, заранее извиняюсь, если проглядел что-либо выдающееся, поэтому, кстати, я и просил конкретный кусок кода. Адепты фигурных скобочек вас бы разорвали на части, объектно-ориентированность практически не задействована, меня же зацепили такие пассажи:

if( demands < 3 )
    demands = 1;
else
    demands -= 2;


    unsigned int m_current_position = 0;
    bool m_current_tick_processed = false;


    lock.unlock();

    while( head )
    {
        try
        {
            ...
        }
        ...
        catch( ... )
        {
            ...
            std::abort();
        }

        head = head->m_next;
    }

    lock.lock();


Код может сказать многое даже о личных качествах. Например, очевидно, что вы одинокий и непьющий. Иначе в файле all.hpp (3000+ строк) вы бы не попадали по ползунку полосы прокрутки, а коллеги после нескольких слияний устроили бы вам тёмную.
Re[20]: JetBrains
От: so5team https://stiffstream.com
Дата: 17.04.16 21:46
Оценка:
Здравствуйте, mgu, Вы писали:

mgu>Суть от этого не меняется: то, что узкому специалисту по С++ кажется откровением свыше, давно используется в других языках.


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

S>>В качестве подсказки: когда речь идет о C++11, то это не версии Visual C++. Это ISO-шный стандарт C++ от 2011-го года.


mgu>Да-да-да, как и HTML5, который везде требуется, вот только ничем полностью не поддерживается, так что приходится писать с диалектными особенностями.


Ваше мнение по поводу стандарта C++ и уровня его поддержки в современных компиляторах очень ценно.

mgu>Взглянул на ваше позднее творчество, заранее извиняюсь, если проглядел что-либо выдающееся, поэтому, кстати, я и просил конкретный кусок кода. Адепты фигурных скобочек вас бы разорвали на части, объектно-ориентированность практически не задействована, меня же зацепили такие пассажи:


Могу попросить объяснить, что не понравилось в этих двух фрагментах?

В первом фрагменте прошу учесть, что demands -- это переменная типа unsigned int. Надеюсь, ваш уровень знаний C++ позволяет понять, чем грозит переход через 0 при декрементах unsigned значений?

mgu>
mgu>if( demands < 3 )
mgu>    demands = 1;
mgu>else
mgu>    demands -= 2;
mgu>


Ну а к этому в чем претензия? Особенно с учетом того, что это часть описания класса?

mgu>
mgu>    unsigned int m_current_position = 0;
mgu>    bool m_current_tick_processed = false;
mgu>


А вот тут я должен пояснить. Внутри while вызываются заданные пользователем callback-и. К callback-ам предъявляется требование -- они не должны выпускать наружу исключения. Но в C++ пока нет синтаксических конструкций, которые бы позволяли сделать такое ограничение более формальным (спецификатор noexcept в C++11/14 не является частью сигнатуры функции, кроме того, в обсуждавшемся выше по ветке MSVS2013 его вообще нет). Посему приходится выполнять вызов callback-а внутри try-catch, дабы при возникновении исключения прервать выполнение программы из-за нарушения контракта. Отсюда и вызов std::abort.

Почему при этом вы попытались заострить внимание на вызовах unlock и lock -- это загадка. Если поясните, будет интересно.

mgu>
mgu>    lock.unlock();

mgu>    while( head )
mgu>    {
mgu>        try
mgu>        {
mgu>            ...
mgu>        }
mgu>        ...
mgu>        catch( ... )
mgu>        {
mgu>            ...
mgu>            std::abort();
mgu>        }

mgu>        head = head->m_next;
mgu>    }

mgu>    lock.lock();

mgu>


mgu>Иначе в файле all.hpp (3000+ строк) вы бы не попадали по ползунку полосы прокрутки


В vim-е нет полосы прокрутки. Кроме того, вы наверняка не видели sqlite.c и не слышали про такую технику, как amalgamation.
Re[21]: JetBrains
От: mgu  
Дата: 18.04.16 00:30
Оценка:
Здравствуйте, so5team, Вы писали:

S>Суть была в том, что AlexGin показывал, что его опыт нельзя назвать устаревшим. Но делал это несколько странно, на что ему и было указано. Но тут появляетесь вы, пытаетесь доказать, что главное -- это не знание каких-то там деталей, а приобретенный годами опыт. При этом демонстрируя замечательную невежественность в вопросах, которые мы с AlexGin обсуждали.


Ну не знаю я С++11, это и есть "замечательная невежественность"?

S>Ваше мнение по поводу стандарта C++ и уровня его поддержки в современных компиляторах очень ценно.


Таки полностью не поддерживается:
https://msdn.microsoft.com/ru-ru/library/hh567368.aspx

S>Могу попросить объяснить, что не понравилось в этих двух фрагментах?


S>В первом фрагменте прошу учесть, что demands -- это переменная типа unsigned int. Надеюсь, ваш уровень знаний C++ позволяет понять, чем грозит переход через 0 при декрементах unsigned значений?


mgu>>
mgu>>if( demands < 3 )
mgu>>    demands = 1;
mgu>>else
mgu>>    demands -= 2;
mgu>>


Я просто имел в виду тернарную операцию (входит даже в пещерные стандарты С++).

S>Ну а к этому в чем претензия? Особенно с учетом того, что это часть описания класса?


mgu>>
mgu>>    unsigned int m_current_position = 0;
mgu>>    bool m_current_tick_processed = false;
mgu>>


Виноват, я был слишком высокого мнения о создателях С++11: думал, что раз они содрали инициализацию динамических членов класса, то догадаются их инициализировать по умолчанию. Ан нет.

S>Почему при этом вы попытались заострить внимание на вызовах unlock и lock -- это загадка. Если поясните, будет интересно.


mgu>>
mgu>>    lock.unlock();

mgu>>    while( head )
mgu>>    {
mgu>>        try
mgu>>        {
mgu>>            ...
mgu>>        }
mgu>>        ...
mgu>>        catch( ... )
mgu>>        {
mgu>>            ...
mgu>>            std::abort();
mgu>>        }

mgu>>        head = head->m_next;
mgu>>    }

mgu>>    lock.lock();

mgu>>


Во-первых, крайне необычно сначала разблокировать, а затем блокировать, напрашивается обратный порядок, возможно, на то были причины. А std::abort() выкидывает без всяких очисток, это потенциальная мина, возможно, понадобится закрывать ресурсы или выбрасывать новое исключение в глобальный обработчик, а перед этим восстанавливать загадочный lock(). В общем, надо что-то делать либо с финализацией, либо при ошибке выставлять локальный флаг и выходить из while.

mgu>>Иначе в файле all.hpp (3000+ строк) вы бы не попадали по ползунку полосы прокрутки


S>В vim-е нет полосы прокрутки.


А в других редакторах есть.

S>Кроме того, вы наверняка не видели sqlite.c и не слышали про такую технику, как amalgamation.


Не слышал, ознакомился, понял, что иногда сталкивался с подобной необходимостью, но термина не знаю. Зато с многотысячестрочными простынями (точнее, сари) имел дело. Предпочитаю вместо иллюзорного выигрыша в производительности делать разбиение на логические единицы.
Re[13]: JetBrains
От: pagid Россия  
Дата: 18.04.16 04:12
Оценка: 6 (1) +1
Здравствуйте, itslave, Вы писали:

I>Вы к примеру google docs или там outlook web access открывали когда нить?

Слабое подобие десктопных приложений.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[12]: JetBrains
От: _ABC_  
Дата: 18.04.16 04:17
Оценка:
Здравствуйте, AlexGin, Вы писали:

_AB>>Советовали добавить больше конкретного о том, что было сделано и собственной роли.

AG>Ну это практически то же самое.
Нет.

AG>Тут весь фокус в том, что любое резюме — это некоторого рода рекламный листок. Любой работодатель прекрасно понимает это.

Тут весь фокус в том, что конкретное то твоё резюме, которое ты выложил — это антиреклама тебя.
Re[22]: JetBrains
От: so5team https://stiffstream.com
Дата: 18.04.16 05:29
Оценка: +1
Здравствуйте, mgu, Вы писали:

S>>При этом демонстрируя замечательную невежественность в вопросах, которые мы с AlexGin обсуждали.


mgu>Ну не знаю я С++11, это и есть "замечательная невежественность"?


В контексте разговора про опыт "C++11; MSVS-2013; Qt5-древний опыт" -- да.

S>>Ваше мнение по поводу стандарта C++ и уровня его поддержки в современных компиляторах очень ценно.


mgu>Таки полностью не поддерживается:

mgu>https://msdn.microsoft.com/ru-ru/library/hh567368.aspx

Какие-то у вас ограниченные источники информации. В современных реалиях для C++ника гораздо важнее черпать информацию из других мест. А то получится как с AlexGin, который никак не может осознать, что сейчас разработка на Visual C++ для Windows -- это довольно узкая ниша. А соответствующий опыт можно считать довольно древним.

mgu>>>
mgu>>>if( demands < 3 )
mgu>>>    demands = 1;
mgu>>>else
mgu>>>    demands -= 2;
mgu>>>


mgu>Я просто имел в виду тернарную операцию (входит даже в пещерные стандарты С++).


Уверяю вас, если бы было записано однострочником:
demands = demands < 3 ? 1 : (demands-2);

то нашлись бы ярые противники использования тернарных операторов. Книга одного из них, с большим опытом разгребания Windows-only говнокода, обсуждается сейчас в профильном форуме. Там как раз совет №4 звучит как "Бойтесь оператора ?: и заключайте его в круглые скобки".

Так что вы придрались к синтаксису. К коду AlexGin сходу можно предъявлять претензии гораздо более серьезные.

S>>Ну а к этому в чем претензия? Особенно с учетом того, что это часть описания класса?


mgu>>>
mgu>>>    unsigned int m_current_position = 0;
mgu>>>    bool m_current_tick_processed = false;
mgu>>>


mgu>Виноват, я был слишком высокого мнения о создателях С++11: думал, что раз они содрали инициализацию динамических членов класса, то догадаются их инициализировать по умолчанию. Ан нет.


Во-первых, фраза "динамические члены класса" применительно к C++ режет слух. Что еще больше утверждает в мысли, что вы пытаетесь судить о том, в чем не разбираетесь.

Во-вторых, в C++ в угоду скорости исполнения поля объектов не инициализируются, если это не указано явно разработчиком. Посему даже инициализация поля дефолтным значением должна происходить явно. Либо в конструкторе (что работает, емнип, со времен C++98/03):
my_class::my_class(bla-bla-bla)
  : m_current_position(), m_current_tick_processed(), ...
  {}

Либо при описании поля (что доступно с C++11):
class my_class {
  ...
  unsigned int m_current_position{};
  bool m_current_tick_processed{};
};

Однако, в данном случае то, что нужные мне начальные значения одновременно являются дефолтными -- это совпадение. Поэтом, дабы сделать код более очевидным и упростить сопровождение, начальные значения прописаны явно.

mgu>Во-первых, крайне необычно сначала разблокировать, а затем блокировать, напрашивается обратный порядок, возможно, на то были причины.


Т.е. вы не разобрались с тем, что делает код и почему он это делает именно так, но претензии предъявили?

Причины, действительно, были. Сначала под захваченным mutex-ом из общего списка таймеров выделяется подсписок таймеров, для которых уже наступило время исполнения. Затем mutex освобождается и у всех таймеров из подсписка вызывается заданный пользователем callback. После чего mutex захватывается вновь для того, чтобы была возможность вернуть периодические таймеры обратно в общий список. Вызов callback-ов нужно делать при освобожденном mutex-е по двум основным причинам:

mgu>А std::abort() выкидывает без всяких очисток, это потенциальная мина, возможно, понадобится закрывать ресурсы или выбрасывать новое исключение в глобальный обработчик, а перед этим восстанавливать загадочный lock(). В общем, надо что-то делать либо с финализацией, либо при ошибке выставлять локальный флаг и выходить из while.


А известно ли вам, что в C++ не принято выбрасывать исключения из деструкторов? Поскольку если такое исключение выскочит при раскрутке стека из-за ранее возникшего исключения, то сам ран-тайм тупо завет std::terminate (суть std::abort()). И это считается нормально: пользователь нарушил контракт, получил по рукам, ибо обеспечить восстановление после такого нарушения контракта возможно далеко не всегда. Так же и здесь -- нельзя выпускать исключения из callback-а. Поскольку некому его будет обрабатывать на отдельной рабочей нити, на которой и происходят вызовы callback-ов.

S>>Кроме того, вы наверняка не видели sqlite.c и не слышали про такую технику, как amalgamation.


mgu>Не слышал, ознакомился, понял, что иногда сталкивался с подобной необходимостью, но термина не знаю. Зато с многотысячестрочными простынями (точнее, сари) имел дело. Предпочитаю вместо иллюзорного выигрыша в производительности делать разбиение на логические единицы.


Ну посмотрите на размеры заголовочных файлов random, regex, algorithm, vector из состава Visual C++ к примеру. Или на basic_string.h из libstdc++. Что предложите с ними сделать?

Конкретно в моем случае определение всего в одном файле связано совсем не с вопросами производительности, а с удобством распространения библиотеки. Это header-only библиотека (не знаю, понимаете ли вы, что это такое). Посему отдать один заголовочный файл и подключить один-единственный заголовочный файл в другом месте гораздо проще. Кросс-платформенных и широкораспространненых менеджеров пакетов в C++ пока не завезли. Это тоже к вопросу опыта и его релевантности современным реалиям ИТ-шного рынка.
Re[14]: JetBrains
От: itslave СССР  
Дата: 18.04.16 07:37
Оценка:
Здравствуйте, AlexGin, Вы писали:
AG>Конечно, для простых аппликух можно выбрать и веб-мордочку
Вы не понимаете почему тренд развернулся в сторону веб приложений, и они вытеснили десктоп отовсюду, где перфоманс не очень неважен и юзабилити не критично.

AG>>>Богатый и развитый пользовательский интерфейс — забудем про Web-приложения!

I>>Вы к примеру google docs или там outlook web access открывали когда нить?
AG>Открою, посмотрю — просто ради любопытства
То вы их(или сравнимых по сложности веб приложений) до сих пор не открывали, говорит не в вашу пользу.
Re[14]: JetBrains
От: itslave СССР  
Дата: 18.04.16 07:39
Оценка:
Здравствуйте, mgu, Вы писали:

mgu>А чем тогда занимаются сотни других программистов?

Скажите, у вас не возникает вопросов, чем занимаются сотни(если не тысячи инженеров) в компаниях боинг или пратт-уитни?
Re[14]: JetBrains
От: itslave СССР  
Дата: 18.04.16 07:42
Оценка:
Здравствуйте, pagid, Вы писали:

P>Здравствуйте, itslave, Вы писали:


I>>Вы к примеру google docs или там outlook web access открывали когда нить?

P>Слабое подобие десктопных приложений.
Это сложные и функциональные веб приложения, о чем собственно говоря и речь. Согласен, юзабилити на сегодняшний день меньше чем у дектопгных аналогов, но речь ведь не о том.
Re[15]: JetBrains
От: pagid Россия  
Дата: 18.04.16 07:48
Оценка: 6 (1)
Здравствуйте, itslave, Вы писали:

I>Это сложные и функциональные веб приложения, о чем собственно говоря и речь.

Несомненно
I> Согласен, юзабилити на сегодняшний день меньше чем у дектопгных аналогов, но речь ведь не о том.
Именно о том.
Можно даже не забыть, что у этих приложений имеются дополнительные возможности связанные с их природой — по коллективной работе и возможности запускать на разных железках и ОС, но в целом функционально и по удобству применения это именно слабое подобие десктопных приложений.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[16]: JetBrains
От: itslave СССР  
Дата: 18.04.16 08:28
Оценка:
Здравствуйте, pagid, Вы писали:

P>Можно даже не забыть, что у этих приложений имеются дополнительные возможности связанные с их природой — по коллективной работе и возможности запускать на разных железках и ОС

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

P>но в целом функционально и по удобству применения это именно слабое подобие десктопных приложений.

Это смотря как использовать
Для огромного количества мелких/средних фирм и частных лиц, этих возможностей хватает с головой, при существенно меньшем головняке(админ не нужен) и ценах.
А UX подтянут
Re[23]: JetBrains
От: mgu  
Дата: 18.04.16 20:01
Оценка:
Здравствуйте, so5team, Вы писали:

mgu>>Ну не знаю я С++11, это и есть "замечательная невежественность"?


S>В контексте разговора про опыт "C++11; MSVS-2013; Qt5-древний опыт" -- да.


В таком случае признаю свою замшелось и ретроградство.

S>>>Ваше мнение по поводу стандарта C++ и уровня его поддержки в современных компиляторах очень ценно.


mgu>>Таки полностью не поддерживается:

mgu>>https://msdn.microsoft.com/ru-ru/library/hh567368.aspx

S>Какие-то у вас ограниченные источники информации. В современных реалиях для C++ника гораздо важнее черпать информацию из других мест.


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

S>А то получится как с AlexGin, который никак не может осознать, что сейчас разработка на Visual C++ для Windows -- это довольно узкая ниша. А соответствующий опыт можно считать довольно древним.


Да, узкая.

S>Уверяю вас, если бы было записано однострочником:

S>
S>demands = demands < 3 ? 1 : (demands-2);
S>

S>то нашлись бы ярые противники использования тернарных операторов. Книга одного из них, с большим опытом разгребания Windows-only говнокода, обсуждается сейчас в профильном форуме. Там как раз совет №4 звучит как "Бойтесь оператора ?: и заключайте его в круглые скобки".

У меня много знакомых программистов, обожающих порассуждать о Ювенале и при этом находящихся не в ладах с приоритетом операций, так что это пусть они боятся. В той ветке мне больше понравилось другое:

вы не сталкивались с любовью некоторых программистов обрабатывать ошибки через exit() в библиотечном коде? если функция не может вернуть ошибку (прототип у нее такой) и внезапно обнаружилось, что работая со входным буффером данных функция может его угробить если входные данные были некорректными, а программисту на все наплевать и лишь бы _формально_ выполнить задание вышестоящего программиста -- ну зачем нам думать как протащить обработку ошибок на верхний уровень, когда можно просто завершить работу всего приложения?

( http://rsdn.ru/forum/cpp/6419326 )

S>Так что вы придрались к синтаксису.


Да нет, к подходу -- налицо излишняя многословность. Против инкрементов у вас же возражений нет?

S>К коду AlexGin сходу можно предъявлять претензии гораздо более серьезные.


Например?

S>>>Ну а к этому в чем претензия? Особенно с учетом того, что это часть описания класса?


S>Во-первых, фраза "динамические члены класса" применительно к C++ режет слух. Что еще больше утверждает в мысли, что вы пытаетесь судить о том, в чем не разбираетесь.


Ваш термин для не статических членов класса в С++?

S>Во-вторых, в C++ в угоду скорости исполнения поля объектов не инициализируются, если это не указано явно разработчиком. Посему даже инициализация поля дефолтным значением должна происходить явно. Либо в конструкторе (что работает, емнип, со времен C++98/03)


Всё верно, вот только цель сомнительна, особенно для примитивных полей.

S>Т.е. вы не разобрались с тем, что делает код и почему он это делает именно так, но претензии предъявили?


Да. Кто виноват в проблеме -- тупой пользователь или напускающий туман и опускающий комментарии разработчик?

S>Причины, действительно, были.

S>...
S>эта операция может быть длительной (особенно если таймеров сотни тысяч), в это время нужно позволить параллельно работающим нитям работать с общим списком таймеров (выставлять новые или отменять существующие);

То есть в то время как всё прогрессивное человечество пишет синглтоны с двумя if-ами, вы позволяете внешним акторам хулиганить? Всё-таки привычнее видеть операции должным образом изолированными.

mgu>>А std::abort() выкидывает без всяких очисток, это потенциальная мина, возможно, понадобится закрывать ресурсы или выбрасывать новое исключение в глобальный обработчик, а перед этим восстанавливать загадочный lock(). В общем, надо что-то делать либо с финализацией, либо при ошибке выставлять локальный флаг и выходить из while.


S>А известно ли вам, что в C++ не принято выбрасывать исключения из деструкторов?


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

S>Поскольку если такое исключение выскочит при раскрутке стека из-за ранее возникшего исключения, то сам ран-тайм тупо завет std::terminate (суть std::abort()). И это считается нормально: пользователь нарушил контракт, получил по рукам, ибо обеспечить восстановление после такого нарушения контракта возможно далеко не всегда. Так же и здесь -- нельзя выпускать исключения из callback-а. Поскольку некому его будет обрабатывать на отдельной рабочей нити, на которой и происходят вызовы callback-ов.


Не выпускайте, ещё раз: выставляйте локальный флаг и выходите из while.

S>>>Кроме того, вы наверняка не видели sqlite.c и не слышали про такую технику, как amalgamation.


mgu>>Не слышал, ознакомился, понял, что иногда сталкивался с подобной необходимостью, но термина не знаю. Зато с многотысячестрочными простынями (точнее, сари) имел дело. Предпочитаю вместо иллюзорного выигрыша в производительности делать разбиение на логические единицы.


S>Ну посмотрите на размеры заголовочных файлов random, regex, algorithm, vector из состава Visual C++ к примеру. Или на basic_string.h из libstdc++. Что предложите с ними сделать?


Взять всё и поделить! (с) Шариков.

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

S>Конкретно в моем случае определение всего в одном файле связано совсем не с вопросами производительности, а с удобством распространения библиотеки. Это header-only библиотека (не знаю, понимаете ли вы, что это такое). Посему отдать один заголовочный файл и подключить один-единственный заголовочный файл в другом месте гораздо проще.


А чем dll вам не угодили? Для любителей hardcore можно предоставлять версии с отладочной информацией. Или фишка в компилировании под конкретные платформы?

S>Кросс-платформенных и широкораспространненых менеджеров пакетов в C++ пока не завезли. Это тоже к вопросу опыта и его релевантности современным реалиям ИТ-шного рынка.


Не смог согласовать первое предложение со вторым.
Re[15]: JetBrains
От: mgu  
Дата: 18.04.16 20:10
Оценка:
Здравствуйте, itslave, Вы писали:

mgu>>А чем тогда занимаются сотни других программистов?

I>Скажите, у вас не возникает вопросов, чем занимаются сотни(если не тысячи инженеров) в компаниях боинг или пратт-уитни?

Если один из инженеров скажет, что он в одиночку клепает самолёт, тогда возникнут.
Re[15]: JetBrains
От: mgu  
Дата: 18.04.16 20:15
Оценка:
Здравствуйте, itslave, Вы писали:

I>>>Вы к примеру google docs или там outlook web access открывали когда нить?

P>>Слабое подобие десктопных приложений.
I>Это сложные и функциональные веб приложения, о чем собственно говоря и речь. Согласен, юзабилити на сегодняшний день меньше чем у дектопгных аналогов, но речь ведь не о том.

В моём представлении usability -- это удобство использования, которое начинается с наличия навигации. А это от настольности или вебанутости не зависит.
Re[24]: JetBrains
От: so5team https://stiffstream.com
Дата: 18.04.16 20:53
Оценка:
Здравствуйте, mgu, Вы писали:

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


Гораздо важнее другой вопрос: когда библиотека поставляется в бинарном виде, как быть тогда? На ваш же вопрос ответ прост: поддержка С++11.

mng>И что им делать, если их текущий сборщик не переварит всех нововведений?


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

S>>Так что вы придрались к синтаксису.


mgu>Да нет, к подходу -- налицо излишняя многословность.


Разница только в количестве строк.

mgu> Против инкрементов у вас же возражений нет?


Инкременты откуда взялись?

S>>К коду AlexGin сходу можно предъявлять претензии гораздо более серьезные.


mgu>Например?


Да вот, первый же cpp-файл в репозитории. И сразу же:
bool SMSContentGreater(CSMSContent* pSMS1, CSMSContent* pSMS2) // Global function for std::sort
{
    CTime time1, time2;
    SYSTEMTIME st1, st2;
    if (pSMS1->GetSMSTime().GetAsSystemTime(st1))
        time1 = CTime(st1);
    if (pSMS2->GetSMSTime().GetAsSystemTime(st2))
        time2 = CTime(st2);

    time_t t1 = time1.GetTime();
    time_t t2 = time2.GetTime();

    if (t1 > t2)
        return true;
    else
        return false;
}

Здесь есть две последовательно выполняемые независимые операции -- извлечение времени в виде SYSTEMTIME и трансформация его в time_t через промежуточный CTime. Даже если предположить, что столь длинная цепочка нужна, то все равно непонятно, зачем нужны две пары переменных time1+time2 и st1+st2. Если можно обойтись всего одной переменной типа SYSTEMTIME и одной переменной типа CTime. Что-то вроде:
CTime ct;
SYSTEMTIME st;
if(pSMS1->GetSMSTime().GetAsSystemTime(st))
  ct = CTime(st);
time_t t1 = ct.GetTime();

if(pSMS2->GetSMSTime().GetAsSystemTime(st))
  ct = CTime(st);
time_t t2 = ct.GetTime();

Здесь становится очевидно, что имеется две однотипных операции и явная копи-паста. Которая устраняется через вспомогательную функцию:
namespace {
inline time_t GetTime(const CSMSContent & sms) {
  SYSTEMTIME st;
  return sms.GetSMSTime().GetAsSytemTime(st)) ? CTime(st).GetTime() : CTime().GetTime();
}
}

bool SMSContentGreater(CSMSContent * pSMS1, CSMSContent * pSMS2) {
  return GetTime(*pSMS1) > GetTime(*pSMS2);
}

И это все в рамках C++98/03, что несколько многословно. Можно воспользоваться возможностями не очень уже современного C++11 и имитацией локальных функций в нем:
bool SMSContentGreater(CSMSContent * pSMS1, CSMSContent * pSMS2) {
  auto GetTime = [](const CSMSContent & sms) {
    SYSTEMTIME st;
    return sms.GetSMSTime().GetAsSytemTime(st)) ? CTime(st).GetTime() : CTime().GetTime();
  };
  return GetTime(*pSMS1) > GetTime(*pSMS2);
}

Однако, особая пикантность ситуации состоит в том, что у CTime уже есть оператор "меньше". Посему непонятно, а зачем вообще нужна еще одна трансформация из CTime в time_t. Более того, очень похоже, что GetSMSTime уже возвращает объект типа CTime, у которого затем дергается GetAsSystemTime() дабы получить SYSTEMTIME. А затем из SYSTEMTIME вновь конструируется CTime... Чой-то неведомое.

И это только первая же функция в первом же файле. Смотрим этот же файл дальше:
CATCmdDevice::CATCmdDevice()
: m_pSerial(NULL), // Added 17.03.2015
  m_bIsGSMDeviceConnected(false) // Added 21.03.2015
{
    m_pTXBuff = NULL;  // Transmitter buffer
    m_pRXBuff = NULL;  // Reciver buffer

    m_bUnicodeMode = false;

    m_pPBRecord = NULL;

    m_bReceivedSMSListFull = false;
}

Конструктор. Только часть полей инициализируется через списки инициализации, часть -- в теле конструктора. Причем та часть, которая в теле конструктора, должна была бы инициализироваться в списках инициализации еще со времен C++98.

Дальше, деструктор:
CATCmdDevice::~CATCmdDevice()
{
    ClearSMSArr(); // Restored 01.10.2014

    if (m_pTXBuff)
    {
        delete[] m_pTXBuff;  
        m_pTXBuff = NULL;
    } 

    if (m_pRXBuff)
    {
        delete[] m_pRXBuff;  
        m_pRXBuff = NULL;
    }
}

Поля m_pTXBuff и m_pRXBuff объявлены в самом классе CATCmdDevice. Следовательно, занулять их в деструкторе после освобождения памяти смысла нет.

Опять же, на счет m_pTXBuff и m_pRXBuff: почему идет ручное управление памятью? Почему нельзя было воспользоваться std::vector (рекомендуемый путь со времен C++98)? Или вообще почему не сделать m_TXBuff и m_RXBuff обычными C-шными массивами?

Далее:
long CATCmdDevice::OpenSerial(int iComChannel, int iComBaudRate)
{
    if (m_pSerial)
        delete m_pSerial;

    m_pSerial = new CSerial();
    if (m_pSerial != NULL)
    {   // m_pSerial->Open(1, 9600);
        BOOL bOpen = m_pSerial->Open(iComChannel, iComBaudRate); 
        if(!bOpen)
        {
            g_log.SaveLogFile(PBK_ERROR, "Error during opening port: COM%u (baud rate = %u)",iComChannel,iComBaudRate);
            return 1L; // Error occur
        }
        else
            g_log.SaveLogFile(PBK_DEBUG, "Port: COM%u (baud rate = %u) - opening success!",iComChannel,iComBaudRate);
    }
    return 0L; // OK!
}

Что за проверка m_pSerial != NULL после new? Неужели автор транслирует свой код с запретом C++ных исключений на уровне ключей компилятора? Если даже он делает именно так, то где ветка else у этого if-а? А то ведь получается, что при запрещенных исключениях у него нет обработки ошибки выделения памяти (даже если в m_pSerial окажется 0, функция OpenSerial все равно вернет 0 в качестве признака успешного завершения). Если же исключения не запрещены, то данная проверка не имеет смысла, т.к. при недостатке памяти new бросит bad_alloc.

И это, повторюсь, всего лишь беглый просмотр всего лишь первого файла.

Несомненное достоинство данного кода -- это возможность в нем разобраться. Но общее впечатление, что его писал вчерашний студент, который только-только начал изучать язык C++.

По остальным вопросам в следующем ответе.
Re[24]: JetBrains
От: so5team https://stiffstream.com
Дата: 18.04.16 21:20
Оценка:
Здравствуйте, mgu, Вы писали:

S>>Во-первых, фраза "динамические члены класса" применительно к C++ режет слух. Что еще больше утверждает в мысли, что вы пытаетесь судить о том, в чем не разбираетесь.


mgu>Ваш термин для не статических членов класса в С++?


Поля, атрибуты, не статические члены класса.

S>>Во-вторых, в C++ в угоду скорости исполнения поля объектов не инициализируются, если это не указано явно разработчиком. Посему даже инициализация поля дефолтным значением должна происходить явно. Либо в конструкторе (что работает, емнип, со времен C++98/03)


mgu>Всё верно, вот только цель сомнительна, особенно для примитивных полей.


Это не важно. В C++ вот такое поведение. Ваше мнение по этому поводу не имеет значения.

S>>Т.е. вы не разобрались с тем, что делает код и почему он это делает именно так, но претензии предъявили?


mgu>Да.


Ok. На этом все ваши аппеляции якобы к имеющемуся у вас опыту разработки софта идут прямиком в /dev/null.

> Кто виноват в проблеме -- тупой пользователь или напускающий туман и опускающий комментарии разработчик?


Пользователи не смотрят в код. Разработчики смотрят в код и видят комментарии:
    /*!
     * \brief Execute all active timers in the sublist.
     *
     * Object is unlocked and locked back after sublist processing.
     */
    template< class UNIQUE_LOCK >
    void
    exec_actions(
        //! Object lock.
        //! This lock will be unlocked before execution of actions
        //! and locked back after.
        UNIQUE_LOCK & lock,
        //! Head of execution list.
        //! Cannot be nullptr.
        timer_type * head )
    {
        lock.unlock();

        while( head )

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

S>>эта операция может быть длительной (особенно если таймеров сотни тысяч), в это время нужно позволить параллельно работающим нитям работать с общим списком таймеров (выставлять новые или отменять существующие);


mgu>То есть в то время как всё прогрессивное человечество пишет синглтоны с двумя if-ами, вы позволяете внешним акторам хулиганить? Всё-таки привычнее видеть операции должным образом изолированными.


Сами-то поняли, что сказали?

S>>А известно ли вам, что в C++ не принято выбрасывать исключения из деструкторов?


mgu>Конечно, и не только в С++, это же любимые вопросы на интервью: по Джаве на тему повторного вызова деструктора, а по С# -- про сожительство деструктора и финализатора. Но под "очисткой" я понимал не только разрушение.


Только вам известно, что вы понимали. Но явно не то, о чем идет речь.

S>>Поскольку если такое исключение выскочит при раскрутке стека из-за ранее возникшего исключения, то сам ран-тайм тупо завет std::terminate (суть std::abort()). И это считается нормально: пользователь нарушил контракт, получил по рукам, ибо обеспечить восстановление после такого нарушения контракта возможно далеко не всегда. Так же и здесь -- нельзя выпускать исключения из callback-а. Поскольку некому его будет обрабатывать на отдельной рабочей нити, на которой и происходят вызовы callback-ов.


mgu>Не выпускайте, ещё раз: выставляйте локальный флаг и выходите из while.


Объясню еще раз. Есть отдельная рабочая нить, на которой вызываются заданные пользователем callback-и. Тот while, который вы видели в коде -- это один из циклов внутри данной нити. Callback-и не должны выбрасывать исключения, т.к. на данном контексте с ними сделать ничего нельзя. Соответственно, если пользователь нарушил контракт и выбросил исключение из callback-а, то возможности что-то с этим сделать нет. Поэтому, как результат нарушения контракта, вызывается std::abort.

Не хочет пользователь таких последствий -- пусть не выпускает исключений из своего кода (по аналогии с тем, как он не должен делать этого из деструкторов).

Все это становится понятно после хоть сколько нибудь серьезного погружения в тему. Чего вы не сделали, но выдвинули претензию к коду, в котором вам что-то не понравилось без понимания сути происходящего.

mgu>А чем dll вам не угодили? Для любителей hardcore можно предоставлять версии с отладочной информацией. Или фишка в компилировании под конкретные платформы?


Вы вообще в курсе, что кроме Windows с dll-ками есть еще туева хуча платформ? Как программных, так и аппаратных? Или вы думаете, что скомпилированные Visual C++ бинарные dll-ки переносятся с платформы на платформу так же, как это происходит с Java байт-кодом?

S>>Кросс-платформенных и широкораспространненых менеджеров пакетов в C++ пока не завезли. Это тоже к вопросу опыта и его релевантности современным реалиям ИТ-шного рынка.


mgu>Не смог согласовать первое предложение со вторым.


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