Заходят как‑то на Хабр С++ разработчики из крупных компаний, а у них спрашивают: что такое код‑ревью и используют ли они спецификатор final. Эти и другие вопросы с подвохом мы задали инженерам из YADRO, VK, Kaspersky, Syntacore и PVS‑Studio. В итоге обсудили инструменты для работы со сторонними зависимостями, интерфейсы «плюсовых» библиотек и отказ (или нет) от exceptions.

Продолжим дискуссию на митапе по С++, который пройдет онлайн 20 марта. Регистрируйтесь, подключайтесь к трансляции и пишите вопросы и комментарии в чат — ведущие озвучат некоторые из них.

Кто отвечает на вопросы

Илья Казаков

Разработчик в команде систем хранения данных в YADRO

Константин Владимиров

Руководитель отдела компиляторов и инструментов разработки в Syntacore

Александр Еналдиев 

Техлид в контентной фильтрации в Kaspersky 

Станислав Юрченко

Разработчик в VK AdTech

Евгений Фёклин

Разработчик ядра анализатора кода в PVS-Studio 

Продолжи фразу: «Код-ревью — это когда...»

Илья Казаков: Когда твои комментарии в интернете действительно читают.

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

Александр Еналдиев: Когда шрамы от баталий затягиваются, а код объективно становится лучше.

Станислав Юрченко: Когда код, в отличие от настроения, становится лучше. 

Евгений Фёклин: Когда ты уговариваешь кого-то посмотреть на код, который ты написал.

Что лучше: кидать exception или возвращать код ошибки? Можно ли отказаться от эксепшенов полностью?

Илья Казаков: В С++17 появились std::variant и std::optional и std::variant. В C++23 появился std::expected и монады для std::expected и std::optional. Не вижу никаких препятствий для удобной работы с кодами ошибок. Я обожаю помечать функции и методы с помощью noexcept и очень боюсь abort и std::terminate. Использую исключения только в конструкторах, а иногда вообще запрещаю конструкторы и пишу фабричные методы — спасибо __cpp_guaranteed_copy_elision. Исключения — зло, fight me.

Константин Владимиров: Лучше использовать исключения. Они оптимизируют основной путь и убирают из кода мусор.

Александр Еналдиев: Exceptions выглядят как карго-культ. Я встречал людей, которые знают, что не нужно их кидать, но, какую цель при этом преследуют, не знают. Все должно идти от задачи: стало ли лучше или «те же яйца, только в профиль»?

Станислав Юрченко: Я бы сформулировал вопрос иначе: иногда лучше exception, иногда — код ошибки. Это не вопрос, где обязательно нужно выбрать что-то одно, все зависит от контекста. Если нужна централизованная обработка большого набора ошибок, исключения — хороший вариант. Если же алгоритм подразумевает последовательное ветвление в зависимости от получаемых ошибок — возвращение кода может быть лучшим решением.

Евгений Фёклин: Для меня лучше кидать exception для обработки ошибок. Оно позволяет создавать иерархии исключений.

Какими инструментами для работы со сторонними зависимостями ты предпочитаешь пользоваться?

Илья Казаков: Считаю, что слишком мало внимания уделяют Conan. Он очень активно развивается и собирает вокруг себя достаточно большое сообщество. Я сам — автор нескольких рецептов в conan-center-index, и он занимает особое место в моем сердечке.

Константин Владимиров: Мне нравится Conan, но я не имею ничего против vcpkg. В принципе все что угодно, лишь бы не сабмодули.

Александр Еналдиев: Кажется, что Conan (был) неплох, но лично для меня в рабочих процессах вопрос не актуален — у нас монорепозиторий.

Станислав Юрченко: Не могу сказать, что познал дзен в этом вопросе. Я просто пользовался Conan.

Евгений Фёклин: CMake, Сhocolatey, Сonan, vspkg.

Часто речь в докладах на митапах и конференциях идет о стандартной библиотеке. Как считаешь, можно ли писать на С++ и не использовать стандартную библиотеку?

Илья Казаков: Я более чем уверен что те, кто отказывается от стандартной библиотеки, в конечном итоге пишут точно тот же код что и в стандартной библиотеке. К сожалению, (или к счастью) я не встречался на практике с ситуацией когда использование стандартной библиотеки было бы невозможно. Не нравится динамическая зависимость? Ничего не мешает линковаться статически. Проблема с версией библиотеки на таргет платформе? Линкуйся статически. Не нравится линковаться статически? Линкуйся статически :)

Константин Владимиров: Можно. Но для этого придется переписать часть стандартной библиотеки, иногда существенную. Был опыт. Скажу так: разрабатывать заново то, что уже есть в стандартной библиотеке, в первую очередь скучно.

Александр Еналдиев: Ожидание: тебе намекают про плюсы в драйверах или bare metal С++. Реальность: народ пишет на Qt и не выкупает про STL и Boost.

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

Есть фраза «У каждой хорошей С++ библиотеки должен быть С-интерфейс». Почему так?

Илья Казаков: Что такое интерфейс библиотеки в мире С++? Это заголовочные файлы. Каждый раз, когда ты включаешь заголовочный файл, ты включаешь все его зависимости, и в результате зависимости библиотеки перетекают в твои зависимости. Кроме того, возможна ситуация, когда заголовочный файл использует стандарт выше, чем стандарт твоего проекта. В таком случае использовать библиотеку вовсе не выйдет. Но если предоставить заголовочник, написанный на С, то головной боли будет намного меньше. Правда, к сожалению, и функционала.

Константин Владимиров: Из-за того, что у C есть стабильное ABI и нет манглирования (как минимум манглирования типами). В языке C++ манглирование типами происходит в стиле, зависящем от реализации.

Александр Еналдиев: Ожидание: имели в виду, что неплохо бы рассчитывать на гетерогенную среду, всякие С, С++, расты, шарпы и прочие cython. Реальность: потому что Си-шное лобби не дремлет. 

Как часто ты используешь final?

Илья Казаков: До недавнего времени вообще о нем не вспоминал, однако Константин Владимиров убедил меня в том что очень зря. Теперь останавливаю себя от того чтобы писать его везде (даже там, где он не нужен)

Константин Владимиров: Довольно часто и на классах и на конкретных методах.

Александр Еналдиев: Раз в два года точно.

Станислав Юрченко: Руководствуюсь правилом «не лепи куда попало». Встречаю редко, пользуюсь еще реже.

Евгений Фёклин: Тимлид нам запрещает использовать виртуальные функции.

Присоединяйтесь к обсуждению в комментариях! Как бы вы ответили на вопросы?А также регистрируйтесь на митап по С++, чтобы поучаствовать в онлайн-дискуссии с экспертами.

Комментарии (5)


  1. AndreyAf
    15.03.2024 13:03
    +10

    Тимлид нам запрещает использовать виртуальные функции.

    поржал.. спсб!


  1. andy_p
    15.03.2024 13:03

    С++17 появились std::variant и std::optional и std::variant.

    std::any ?


  1. pirt
    15.03.2024 13:03
    +5

    Тимлид нам запрещает использовать виртуальные функции.

    Сначала мама запрещала, теперь тимлид. Когда ж я наконец повзрослею?