Здравствуйте, 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.
Похоже, вы из тех, кто владеет языком программирования Visual C++.
mgu>Про сборщик мусора говорю в качестве примера заимствования из других, знакомых мне языков.
Может расскажите, где и когда C++11 позаимствовал у кого-нибудь сборщик мусора?
В качестве подсказки: когда речь идет о C++11, то это не версии Visual C++. Это ISO-шный стандарт C++ от 2011-го года.
mgu>Опять, я про "вообще", а вы в ответ частный случай. Конкретно код AlexGin-а у меня не вызвал столь безаппеляционного заявления.
Вы, помнится, удивлялись, почему вам сложно найти работу. Если и вы программируете так, как это демонстрирует AlexGin, то это не удивительно. И ваш стиль общения, с демонстрацией незаурядных болтологических качеств, -- это всего лишь отягчающий фактор.
mgu>Предъявите свой код, чтобы мы хотя бы могли одним глазком увидеть Совершенство.
Найти примеры кода несложно, соответствующая ссылка присутствует в каждом посте.
Кроме того, я и в бытность профессиональным программистом писал так себе, ни в коем разе не претендуя на совершенство (тем более на Совершенство). А сейчас и подавно. Проблема, однако, в том, что AlexGin делает это еще хуже.
Здравствуйте, qxWork, Вы писали:
mgu>>И я объясню по-другому: у Майкрософта дела в смысле продаваемости ещё лучше. Вот только в последние годы это достигается вовсе не качеством продукта. W>А Вы, оказывается, эксперт во всем. Снимаю шляпу.
Да не эксперт, просто чувствую проделки Майкрософта на собственной шкуре. А знание ЕЕЕ относится к основам.
mgu>>А чем тогда занимаются сотни других программистов? W>Кто чем. Кто шьет другие костюмы, кто подводные лодки конструирует. Некоторые пуговицы пришивают. W>С какой целью интересуетесь?
Просто был озадачен: если один шьёт костюм, то что делает масса других портных? У вас же не кустарное производство.
mgu>>А вы удалите свой опыт в JetBrains, замените имя и способ связи. И ждите похоронку. W>Классно, а вместо него что написать? Груши околачивал?
Н-да, сразу видны особенности "коробочной" конторы, опыта взаимодействия с заказчиками не наблюдается. "Ну, придумайте сами, ведь вы же программист!" (с).
W>А что вместо другого опыта писать?
Сделайте небольшой рефакторинг опыта, например, оставьте опыт в JetBrains, заметите явные следы, а название конторы измените на, скажем, BestTrueSoft.
W>Он проверяется на раз любым даже бестолковым рекрутером.
Это если проверяется. Вы недооцениваете бестолковость инженеров человеческих навыков.
W>>>И что я должен сделать когда это резюме приедет ко мне? mgu>>А что, вы помимо написания продукта в одно лицо ещё и все резюме обрабатываете?! Аркадий Паровозов, перелогиньтесь! W>Зачем все? Но все интересные резюме в ReSharper и частично в другие .NET-команды проходят через меня.
Откликнитесь на другие вакансии.
А "интересные" по каким критериям? Спрашиваю не корысти ради (у вас с опытом больше 6 лет не требуются), просто любопытно с целью повышения образованности.
Здравствуйте, 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.
Здравствуйте, 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;
Код может сказать многое даже о личных качествах. Например, очевидно, что вы одинокий и непьющий. Иначе в файле all.hpp (3000+ строк) вы бы не попадали по ползунку полосы прокрутки, а коллеги после нескольких слияний устроили бы вам тёмную.
Здравствуйте, mgu, Вы писали:
mgu>Суть от этого не меняется: то, что узкому специалисту по С++ кажется откровением свыше, давно используется в других языках.
Суть была в том, что AlexGin показывал, что его опыт нельзя назвать устаревшим. Но делал это несколько странно, на что ему и было указано. Но тут появляетесь вы, пытаетесь доказать, что главное -- это не знание каких-то там деталей, а приобретенный годами опыт. При этом демонстрируя замечательную невежественность в вопросах, которые мы с AlexGin обсуждали.
S>>В качестве подсказки: когда речь идет о C++11, то это не версии Visual C++. Это ISO-шный стандарт C++ от 2011-го года.
mgu>Да-да-да, как и HTML5, который везде требуется, вот только ничем полностью не поддерживается, так что приходится писать с диалектными особенностями.
Ваше мнение по поводу стандарта C++ и уровня его поддержки в современных компиляторах очень ценно.
mgu>Взглянул на ваше позднее творчество, заранее извиняюсь, если проглядел что-либо выдающееся, поэтому, кстати, я и просил конкретный кусок кода. Адепты фигурных скобочек вас бы разорвали на части, объектно-ориентированность практически не задействована, меня же зацепили такие пассажи:
Могу попросить объяснить, что не понравилось в этих двух фрагментах?
В первом фрагменте прошу учесть, что demands -- это переменная типа unsigned int. Надеюсь, ваш уровень знаний C++ позволяет понять, чем грозит переход через 0 при декрементах unsigned значений?
mgu>
А вот тут я должен пояснить. Внутри while вызываются заданные пользователем callback-и. К callback-ам предъявляется требование -- они не должны выпускать наружу исключения. Но в C++ пока нет синтаксических конструкций, которые бы позволяли сделать такое ограничение более формальным (спецификатор noexcept в C++11/14 не является частью сигнатуры функции, кроме того, в обсуждавшемся выше по ветке MSVS2013 его вообще нет). Посему приходится выполнять вызов callback-а внутри try-catch, дабы при возникновении исключения прервать выполнение программы из-за нарушения контракта. Отсюда и вызов std::abort.
Почему при этом вы попытались заострить внимание на вызовах unlock и lock -- это загадка. Если поясните, будет интересно.
mgu>
Здравствуйте, 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>>
Я просто имел в виду тернарную операцию (входит даже в пещерные стандарты С++).
S>Ну а к этому в чем претензия? Особенно с учетом того, что это часть описания класса?
mgu>>
Виноват, я был слишком высокого мнения о создателях С++11: думал, что раз они содрали инициализацию динамических членов класса, то догадаются их инициализировать по умолчанию. Ан нет.
S>Почему при этом вы попытались заострить внимание на вызовах unlock и lock -- это загадка. Если поясните, будет интересно.
mgu>>
Во-первых, крайне необычно сначала разблокировать, а затем блокировать, напрашивается обратный порядок, возможно, на то были причины. А std::abort() выкидывает без всяких очисток, это потенциальная мина, возможно, понадобится закрывать ресурсы или выбрасывать новое исключение в глобальный обработчик, а перед этим восстанавливать загадочный lock(). В общем, надо что-то делать либо с финализацией, либо при ошибке выставлять локальный флаг и выходить из while.
mgu>>Иначе в файле all.hpp (3000+ строк) вы бы не попадали по ползунку полосы прокрутки
S>В vim-е нет полосы прокрутки.
А в других редакторах есть.
S>Кроме того, вы наверняка не видели sqlite.c и не слышали про такую технику, как amalgamation.
Не слышал, ознакомился, понял, что иногда сталкивался с подобной необходимостью, но термина не знаю. Зато с многотысячестрочными простынями (точнее, сари) имел дело. Предпочитаю вместо иллюзорного выигрыша в производительности делать разбиение на логические единицы.
Здравствуйте, AlexGin, Вы писали:
_AB>>Советовали добавить больше конкретного о том, что было сделано и собственной роли. AG>Ну это практически то же самое.
Нет.
AG>Тут весь фокус в том, что любое резюме — это некоторого рода рекламный листок. Любой работодатель прекрасно понимает это.
Тут весь фокус в том, что конкретное то твоё резюме, которое ты выложил — это антиреклама тебя.
Здравствуйте, 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>>>
Так что вы придрались к синтаксису. К коду AlexGin сходу можно предъявлять претензии гораздо более серьезные.
S>>Ну а к этому в чем претензия? Особенно с учетом того, что это часть описания класса?
mgu>>>
mgu>Виноват, я был слишком высокого мнения о создателях С++11: думал, что раз они содрали инициализацию динамических членов класса, то догадаются их инициализировать по умолчанию. Ан нет.
Во-первых, фраза "динамические члены класса" применительно к C++ режет слух. Что еще больше утверждает в мысли, что вы пытаетесь судить о том, в чем не разбираетесь.
Во-вторых, в C++ в угоду скорости исполнения поля объектов не инициализируются, если это не указано явно разработчиком. Посему даже инициализация поля дефолтным значением должна происходить явно. Либо в конструкторе (что работает, емнип, со времен C++98/03):
class my_class {
...
unsigned int m_current_position{};
bool m_current_tick_processed{};
};
Однако, в данном случае то, что нужные мне начальные значения одновременно являются дефолтными -- это совпадение. Поэтом, дабы сделать код более очевидным и упростить сопровождение, начальные значения прописаны явно.
mgu>Во-первых, крайне необычно сначала разблокировать, а затем блокировать, напрашивается обратный порядок, возможно, на то были причины.
Т.е. вы не разобрались с тем, что делает код и почему он это делает именно так, но претензии предъявили?
Причины, действительно, были. Сначала под захваченным mutex-ом из общего списка таймеров выделяется подсписок таймеров, для которых уже наступило время исполнения. Затем mutex освобождается и у всех таймеров из подсписка вызывается заданный пользователем callback. После чего mutex захватывается вновь для того, чтобы была возможность вернуть периодические таймеры обратно в общий список. Вызов callback-ов нужно делать при освобожденном mutex-е по двум основным причинам:
эта операция может быть длительной (особенно если таймеров сотни тысяч), в это время нужно позволить параллельно работающим нитям работать с общим списком таймеров (выставлять новые или отменять существующие);
внутри callback-а могут быть свои операции с общим списком таймеров. И такая политика работы позволяет избежать использования recursive_mutex (эффективность работы которого может отличаться от эффективности работы обычного 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++ пока не завезли. Это тоже к вопросу опыта и его релевантности современным реалиям ИТ-шного рынка.
Здравствуйте, AlexGin, Вы писали: AG>Конечно, для простых аппликух можно выбрать и веб-мордочку
Вы не понимаете почему тренд развернулся в сторону веб приложений, и они вытеснили десктоп отовсюду, где перфоманс не очень неважен и юзабилити не критично.
AG>>>Богатый и развитый пользовательский интерфейс — забудем про Web-приложения! I>>Вы к примеру google docs или там outlook web access открывали когда нить? AG>Открою, посмотрю — просто ради любопытства
То вы их(или сравнимых по сложности веб приложений) до сих пор не открывали, говорит не в вашу пользу.
Здравствуйте, mgu, Вы писали:
mgu>А чем тогда занимаются сотни других программистов?
Скажите, у вас не возникает вопросов, чем занимаются сотни(если не тысячи инженеров) в компаниях боинг или пратт-уитни?
Здравствуйте, pagid, Вы писали:
P>Здравствуйте, itslave, Вы писали:
I>>Вы к примеру google docs или там outlook web access открывали когда нить? P>Слабое подобие десктопных приложений.
Это сложные и функциональные веб приложения, о чем собственно говоря и речь. Согласен, юзабилити на сегодняшний день меньше чем у дектопгных аналогов, но речь ведь не о том.
Здравствуйте, itslave, Вы писали:
I>Это сложные и функциональные веб приложения, о чем собственно говоря и речь.
Несомненно I> Согласен, юзабилити на сегодняшний день меньше чем у дектопгных аналогов, но речь ведь не о том.
Именно о том.
Можно даже не забыть, что у этих приложений имеются дополнительные возможности связанные с их природой — по коллективной работе и возможности запускать на разных железках и ОС, но в целом функционально и по удобству применения это именно слабое подобие десктопных приложений.
Здравствуйте, pagid, Вы писали:
P>Можно даже не забыть, что у этих приложений имеются дополнительные возможности связанные с их природой — по коллективной работе и возможности запускать на разных железках и ОС
... а также не париться с деплойментом, поддержкой разных версий, хитрыми инсталяторами, которые работают при любой конфигурации харда-софта(ага, про зоопарк винды с сервис паками не забываем) на клиенте, существенно упрощается лицензирование, сапорт....
P>но в целом функционально и по удобству применения это именно слабое подобие десктопных приложений.
Это смотря как использовать
Для огромного количества мелких/средних фирм и частных лиц, этих возможностей хватает с головой, при существенно меньшем головняке(админ не нужен) и ценах.
А UX подтянут
Здравствуйте, 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>
У меня много знакомых программистов, обожающих порассуждать о Ювенале и при этом находящихся не в ладах с приоритетом операций, так что это пусть они боятся. В той ветке мне больше понравилось другое:
вы не сталкивались с любовью некоторых программистов обрабатывать ошибки через exit() в библиотечном коде? если функция не может вернуть ошибку (прототип у нее такой) и внезапно обнаружилось, что работая со входным буффером данных функция может его угробить если входные данные были некорректными, а программисту на все наплевать и лишь бы _формально_ выполнить задание вышестоящего программиста -- ну зачем нам думать как протащить обработку ошибок на верхний уровень, когда можно просто завершить работу всего приложения?
Да нет, к подходу -- налицо излишняя многословность. Против инкрементов у вас же возражений нет?
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++ пока не завезли. Это тоже к вопросу опыта и его релевантности современным реалиям ИТ-шного рынка.
Здравствуйте, itslave, Вы писали:
mgu>>А чем тогда занимаются сотни других программистов? I>Скажите, у вас не возникает вопросов, чем занимаются сотни(если не тысячи инженеров) в компаниях боинг или пратт-уитни?
Если один из инженеров скажет, что он в одиночку клепает самолёт, тогда возникнут.
Здравствуйте, itslave, Вы писали:
I>>>Вы к примеру google docs или там outlook web access открывали когда нить? P>>Слабое подобие десктопных приложений. I>Это сложные и функциональные веб приложения, о чем собственно говоря и речь. Согласен, юзабилити на сегодняшний день меньше чем у дектопгных аналогов, но речь ведь не о том.
В моём представлении usability -- это удобство использования, которое начинается с наличия навигации. А это от настольности или вебанутости не зависит.
Здравствуйте, mgu, Вы писали:
mgu>Спасибо за полезную ссылку, но вот что меня беспокоит: при вашей политике распространения библиотеки в виде исходного кода, как бедные пользователи будут угадывать правильный компилятор?
Гораздо важнее другой вопрос: когда библиотека поставляется в бинарном виде, как быть тогда? На ваш же вопрос ответ прост: поддержка С++11.
mng>И что им делать, если их текущий сборщик не переварит всех нововведений?
Искать что-нибудь более подходящее для себя. Написать свое. Заплатить за адаптацию под свои условия. Переделать самостоятельно. С исходным текстом можно делать все, что угодно.
S>>Так что вы придрались к синтаксису.
mgu>Да нет, к подходу -- налицо излишняя многословность.
Разница только в количестве строк.
mgu> Против инкрементов у вас же возражений нет?
Инкременты откуда взялись?
S>>К коду AlexGin сходу можно предъявлять претензии гораздо более серьезные.
mgu>Например?
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. Что-то вроде:
И это все в рамках C++98/03, что несколько многословно. Можно воспользоваться возможностями не очень уже современного C++11 и имитацией локальных функций в нем:
Однако, особая пикантность ситуации состоит в том, что у CTime уже есть оператор "меньше". Посему непонятно, а зачем вообще нужна еще одна трансформация из CTime в time_t. Более того, очень похоже, что GetSMSTime уже возвращает объект типа CTime, у которого затем дергается GetAsSystemTime() дабы получить SYSTEMTIME. А затем из SYSTEMTIME вновь конструируется CTime... Чой-то неведомое.
И это только первая же функция в первом же файле. Смотрим этот же файл дальше:
Конструктор. Только часть полей инициализируется через списки инициализации, часть -- в теле конструктора. Причем та часть, которая в теле конструктора, должна была бы инициализироваться в списках инициализации еще со времен C++98.
Поля m_pTXBuff и m_pRXBuff объявлены в самом классе CATCmdDevice. Следовательно, занулять их в деструкторе после освобождения памяти смысла нет.
Опять же, на счет m_pTXBuff и m_pRXBuff: почему идет ручное управление памятью? Почему нельзя было воспользоваться std::vector (рекомендуемый путь со времен C++98)? Или вообще почему не сделать m_TXBuff и m_RXBuff обычными C-шными массивами?
Что за проверка m_pSerial != NULL после new? Неужели автор транслирует свой код с запретом C++ных исключений на уровне ключей компилятора? Если даже он делает именно так, то где ветка else у этого if-а? А то ведь получается, что при запрещенных исключениях у него нет обработки ошибки выделения памяти (даже если в m_pSerial окажется 0, функция OpenSerial все равно вернет 0 в качестве признака успешного завершения). Если же исключения не запрещены, то данная проверка не имеет смысла, т.к. при недостатке памяти new бросит bad_alloc.
И это, повторюсь, всего лишь беглый просмотр всего лишь первого файла.
Несомненное достоинство данного кода -- это возможность в нем разобраться. Но общее впечатление, что его писал вчерашний студент, который только-только начал изучать язык C++.
Здравствуйте, 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>Не смог согласовать первое предложение со вторым.
Ничего удивительного. Вы пытаетесь рассуждать о теме, в которой не разбираетесь.