Образцовый код
От: SergASh  
Дата: 28.04.20 14:49
Оценка: :))
Привет всем!

Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода,
вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано.
И чтобы можно было разобраться в нем за разумное время.
Отредактировано 28.04.2020 16:36 SergASh . Предыдущая версия .
Re: Образцовый код
От: Zhendos  
Дата: 28.04.20 15:38
Оценка: 4 (1)
Здравствуйте, SergASh, Вы писали:

SAS>Привет всем!


SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода,

SAS>вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано.

Когда заглядывал в исходники clang вроде все у них было неплохо сделано.
Re: Образцовый код
От: SaZ Беларусь  
Дата: 28.04.20 15:52
Оценка: 4 (1)
Здравствуйте, SergASh, Вы писали:

SAS>Привет всем!


SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода,

SAS>вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано.

Qt неплох. Если поменьше из того что недавно юзал — Microsoft gltf.
Re: Образцовый код
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 28.04.20 18:43
Оценка: 14 (3)
Здравствуйте, SergASh, Вы писали:

SAS>И чтобы можно было разобраться в нем за разумное время.


Поищи в awesome-modern-cpp
https://elibrary.ru/author_counter.aspx?id=875549
Re[2]: Образцовый код
От: SergASh  
Дата: 28.04.20 19:34
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Поищи в awesome-modern-cpp


Спасибо. Там много всего, и оно 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 objects
    ctx->c.reader->fn->freeObject = [](void *reply) {};  // Опаньки! Красотища-то какая! Лезем не то что через голову, а через три
    rdx->setConnectState(CONNECTED);
  }

  if (rdx->user_connection_callback_) {
    rdx->user_connection_callback_(rdx->getConnectState());
  }
}
Re: Образцовый код
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.04.20 23:09
Оценка:
Здравствуйте, SergASh, Вы писали:

посмотри boost.asio.
если поймешь — вдохновишься. всё.
Слово "совпадение" появилось после падения сов.
Re[2]: Образцовый код
От: reversecode https://github.com/marakew/
Дата: 28.04.20 23:26
Оценка: +1 :))
X>посмотри boost.asio.

почему ему сразу веревку на шею не посоветовать ?
Re: Образцовый код
От: PM  
Дата: 29.04.20 08:03
Оценка: 7 (2)
Здравствуйте, SergASh, Вы писали:

SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода,

SAS>вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано.
SAS>И чтобы можно было разобраться в нем за разумное время.

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

https://github.com/foonathan
https://github.com/SuperV1234
https://github.com/Manu343726

Молодые программисты, пишут на современном С++
Re[3]: Образцовый код
От: niXman Ниоткуда https://github.com/niXman
Дата: 29.04.20 08:20
Оценка:
Здравствуйте, reversecode, Вы писали:

R>почему ему сразу веревку на шею не посоветовать ?


ну...мне не знаком этот ник и в посте ничего не сказано про сложность
Слово "совпадение" появилось после падения сов.
Re[3]: Образцовый код
От: Erop Россия  
Дата: 29.04.20 22:05
Оценка:
Здравствуйте, 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*>?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Образцовый код
От: reversecode https://github.com/marakew/
Дата: 29.04.20 22:15
Оценка:
думаю его смутило три сырых указателя
Re[2]: Образцовый код
От: Bill Baklushi СССР  
Дата: 29.04.20 22:18
Оценка:
SaZ:

SaZ>Qt неплох.

Qt построен на голых указателях, от которых у многих фундаменталистов нешуточно пригорает.
Тогда уж gtkmm. Глубоко не копал, но вроде он построен на умных указателях.
В революционном угаре сожгли людей. Не планировали, но так получилось. (с) Bjorn Skalpe про 2 мая
Автор: Bjorn Skalpe
Дата: 21.08.19
Re[5]: Образцовый код
От: Erop Россия  
Дата: 30.04.20 08:14
Оценка:
Здравствуйте, reversecode, Вы писали:

R>думаю его смутило три сырых указателя


Он же выделил строчку?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Образцовый код
От: SergASh  
Дата: 02.05.20 14:42
Оценка:
Здравствуйте, 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*, то ой!

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

Хотелось бы не отклоняться от темы. Если знаете проект, который я ищу, милости просим
Re[5]: Образцовый код
От: Zhendos  
Дата: 02.05.20 15:23
Оценка:
Здравствуйте, 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, но...
Re: Образцовый код
От: smeeld  
Дата: 02.05.20 16:35
Оценка: +2
Здравствуйте, SergASh, Вы писали:

SAS>Привет всем!


SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода,


Нет таких. В каждой репе свои принципы и предпочтения, чаще всего диаметрально противоположные. Так что смотри все, выбирай тот, код в котором более по душе, и вливайся туда. Но высока вероятность, что, устроившись на работу, получишь возню с кодом, в котором все диаметрально противоположно личным предпочтениям.
Re[2]: Образцовый код
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 02.05.20 16:55
Оценка:
Здравствуйте, smeeld, Вы писали:

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


Кстати, соглашусь. Я такое различие вижу сразу, возможно из-за недостатка знаний в современном С++.
Есть, например, библиотека на современном С++ — sobjectizer. Очень крутая штука, современный С++, куча возможностей, но для меня код, использующий её, очень и очень трудно читаем.
Или есть две библиотеки для компьютерного зрения: dlib и opencv. Первая изначально проектировалась на С++, а вторая плавно эволюционировала из С. Обе они хорошие, своё дело делают, с документацией и примерами. Но в dlib мне приходится продираться сквозь код, когда в opencv я его просто свободно читаю (4-5 пуллреквестов с мелкими правками даже сделал). Сложность предметной области при этом одинаковая — они решают одну и ту же проблему, конкурируя друг с другом. Написаны на одном языке — на С++. То есть разница исключительно в стиле кода и это чувствуется очень даже.
https://elibrary.ru/author_counter.aspx?id=875549
Re[3]: Образцовый код
От: SaZ Беларусь  
Дата: 03.05.20 17:32
Оценка:
Здравствуйте, Bill Baklushi, Вы писали:

BB>SaZ:


SaZ>>Qt неплох.

BB>Qt построен на голых указателях, от которых у многих фундаменталистов нешуточно пригорает.
BB>Тогда уж gtkmm. Глубоко не копал, но вроде он построен на умных указателях.

Так исторически сложилось. Частично к Qt6, и полностью в Qt7 хотят от этого уйти, насколько я помню. Общался с разработчиками.
Re: Образцовый код
От: wl. Россия  
Дата: 04.05.20 06:49
Оценка: 4 (1)
Здравствуйте, SergASh, Вы писали:

SAS>Привет всем!


SAS>Разыскивается опенсорс проект на С++, который можно было бы считать образцовым в плане стиля и организации кода,

SAS>вот чтоб прямо смотреть и вдохновляться от того, как всё мастерски сделано.
SAS>И чтобы можно было разобраться в нем за разумное время.

если эмуляторы интересны, можно глянуть на эмуль Nintendo Switch https://github.com/yuzu-emu/yuzu
Структура грамотная на мой взгляд
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.