Комментарии 65
А вообще да, бывает, что сначала «анализатор не прав», а потом бьёшь себя по лбу. Поэтому предпочитаю, чтобы мои проекты все анализаторы проходили «на ноль».
#define CURSOR_SHOWING 0x00000001
Почему такой код вообще прошел ревью.
Qt тащемта мультиплатформенный.
Вот в Linux — да, могло бы быть.
В новых заголовочных файлах может быть какая-то функция перенаправлена на новую реализацию с новыми константами. То есть старый софт со старым ABI будет вызывать старую функцию со старыми константами, а новоскомпилированный — под тем же названием новую функцию с другими (бывает что с другими форматами структур вообще), которые в новом .h естественно учтены.
А вот то, что выше (Gtk+ и прочее) — это тихой ужас.
Хочешь — ставишь, хочешь — не ставишь.Прекрасная идея. И как вы собираетесь писать программу, которая будет адекватно выглядеть у человека с Ubuntu или Fedora? Правильно реагировать на смену темы (светлая/тёмная/etc), на тыкание на иконку в трее (как вы её вообще туда поместите, кстати?) и так далее.
В том-то и дело, что для человка который пишет программу для себя и не собирается её распространять — в Linux всё нормально.
Но как только вы попытаетесь сделать хоть что-нибудь для людей — всё, катастрофа, совместимости нет, то что должно занимать часы превращается в многолетнюю борьбу и отбивает всякую охоту что-либо «для этих идиотов» делать…
В Windows такое делается за час и работает (если правильно скомпилировать) и в Windows XP и в Windows 2010. А если взять компилятор постарше — то будет и в Windows 95 работать с теми же исходниками.
А куда нас «великолепная совместимость» Qt доведёт?
Вот с API может быть не очевидно и если сегодня функция пустышка не делает ничего, то завтра из-за отсутствия вызова «бесполезной» функции всё сломается.И это пример плохого API. Не нужно надеяться, что кто-то будет читать доку. Если функцию нужно обязательно вызывать — нужно сделать так, чтобы её невызов «наказывался» как-нибудь.
А функции get_some и пустую return_some реализовать как-нибудь так, чтобы всё работало.
Контракты должны проверяться. Это истина, проверенная временем. Нельзя просто в документации про них написать и надеяться на то, что их будут соблюдать. Не будут. И не по злому умыслу, а потому что errare humanum est.
Если вы рассчитываете, что у вас в будущем будет по
return_some
память освобождаться… поставьте там, хотя бы, счётчик. И напишите строк 20 кода, который будет проверять что всё корректно используется.Да, собственно, раз уж вы про
soname
завели речь. Пожалуйста, полюбуйтесь:void* soinfo::to_handle() {
if (get_application_target_sdk_version() < __ANDROID_API_N__ || !has_min_version(3)) {
return this;
}
return reinterpret_cast<void*>(get_handle());
}
Почему bionic возвращает handle как указатель для старых приложений и/или для библиотек, у который version_
имеет версию ниже 3? Откуда, чёрт побери, вообще могут взяться version_
с версией ниже 3, если у нас в конструкторе написано?
#define SOINFO_VERSION 4
...
version_ = SOINFO_VERSION;
Что вообще происходит?А очень просто: разработчики приложений, обнаружив, что
dlopen
возвращает ссылку на soinfo
с радостью начали это использовать. И вставлять свои soinfo
в этот список.И им, в общем, было наплевать — что и как с этим будут разработчики OS делать в будущих версиях. У разработчиков свои задачи, у разработчиков приложений — свои.
Ну а дальше — имеем то, что имеем…
Не будет разработчики читать доку и использовать API «как описано». Они будут «действовать по наитию», а в сложных случаях — читать год (даже если нет исходников всегд можно дизассемблировать). И будут делать программу минимальными усилиями.
Если после прочтения кода станет ясно, что есть два способа: «правильный» на 100 строк и неправильный на 3… будут использовать неправильный способ — и вы ничего с этим не сможете поделать… ваша задача сделать так, чтобы «правильный» способ занимал 30 строк, а «неправильный»… ну скажем, 300 — тогда всё будет хорошо.
Было бы хорошо, если бы ещё enum-ы в C/C++ не замусоривали пространство имён. Ибо должно быть CursorState::Showing
и никак иначе. Очень надеюсь, что обычный enum станет deprecated в одной из будущих версий C++.
enum
смог стать deprecated нужно, чтобы был действенный механизм переключения. Пока такого нет. auto_ptr
смогли выпилить потому только, что он был слишком ущербен и его, по большому счёту, никто и никогда не использовал.Было бы хорошо, если бы ещё enum-ы в C/C++ не замусоривали пространство имён. Ибо должно быть CursorState::Showing и никак иначе.
enum class ведь решает проблему, а обратную совместимость вряд ли станут так гробить.
Не люблю я "верблюжьи имена". Всегда пишу только в нижнем регистре с разделением подчеркиваниями.
Ну, с Qt еще куда ни шло. До очередного мажорного релиза, они, разумеется, вряд ли смогут поменять naming convention (учитывая, что он еще гвоздями к QtQuick прибит).
А вот кошмар во FreeRTOS — это да, страх и ужас, на который сами разработчики говорят "извините, но мы боимся ломать код всех наших клиентов, потому терпите"
Пишу или_так, ИлиТак.
писать_всё_в одном_стиле конечно_тоже вариант, но_глазу_не за_что_ухватиться при_разборе более-менее длинного_выражения.
Я, например, комбинирую, названия_классов и ИменаОбъектов.с_именами_функций().
Я, например
вот именно, что вы, а не все. А ведь помимо регистровой разницы еще бывают SmurfSmurf SmurfNaming, m_lpcwstrВенгерка, тлкСглсн (CamelCase/snake_case/beercase вариации), различные Способы выденения_ _членов this->класса, СПрефиксы СТипа ССущности (E — Enums, T — Types, etc.). Еще больше усугубляет проблему тот факт, что в стандарте верхний регистр не задействован, а некоторые функции в beercase вместо snake_case. Не хватает единообразия во всем этом зоопарке.
Как же просто всё в Java: ClassName, varName, methodName, CONST_NAME.
Хотя в общем и целом можно константы именовать так же, как и обычные переменные. Тогда не будет видно, что это константа, но зато сразу единый стиль для любой переменной (константной или нет).
Как же просто всё в Java: ClassName, varName, methodName, CONST_NAME
CONST_NAME пришло в Java качестве одного из стилей C.
На мой взгляд, для Java это смотрится достаточно чужеродно, хотя хорошо уже то, что это стандарт.
Больше импонирует C#-подход, когда константы выносятся в отдельный статический класс и именуются в PascalCase:
Path.DirectorySeparatorChar
Path.AltDirectorySeparatorChar
Хотя иногда, как в случае того же Path, констатанты могут смешиваться с методами в одном классе.
Хуже, когда в C# пытаются переносить Java-стандарт объявления констант (встречал в паре проектов): для C# это совсем чужеродно и размывает уже имеющиеся в языке стандарты.
Я бы заменил в заголовке слово "человека" на слово "Андрея".
О, до Qt добрались!
А с Qt Creator работает?
Есть несколько десятков живых проектов на Qt под Linux — было бы здорово их проверить.
Должно быть три предупреждения:
- Имя не соответствует соглашению о наименовании
- Имя имеет регистронезависимое совпадение
- Ну и что там сейчас про константу
Я добровольно-принудительно задаю правила по всем именованиям в решарпере для всего проекта. Да и вообще считаю хорошей практикой использовать инструменты для проверки codestyle. В моём случае решарпер бы сразу подсветил опасное место.
enum { cursorShowing = 0x1, cursorSuppressed = 0x2 };
кстати коде-стайл нарушен, значения енумов в Qt именуются с БольшойБуквы.Тут не анализатор нужен, а clang-tidy/clang-formatter который должен бить по рукам тем кто не по код-стайл пишет.
В очередной раз анализатор PVS-Studio оказался внимательнее человека