LINUX.ORG.RU

покритикуйте код; slithercc

 


0

2

Здравствуйте,

сочинил клиента web игры slither.io.

slither.io это мультиплеерная змейка в кот. нельзя врезаться в других игроков.

https://github.com/ivan-matveev/slithercc

Покритикуйте код.



Последнее исправление: imatveev13 (всего исправлений: 2)
Ответ на: комментарий от anonymous

теперь ТС подаст на тебя в суд, отберёт у тебя дом, квартиру, машину жену и будешь жить под мостом в картонной коробке

без явного указания лицензия по дефолту проприетарная и копировать-распространять нельзя

Harald ★★★★★
()
Ответ на: комментарий от Harald

«без явного указания лицензия по дефолту проприетарная и копировать-распространять нельзя» - во блин. Где об этом можно почитать? То есть я могу постить код на гитхаб без указания лицензий и никто не смеет трогать мой код?

anonymous
()
Ответ на: комментарий от anonymous

Где об этом можно почитать?

в законодательстве об авторском праве своей страны

То есть я могу постить код на гитхаб без указания лицензий и никто не смеет трогать мой код?

да

Harald ★★★★★
()
Ответ на: комментарий от imatveev13

Да. Верно.

Как я понимаю рекомендация:

MISRA Rule 6.3 (advisory): Typedefs that indicate size and signedness should be used in place of the basic types.

повышает надежность кода за счет явного указания диапозона чисел кот. может содержать переменная и уменьшения количества неявных преобразований между переменными. Но может снижать производительность.

Всё так. Просто, надо помнить что MISRA это не иначе как набор стандартов Motor Industry Software Reliability Association. И там всё довольно строгие требования (к безопасности в том числе). И к производительности.

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

Большая часть размерных int это работа с протоколом, там они необходимы.

Тогда это оправдано. «Сетевые протоколы» и «криптопреобразования» это именно те места, где лучше бы использовать размерные типы данных. И пофиг «производительность» и «переносимость» (последнее пофиг в особенности).

Как показал профайлинг самые дорогие вызовы функций SDL2 для отрисовки. Т.е. быстродействие от моих размерных int страдает не сильно.

Прошу прощения, я просто в состоянии серьёзного подпития не вкурил сразу что у Вас там передача по сети. Здесь самым тормозящим фактором будет сама сеть, а не скорость отрисовки на клиенте. На клиенте само собой всё будет отрисовываться куда как быстрее, чем данные будут перекачиваться по сети.

Локально конечно SDL2 будет жрать больше всего ресурсов, но он по-другому и не может. А вот производительность всего приложения будет определяться латентностью сети у каждого отдельного клиента. Может получиться даже так, что у одного пользователя будет «всё летать», а у другого «всё тормозить». Хотя и клиент и сервер будут одними и теми же. И тут уже ни куда не денешься, к сожалению.

Извините ещё раз. =)

Moisha_Liberman ★★
()
Ответ на: комментарий от no-such-file

Во-первых, где карта комментарии, Билли?

Стараюсь писать самопонятный код без комментариев.

Во-вторых, switch-case и reinterpret_cast кругом – ты упоролся? Зачем тогда ты брал кресты, а не Си?

reinterpret_cast’ы в обработке протокольных пакетов. В файле packet_to_client.h для каждого пакета определен упакованный стракт к которому я кастую буфер с данными из сети. Альтернативного, специфичного для C++ метода распаковать буфер с данными не знаю. Традиционно используют mask and shift, но это тоже C’шно и менее выразительно на мой вкус.

switch-case’ы в обработке протокольных пакетов нужны для случаев когда у пакетов одинаковое значение поля типа, но разный размер и набор полей. C++ альтернативы не вижу.

imatveev13
() автор топика
Ответ на: комментарий от reprimand

Оглядываться на других можно, но делать - так как считаешь удобнее.

Фигня. Свой код и так прочитаешь. Это делается всё для других людей. Если это не поделка уровня побаловался и выкинул, и опен-сорц. То читать код будут намного больше и чаще, чем писать. Поэтому как себе удобней делать в корне неверно. Правильно для поцанов делать.

В целом суть такая, что удобство написания вторично. А удобство чтения на коне и с шашкой. Иначе твой код – как курица лапой.

anonymous
()
Ответ на: комментарий от imatveev13

Задумка сохранения магических чисел из оригинального JS в том чтобы когда оригинальный JS изменится было легче понять что менять в C++ коде.

Лолушки. Вся суть C++ кулцхакеров в переписывании JS «a lazy ass way».

anonymous
()
Ответ на: комментарий от anonymous

во блин. Где об этом можно почитать? То есть я могу постить код на гитхаб без указания лицензий и никто не смеет трогать мой код?

Не совсем. GitHub бесплатный только для опен-сорц проектов. А код без лицензии – закрытый.

anonymous
()

магические константы

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

Программы пишуться для программистов

baist ★★
()
Ответ на: комментарий от anonymous

Лолушки. Вся суть C++ кулцхакеров в переписывании JS «a lazy ass way».

Ты дурачок что ли? Там референсный клиент на JS и есть функции типа этой, которые нет смысла переписывать как-либо иначе.

anonymous
()
Ответ на: комментарий от baist

магические константы

Напиши CRC32 без магических констант. Или какой-нибудь алгоритм шифрования. Там смысл функции, что числа выбраны от балды, а-ля секретный ключ.

anonymous
()
Ответ на: комментарий от baist

магические константы

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

Догма на догме. Прямо средневековые кодописатели, не технари. Не думай, повторяй за другими. Аватарка тоже на что-то намекает.

anonymous
()
Ответ на: комментарий от anonymous

CRC32 без магических констант.

как насчет CRC с пример кода откуда брались значения

https://github.com/gcc-mirror/gcc/blob/master/libiberty/crc32.c

комментариев больше чем кода - уже гуд.

какой-нибудь алгоритм шифрования

Ага!

int get_random_number()
{
    return 42;
}

числа выбраны от балды

новое слово в криптоанализе.

baist ★★
()
Ответ на: комментарий от anonymous

средневековые кодописатели

… которым приходилось писать чуть ли не не ассемблере, просто не могли без комментов и доков, иначе выходило write-only полотно мнемоник x86.

Догма на догме.

не знал что слово «порядок» называют догмой

baist ★★
()
Ответ на: комментарий от baist

новое слово в криптоанализе.

Ты дурку не включай. Автор оригинальной игры зашил определенный код с выбранными от балды константами и преобразованиями для некой верификации. Смысл его записывать как-то иначе, чем было в оригинале? Или для тебя это как в анекдоте про уролога и яйца - «неаккуратненько»?

anonymous
()
Ответ на: комментарий от baist

не знал что слово «порядок» называют догмой

Порядок - это когда обоснованно. А применять к чужому коду, который что-то там верифицирует, какие-то правила - это значит потерять возможность синхронизации, когда автору захочется эту верификацию поменять.

anonymous
()
Ответ на: комментарий от baist

… которым приходилось писать чуть ли не не ассемблере, просто не могли без комментов и доков, иначе выходило write-only полотно мнемоник x86.

Подход у тебя средневековый. Чуть что не понял, посмотрел в методичку поощряемых менеджерами приемов кодописания и на костер автора отправил.

Понять мотивацию, почему там код 1 в 1 с JS, для тебя неподъемно.

anonymous
()
Ответ на: комментарий от Harald

код - лучшая документация

Лорчую. Документировать лучше то, что из кода непонятно. А такого должно быть минимум. Хороший код как книжка читается.

anonymous
()
Ответ на: комментарий от Harald

Да забей, всякие safety trolls, syntax trolls, дуралексы и т.п. - это наиболее никчёмные и бесполезные люди которых я когда-либо встречал. Сами они в принципе неспособны что-то делать или уметь, поэтому безуспешно пытаются потешить своё ЧСВ указывая другим на какие-то отклонения от зазубренных ими «правил» (разумеется чужих), при этом даже не понимая ни их смысла, ни применимости, ни вменяемости.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

Но дальше таких обиженок будет всё больше. А качество софта будет падать. Будут бесконечно безопасные и великолепно документированные программы, не делающие ничего полезного. И адепты раста тому подтверждение.

anonymous
()
Ответ на: комментарий от anonymous

Автор оригинальной игры зашил

Именно слово «зашил» здесь очень подходит

baist ★★
()
Ответ на: комментарий от anonymous

Но дальше таких обиженок будет всё больше. А качество софта будет падать.

Да. Таков путь. Тут главное изначально следить, чтобы софт в разработку которого начали лезть подобные персонажи не становился для тебя совершенно необходимым. Просто при первых же симптомах подобного - переходить на альтернативу или перестраивать workflow чтобы эта хрень оказалась не нужной в принципе.

И адепты раста тому подтверждение.

Это да. Изумительные персонажи. За столько лет не сделать абсолютно ничего полезного на пропагандируемом язычке - это надо очень постараться. Пожалуй разве что только Goпники могут составить им конкуренцию. Даже у пистона, адепты которого не менее упороты есть вполне ощутимый выхлоп. А тут вообще ничего совсем.

Stanson ★★★★★
()
Ответ на: комментарий от anonymous

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

baist ★★
()
Ответ на: комментарий от baist

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

Ему наверно приходится работать или как-то иначе сталкиваться с растущей армией сектантов.

anonymous
()
Ответ на: комментарий от anonymous

Ты дурачок что ли? Там референсный клиент на JS и есть функции типа этой, которые нет смысла переписывать как-либо иначе.

Сам ты референсный клиент. У тебя функция на ЦПП должна выглядеть так как на ДжЭс. И у тебя ничего ее ёкает.

anonymous
()
Ответ на: комментарий от Harald

комментарии могут быть устаревшими или ложными, а код врать не будет

Из цикла «Правила бомжа: как правильно ходить по помойкам».

Всё-таки код это код, а помойка – это помойка.

anonymous
()
Ответ на: комментарий от anonymous

Лорчую. Документировать лучше то, что из кода непонятно. А такого должно быть минимум. Хороший код как книжка читается.

Это фигня. То, что понятно автору не понятно больше никому. Так что описывать нужно всё. Кратко и ёмко.

anonymous
()
Ответ на: комментарий от Stanson

указывая другим на какие-то отклонения от зазубренных ими «правил» (разумеется чужих), при этом даже не понимая ни их смысла, ни применимости, ни вменяемости

У вас 100% ошибок в тексте.

  1. «Указывая другим» – такие обороты только гонимые используют. Норм поцаны знают, что за всё что делаешь выгребаещь сам, а значит можно смело класть на любые указания. Спасибо, что обозначили свой уровень развития. Было интересно.
  2. Никто не указывает. Это этикет. Как вести себя в общественном месте, чтобы не выглядеть деревенским увальнем. Открытый код – в первую очередь не для тебя. Просто распространённое заблуждение в опен-сорц подходе типа – «посмотрите, какую кучу я навалил» – безнадёжно устарело.
  3. Все правила на собственном опыте. Их много больше, если просто зазубривать чужие. Применимость и вменяемость и всё такое тоже на месте.
anonymous
()
Ответ на: комментарий от imatveev13

самопонятный код без комментариев

/0

reinterpret_cast’ы в обработке протокольных пакетов

Это не должно торчать наружу.

no-such-file ★★★★★
()
Ответ на: комментарий от baist

комментариев больше чем кода - уже гуд.

С такими же магическими

c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от anonymous

Так и назови enum{MAGIC_A=54,MAGIC_B=86} или/и вместеMAGIC_NUMBERS={MAGIC_A=56,MAGIC_B=89}

То есть

value1 = (value1 - 98 - (idx * 34));

плохо, а

value1 = (value1 - MAGIC_98 - (idx * MAGIC_34));

хорошо?

Чем второй вариант лучше?

monk ★★★★★
()
Ответ на: комментарий от anonymous

Фигня. Свой код и так прочитаешь.

сразу видно сумрачного рыцаря хелло-ворлдов

anonymous
()

У тебя reinterpret_cast’ы кривые. Ты пишешь данные в некий uint8_t буфер, а после кастуешь его в указатель на всякое разное, нельзя так, это ЮБ в котором компилятор может что-нибудь наоптимизировать (если это не MSVC). Можно из любого буфера кастовать в указатель на char/byte с последующей записью, или копируй из буфера в нужную структуру при получении в хендлере через std::memcpy. Вообще любой reinterpret_cast не в char* или std::byte* почти наверняка ошибка.

pavlick ★★
()

Ну и ещё я бы не делал вот таких глобальный данных:

std::deque<pkt_vec_t> pkt_queue;

Хз как соберут твою софтину, статическая libc или ещё какая магия, и деструктор pkt_queue будет дергаться после смерти libc. Заверни в функцию:

auto &get() {
   static Data d;
   return d;
}
pavlick ★★
()
Последнее исправление: pavlick (всего исправлений: 1)

говно

Полистал game.cpp.

  • Почему там что-то рисуется? Отрисовка должна быть в каком-нибудь render.cpp.

  • глобальные константы принято писать капсом, invalid_angle -> INVALID_ANGLE.

  • что за ламерская индентация?

game_t::game_t(screen_sdl_t& screen_)
: config()
  • вот этот кал
	case sizeof(pkt_prey_upd_ext_2_t):
		{
			const pkt_prey_upd_ext_2_t* pkt = reinterpret_cast<const pkt_prey_upd_ext_2_t*>(buf);
			speed = be16toh(pkt->speed);
			break;
		}
		case sizeof(pkt_prey_upd_ext_3_t):
		{
			const pkt_prey_upd_ext_3_t* pkt = reinterpret_cast<const pkt_prey_upd_ext_3_t*>(buf);
			angle = be24toh(pkt->angle);
			break;
		}
		case sizeof(pkt_prey_upd_ext_4_t):
		{
			const pkt_prey_upd_ext_4_t* pkt = reinterpret_cast<const pkt_prey_upd_ext_4_t*>(buf);
			wangle = be24toh(pkt->wangle);
			break;
		}

это у разных типов гарантировано разные размеры что-ли?

  • snake.fam = 1. * be24toh(pkt->fam) / 16777215;

делай такие константы через конст, это во первых, во-вторых записывай записывай как ее получил, да прямо вот 2**32 - 1, конпелятор все заоптимизирует, но это не выглдяит по быдлански.

  • Естественно, про магию тебе уже сказали, повторятся не буду, но ее быть не должно.

Так, идем по другим файлам немного.

  • Ну и быдлокод.
	if (rect.ul.x > xy.x)
		return false;
	if (rect.ul.y > xy.y)
		return false;
	if (rect.lr.x < xy.x)
		return false;
	if (rect.lr.y < xy.y)
		return false;
	return true;
  • вот это вот пахнет каким-то вонючим злом, чем глобальная переменная не угодила?
boost::asio::io_context& ioc_get()
{
	static boost::asio::io_context ioc;
	return ioc;
}

Вердикт: самый обычный плюсовый код, то есть говно на говне

anonymous
()
Ответ на: комментарий от pavlick

Хз как соберут твою софтину, статическая libc или ещё какая магия, и деструктор pkt_queue будет дергаться после смерти libc. Заверни в функцию:

auto &get() {
   static Data d;
   return d;
}

лол, так это еще и норма? просто взоржал.

anonymous
()
Ответ на: комментарий от anonymous

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

pavlick ★★
()
Ответ на: комментарий от anonymous

Будет тебя не хватать, лол.

Вообще это более актуально из потенциально хитрого конструктора/деструктора Data, который может что-то дернуть из другого модуля, который ещё/уже не готов. Я не уверен, что вот так топорно получится подгрузить ту же libc после своих модулей. Во всяком случае во всяких cppreference можно в примерах встретить к глобальные вектора, не думаю, что они там говнокод пишут. Ну а раз возможность хитрых ктр/дстр существует, то имеет смысл делать обертку для всего сложнее «интов» и мозг себе не парить «получится или нет?».

pavlick ★★
()
Ответ на: комментарий от pavlick

Только не слоновые люди будут обманываться static. Я знаю библиотеки которые все обмазаны static, guess what? они все говно, они только аллоцируют ОЗУ во своих внутренностях и не освобождают в полной мере из-за фрагментации. Зато c++17, string_view и прочие смузи во все поля.

anonymous
()
Ответ на: комментарий от anonymous

Очень ценное замечание от анонимного эксперта, который кукарекал три дня здесь в треде, но так и не заметил кривого reinterpret_cast в отличии от мальчика под мелом.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.