LINUX.ORG.RU

Сишный быдлокодер.

 ,


0

2

И так, не иначе как быдлокодером я себя назвать не могу. Программирование моё увлечение и не более того, пишу на сишке разные фишки и финтифлюшки, смотрю на всё это дело через пару дней/часов и хочется убить того кто это напортачил.

Что по вашему мнению есть быдлокод, а что нет? Лично у меня чувство неопределённости, так как нет того кто ткнёт пальцем в кусок кода.

И у меня развилась мания, я переписываю всё заново. Что почитать/посмотреть про хороший стиль программирования на С? Как блин понять то, что твой код нормален или он быдлокод? И да у меня одного привычка переусердствовать с if() {} else{};? Приветствуются куски кода/целые проекты с указанием быдлокод/идеальный код.

И да, я немного пьян.

Мне конечно стыдно, но вот https://github.com/fedor-elizarov для примера, там мало конечно но думаю хватит и этого, остальное локально храню. Ну и cast beastie, ты просто адекват и сишник.

★★★★★

Последнее исправление: Dron (всего исправлений: 1)

В свете сами-знаете-каких событий (кхкхкхпрокодеркхкх), предлагаю считать тред жирным вбросом %)

anonymous
()

посмотреть в исходники питона, увидеть как там реализованы ооп объекты на сишке.
понять работу с памятью и указателями, как всзять длинный инт, установит указатель на его середину и записать туда короткий инт.
как из двух коротких интов составить один нормальный.
понять что указатель на структуру указывает на первый элемент структуры. Узнать про указатели на функции.
Чуть вкурить битовые операции.
потом берёшь изучаешь лисп, потом ocaml
потом переписываешь свой сишный быдлокод

Bad_ptr ★★★★★
()

Этому трудно научиться, но легко приходит с опытом, так што программируй мазафака.

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

потом ocaml

Придёт буддхист и будет говорить, что эмелеподобия нечитаемы и вообще недоразумение.

anonymous
()

Вот этот участок:

  if(point_init_all==OFF)
  {

     result=unien_read_conf(str_conf, "init_video");
     if(strcmp("yes", result)==0)
     {
          

        unien_init_video();

     };

     result=unien_read_conf(str_conf, "init_audio");
     if(strcmp("yes", result)==0)
     {

        unien_init_audio();

     };

     result=unien_read_conf(str_conf, "init_timer");
     if(strcmp("yes", result)==0)
     {

        unien_init_timer();

     };
     
     result=unien_read_conf(str_conf, "init_cdrom");
     if(strcmp("yes", result)==0)
     {

         unien_init_cdrom();

     };

     result=unien_read_conf(str_conf, "init_joystick");
     if(strcmp("yes", result)==0)
     {

         unien_init_joystick();

     };
    
     result=unien_read_conf(str_conf, "init_eventthread");
     if(strcmp("yes", result)==0)
     {

         unien_init_eventthread();

     };

     result=unien_read_conf(str_conf, "init_opengl");
     if(strcmp("yes", result)==0)
     {

          unien_init_opengl();

     };

  }; 

Во-первых, очень размашисто. Во-вторых, ЕМНИП, все эти униены_риды_конфы можно завернуть в #define

olibjerd ★★★★★
()

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

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

Во-первых, gamepad Во-вторых, функции чтоли отменили? У тебя дубляжа кода 7 кусков и ты спишь спокойно после этого что ли?

Dantix ★★
()

Господа, может человеку начать с чего-нибудь менее грандиозного, чем игровое двигло? Я так и не смог его убедить, может, хоть у вас получится.

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

Зачем убеждать? Через неделю сольется, и если останется желание, возьмет себе что-то по силам, а так, только буквы зря печатать.

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

очень размашисто

Согласен.

Во-вторых

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

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

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

Бро, он уже ~месяц мучается. А я ему говорил. Сейчас он постучался ко мне в жабер и пожаловался, что уже 20 раз переписывал все. Я снова предложил ему начать с малого. Нет же, он отказался и создал этот тред. Эту бы энергию да в правильное русло. А то так до пенсии и будет маяться.

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

Моя энергия в булки и плюшки уходит :)

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

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

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

И смысл? Ты через 2 минуты напишешь другой логичный и замечательный код, кто тебе его будет исправлять? Почитай Кернигана и Ричи для начала.

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

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

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

Почитай Кернигана и Ричи для начала.

Почитал.

И смысл?

Показать твоё видение реализации. А я посмотрю, подумаю. Я же за этим и пришел :)

И да вот листинг https://github.com/fedor-elizarov/UNIEN/blob/master/src/unien.c полный

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

Вредная привычка.

Dron ★★★★★
() автор топика

К чёрту всё, начал заново:)

быдлокодер

это основной признак, код можно не открывать

x0r ★★★★★
()

Что по вашему мнению есть быдлокод, а что нет? Лично у меня чувство неопределённости, так как нет того кто ткнёт пальцем в кусок кода.

Присоединяйся к живому опенсорсному проекту — и будет кому ткнуть. Особенно если ведущие программисты в проекте из Германии.

И бросай этот C, го на C++, я создал.

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

Утром деньги, вечером стулья. Ждем исправленный код.
Hint:

struct HashEntry
{
    char* name;
    int (*pf)(void);
};

struct HashEntry* hash[] = {{"init_cdrom", unien_init_cdrom}, ..., NULL}; /*у меня сейчас 5 часов утра, спать я не ложился, но идея понятна*/

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

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

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

что компилится, то не зазорно

Отчасти согласен, Но не всегда так :) http://govnokod.ru/13126

Для Ъ:

#include <stdio.h>
     
    int main() {
        int i=5;
        switch ( 2 ) {
            case 0:
                for (  i=0; i<10; i++ ) {
            case 1:
                printf("A i=%d\n",i);
            case 2:
                printf("B i*i=%d\n",i*i);
                };
            case 3:
                printf("done");
                break;
        }
     
        return 0;
    }
     
    /* OUTPUT
    B i*i=25
    A i=6
    B i*i=36
    A i=7
    B i*i=49
    A i=8
    B i*i=64
    A i=9
    B i*i=81
    done
    */

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

И да вот листинг https://github.com/fedor-elizarov/UNIEN/blob/master/src/unien.c полный

  1. Используй !strcmp вместо strcmp(...) == 0, это уже как-то устоялось.
  2. Ты зря тратишь вертикальное место: пустые строки, фигурные скобки на новой строке
  3. Возвращать «yes» из функции при удачном исходе — настоящий быдлокод. Ты б ещё просто равенством проверял (кстати, будет работать). Возвращай 1 и 0. Или заведи себе набор дефайнов для статусов.
  4. У тебя ошибка в обработке ошибок. Сейчас, если этап провалится, ты просто переходишь к следующему. Используй goto для обработки ошибок.
  5. Не смешивай tab'ы и пробелы. Определись.
  6. Лишние точки с запятой после } доведут до трудноуловимых багов.
  7. Не жалей пробелов для отбивки операторов. Условия будут более читаемыми.
  8. Нет смысла писать signed int.
i-rinat ★★★★★
()
Ответ на: комментарий от netcat

Господа, может человеку начать с чего-нибудь менее грандиозного, чем игровое двигло? Я так и не смог его убедить, может, хоть у вас получится.

Предлагаю скинуться и подарить ему клубок шерсти.

quiet_readonly ★★★★
()
Ответ на: комментарий от i-rinat

Ну вот здравые упрёки, спасибо, только «yes» это не статичный возврат из функции, это значение параметра в конфиг файле, а оно там любым может быть. В смысле параметр парсится из конфига и указатель на строку с этим отфильтрованным параметром отдаёт, а я потом где надо просто сравниваю строки, а где надо в int, float перевожу если это числовое значение. По моему это оправданно.

Dron ★★★★★
() автор топика

Скобки на новой строке 100% признак анскилледа.

А про код - пиши оптимальный код, будешь писать оптимальный код - будет писать проще, а простота основа труЪ кода.

И самое главное пойми, что плюсовик даже близко не сишник. Из 100% «сишников» на лоре, да и в мире 90% плюсовиков, а плюсовик тебя хорошему не научит.

И раз ты не собираешься продавать себя, то пойми одну вещь - никогда не пытайся потакать анскилледу. Думая «а что если дебилушка с кодегайдом головного мозга не поймёт мой if» - ты 95% напишешь гумно.

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

Скобки на новой строке 100% признак анскилледа.

Эрик Олман c тобой не согласен :) Я привык к такому стилю.

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

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

x0r ★★★★★
()
Ответ на: комментарий от Dron
<<<<<<< HEAD:src/unien_utilities/unien_utilities.c
#include "../unien_ica.h"
=======
#include "../include/UNIEN_ICA.h"
>>>>>>> d5913cade96e1b883398439dd402a1ff4f9fdaf9:source/utilities_api/UNIEN_utilities.c

ктото не умеет пользоваться гитом

/*! включить/включено*/
#define ON 1

/*! отключить/отключено*/
#define OFF 0 

это финиш, лучше бы сделал enum. сразу подуменьшит проблем, если ON/OFF надо передать в функцию.

меня поражают люди, готовые вкоммитить 1М текста в виде документации к нерабочему и некомпилируемому коду. не говоря уже о комментариях на русском.

procoder99 не слушай, у него тяжелая наркомания.

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

И да, с таким стилем только в гуйню, мылогонятели, либо ещё что-то.

Вменяемые люди привыкли не разбазариваться местом на экране, а так же всем остальным. Если ты клал на код - ты клал на всё, и тебе ничего не светит.

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

Ты хочешь батл?

Прокодер похож на автора, прокодер не программист - а просто школьник, хобби которого играть в программиста.

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

Переселяйся в лорбатл и там себе батлы устраивай. Иначе тред потрут нафиг.

Dron ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Тогда и я тоже

  1. http://www.kernel.org/doc/Documentation/CodingStyle — читать обязательно.
  2. http://github.com/git-mirror/nginx — хотя бы посмотреть на код.
  3. http://valgrind.org
  4. Русский язык в комментариях не нужен (как и само по себе то что ты в них пишешь).
  5. С++?

Насчёт кода который был выше:

/*
 * patch_to_file?
 *
 * btw, man mmap.
 */
char *unien_load_file(const char *path);

/*
 * Не надо аллоцировать память, возвращай указатель на начало значения параметра,
 * в strcmp ты используешь константные строки первым параметром, то есть заведомо
 * null-terminated, поэтому всё будет ок.
 */
char *unien_read_conf(const char *str, const char *param);

#define IS_YES(VAR, STR) \
    (!strcmp("yes", unien_read_conf(VAR, STR)))

void unien_init(const char *path)
{
    // str_ когда оно уже по типу srt? Венгерская нотация не нужна.
    char *conf = unien_load_file(path);

    if (IS_YES(conf, "init_all_sybsystem")) {

        unien_init_video();
        unien_init_audio();
        unien_init_timer();
        unien_init_cdrom();
        unien_init_joystick();
        unien_init_event_thread();
        unien_init_opengl();

    } else {

        if (IS_YES(conf, "exit_to_error")) unien_exit_to_error_set(ON);
        else unien_exit_to_error_set(OFF);

        // debung?
        if (IS_YES(conf, "debug")) unien_debug_set(ON);
        else unien_debug_set(OFF);

        if (IS_YES(conf, "init_video")) unien_init_video();
        /* ... */
        if (IS_YES(conf, "init_opengl")) unien_init_opengl();

    }

    free(conf);
}

также со всеми этими функциями напрашивается struct unien (struct unien my_conf; my_conf.exit_to_error = IS_YES(conf, «exit_to_error»); например — 0 == false, 1 == true, enum { OFF, ON } — OFF == 0, ON == 1) и вообще нормальные классы с конструкторами, инкапсуляцией, геттерами, сеттерами, методами и т.п.

Возвращать «yes» из функции при удачном исходе — настоящий быдлокод

Там у него, как я понял, возвращается не то что «yes», а

param = yes!!!

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

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

кто то не умеет пользоваться гитом

Ты прав, но я стараюсь осилить.

это финиш, лучше бы сделал enum

Согласен оно и было так раньше, код удалял, писал за ново много раз осадок остался.

меня поражают люди, готовые вкоммитить 1М текста.....

Ты верно старые коммиты смотрел там и поболе 1метра есть :) Это я не так давно пробовал doxygen попутно с написанием кода.

не говоря уже о комментариях на русском.

Лучше на русском чем на кривом не русском.Наверное так.

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

За первую ссылку спасибо.

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