Здравствуйте, SergASh, Вы писали:
SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода, SAS>вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано. SAS>И чтобы можно было разобраться в нем за разумное время.
Какой-то проект, чтобы смотреть и вдохновляться не назову. Но я иногда смотрю код этих людей и проекты, на которые они ставят звезды:
Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода,
вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано.
И чтобы можно было разобраться в нем за разумное время.
Здравствуйте, SergASh, Вы писали:
SAS>Привет всем!
SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода,
Нет таких. В каждой репе свои принципы и предпочтения, чаще всего диаметрально противоположные. Так что смотри все, выбирай тот, код в котором более по душе, и вливайся туда. Но высока вероятность, что, устроившись на работу, получишь возню с кодом, в котором все диаметрально противоположно личным предпочтениям.
Здравствуйте, SergASh, Вы писали:
SAS>Привет всем!
SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода, SAS>вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано.
Когда заглядывал в исходники clang вроде все у них было неплохо сделано.
Здравствуйте, SergASh, Вы писали:
SAS>Привет всем!
SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода, SAS>вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано.
Qt неплох. Если поменьше из того что недавно юзал — Microsoft gltf.
Здравствуйте, SergASh, Вы писали:
SAS>Привет всем!
SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода, SAS>вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано. SAS>И чтобы можно было разобраться в нем за разумное время.
если эмуляторы интересны, можно глянуть на эмуль Nintendo Switch https://github.com/yuzu-emu/yuzu
Структура грамотная на мой взгляд
Спасибо. Там много всего, и оно awesome скорее с позиций полезности для использования, а не в смысле как внутри сделано.
Можно конкретнее что из этого списка подпадает под критерии шедевра?
Глянул первое попавшееся, клиент для редиса. А там
void Redox::connectedCallback(const redisAsyncContext *ctx, int status) {
Redox *rdx = (Redox *)ctx->data;
if (status != REDIS_OK) {
rdx->logger_.fatal() << "Could not connect to Redis: " << ctx->errstr;
rdx->logger_.fatal() << "Status: " << status;
rdx->setConnectState(CONNECT_ERROR);
} else {
rdx->logger_.info() << "Connected to Redis.";
// Disable hiredis automatically freeing reply objectsctx->c.reader->fn->freeObject = [](void *reply) {}; // Опаньки! Красотища-то какая! Лезем не то что через голову, а через три
rdx->setConnectState(CONNECTED);
}
if (rdx->user_connection_callback_) {
rdx->user_connection_callback_(rdx->getConnectState());
}
}
Здравствуйте, SergASh, Вы писали:
SAS>Глянул первое попавшееся, клиент для редиса. А там SAS>
SAS> Redox *rdx = (Redox *)ctx->data;
SAS> <...>
SAS> ctx->c.reader->fn->freeObject = [](void *reply) {}; // Опаньки! Красотища-то какая! Лезем не то что через голову, а через три
SAS>
1) А чем тебя так смутило выделенное? я так понимаю, что ctx->c.reader->fn->freeObject -- это что-то вроде std::function. Тебе не нравится, что они там целую std::function хранят, вместо void (*)(*void)?
Или то, что они вместо того, что бы в этом месте пихнуть туда какую-то emptyFunction или idleFunction используют лямбду? Так они, наверное, и в других местах так же делают, когда функция не пустая...
Возможно ты там как-то в этом коде уже разобрался, и теперь тебе очевидно, что так делать не надо. Но хотелось бы узнать почему ты так думаешь.
2) Почему тебя смутила выделенная тобой строчка, а не использование сишного каста, вместо reinterpret_cast<Redox*>?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
SaZ:
SaZ>Qt неплох.
Qt построен на голых указателях, от которых у многих фундаменталистов нешуточно пригорает.
Тогда уж gtkmm. Глубоко не копал, но вроде он построен на умных указателях.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Здравствуйте, reversecode, Вы писали:
R>думаю его смутило три сырых указателя
Он же выделил строчку?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, SergASh, Вы писали:
SAS>>Глянул первое попавшееся, клиент для редиса. А там SAS>>
SAS>> Redox *rdx = (Redox *)ctx->data;
SAS>> <...>
SAS>> ctx->c.reader->fn->freeObject = [](void *reply) {}; // Опаньки! Красотища-то какая! Лезем не то что через голову, а через три
SAS>>
E>1) А чем тебя так смутило выделенное? я так понимаю, что ctx->c.reader->fn->freeObject -- это что-то вроде std::function. Тебе не нравится, что они там целую std::function хранят, вместо void (*)(*void)? E>Или то, что они вместо того, что бы в этом месте пихнуть туда какую-то emptyFunction или idleFunction используют лямбду? Так они, наверное, и в других местах так же делают, когда функция не пустая... E>Возможно ты там как-то в этом коде уже разобрался, и теперь тебе очевидно, что так делать не надо. Но хотелось бы узнать почему ты так думаешь.
Нет, я глубоко не разбирался как что работает.
Но когда я вижу, что код лезет в свойство свойства свойства свойства, да ещё и лезет его менять, то это красный флаг для меня.
Если система вся так написана, то развивать ее, что-то менять там, очень страшно, она просто плохо инкапсулирована.
Это от языка не зависит.
E>2) Почему тебя смутила выделенная тобой строчка, а не использование сишного каста, вместо reinterpret_cast<Redox*>?
Потому что выделенная строчка — это ппризнак непродумманности и недопроектированности.
А каст, хотя вы правы, я его не заметил, но все же это локальная оплошность. Хотя если это каст вверх, или не дай бог из void*, то ой!
Вообще я привел этот пример не для того, чтобы кого-то критиковать, а как аргумент того, что есть большая разница
между полезной-удобной-нужной библиотекой, и библиотекой, внутри которой царит красота.
Хотелось бы не отклоняться от темы. Если знаете проект, который я ищу, милости просим
Здравствуйте, SergASh, Вы писали:
SAS>Здравствуйте, Erop, Вы писали:
E>>Здравствуйте, SergASh, Вы писали:
SAS>>>Глянул первое попавшееся, клиент для редиса. А там SAS>>>
SAS>>> Redox *rdx = (Redox *)ctx->data;
SAS>>> <...>
SAS>>> ctx->c.reader->fn->freeObject = [](void *reply) {}; // Опаньки! Красотища-то какая! Лезем не то что через голову, а через три
SAS>>>
SAS>Нет, я глубоко не разбирался как что работает. SAS>Но когда я вижу, что код лезет в свойство свойства свойства свойства, да ещё и лезет его менять, то это красный флаг для меня.
Этот код напоминает работу с C API. То есть либо этот представляет API для C или использует его.
В этом случае не вижу проблем, потому что в C нет никаких объектов,
можно конечно ООП симулировать на C, но...
Здравствуйте, smeeld, Вы писали:
S>Нет таких. В каждой репе свои принципы и предпочтения, чаще всего диаметрально противоположные. Так что смотри все, выбирай тот, код в котором более по душе, и вливайся туда. Но высока вероятность, что, устроившись на работу, получишь возню с кодом, в котором все диаметрально противоположно личным предпочтениям.
Кстати, соглашусь. Я такое различие вижу сразу, возможно из-за недостатка знаний в современном С++.
Есть, например, библиотека на современном С++ — sobjectizer. Очень крутая штука, современный С++, куча возможностей, но для меня код, использующий её, очень и очень трудно читаем.
Или есть две библиотеки для компьютерного зрения: dlib и opencv. Первая изначально проектировалась на С++, а вторая плавно эволюционировала из С. Обе они хорошие, своё дело делают, с документацией и примерами. Но в dlib мне приходится продираться сквозь код, когда в opencv я его просто свободно читаю (4-5 пуллреквестов с мелкими правками даже сделал). Сложность предметной области при этом одинаковая — они решают одну и ту же проблему, конкурируя друг с другом. Написаны на одном языке — на С++. То есть разница исключительно в стиле кода и это чувствуется очень даже.
Здравствуйте, Bill Baklushi, Вы писали:
BB>SaZ:
SaZ>>Qt неплох. BB>Qt построен на голых указателях, от которых у многих фундаменталистов нешуточно пригорает. BB>Тогда уж gtkmm. Глубоко не копал, но вроде он построен на умных указателях.
Так исторически сложилось. Частично к Qt6, и полностью в Qt7 хотят от этого уйти, насколько я помню. Общался с разработчиками.