LINUX.ORG.RU
ГолосованияГолосования (не подтверждено)

Какой кусок исходного кода на Си Вам кажется более красивым (см. подробности)

 , ,


0

2

первый вариант:

a[0] = get_data(0);
a[1] = get_data(1);
a[2] = get_data(2);
a[3] = get_data_3();
a[4] = get_data(4);
a[5] = get_data_5();

второй вариант:

for(int i = 0; i < sizeof(a)/sizeof(a[0]); i++) {
  switch(i) {
    case 3: a[i] = get_data_3(); break;
    case 5: a[i] = get_data_5(); break;
    default: a[i] = get_data(i); 
  }
}
★★★★★

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

@Satori А давай, если модераторы/корректоры и капитан сея лодки будет не против этот опрос потом забульбехаем? Летс врайте коде там все дела, суровые сишные обсуждеееения, роммааантика, киберпанк и всё такое =)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

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

Пока пусть немного повисит тот, что есть.

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

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

Вово, она на нас с тобой надёжа ::)

Пока пусть немного повисит тот, что есть.

Ага )

LINUX-ORG-RU ★★★★★
()

Если было бы

...
a[100500] = get_data(100500);

то второй был бы неплох. А так первый.

Хотя твоя опечатка в первом примере показывает, чем он плох)

Upd.: это ж не опечатка, я криво посмотрел)

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

Если запилите, третьим вариантом допишите:

    unsigned int (*a_get[A_SIZE])() =
    {
        [0] = get_data,
        [1] = get_data,
        [2] = get_data,
        [3] = get_data_3,
        [4] = get_data,
        [5] = get_data_5
    };

    for(int i = 0; i < A_SIZE); i++)
        a[i] = a_get[i](i)

И во втором вместо sizeof(a)/sizeof(a[0]) тоже A_SIZE для единообразия.

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

a[100500] = get_data(100500);

Так-то понятно. Также как если бы было два пункта, то, очевидно, лучше первый. Вкусовые различия начинают проявляться где-то в промежутке от 3 до 10. Для приверженца DRY уже 3 строки надо переписывать циклом, а для среднестатистического китайца где-то до десяти строк лучше первый.

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

Да так-то если такое писать 1 раз, то лучше ручками, а если много раз – то выносить в функцию/макрос (чем горазд ЯП), а там уже неважно, как оно выглядит.

Попробую одобрить голосовалку. Пофлеймить пойдет.

Virtuos86 ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Миль пардон. Мне лень. Каюсь, не перечитал тред.

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

Жопа ты, Растаманская :D. Си красив уже одной своей концепцией одногоуровня абстракции. Как великолепная статуя выточенная мастером из камня воплощает красоту в глазах смотрящего и при это всего лишь является всё тем же камнем.

(Чур про окаменелости не шутить!)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

оба одинаково приемлемы

В отдельный пункт вынесен.

ya-betmen ★★★★★
()

Даже не знаю что выбрать. Они оба уродливы. Первый проще прочесть, но всё равно не понимаю отчего нельзя было всегда вызывать функцию с параметром.

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

Ща узнаю что это такое вообще и зачем оно нужно. Но такими темпами я тоже могу сказать покажи мне красоту реализации кодогенерации как в lisp на не lisp тоже поржём. В си 1 уровень абстракции, понятное дело что он не даст тебе того уровня сахара и большей гибкости с этими абстракциями.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от dyb4hzvo

Они оба уродливы

Описывай свой не уродливый вариант иначе словоблуд! ))))))))

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Virtuos86

Ой вот давай не будем. Если в языке XXX есть в тандартной комлектации некая хня это не значит что она стандарт. Любая хня это просто хня возникающая по мере надобности. Яж сказал, ща узнаю и всё будет. Ты тоже знаешь менее 1% всего что в софте происходит я же не наезжаю )))))))) Лучше бы сразу ссылку/ки кинул по доброте душевной.

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

Ща узнаю что это такое вообще и зачем оно нужно.

Типичный сишник.

Спойлер: это без дженериков реализовать нельзя. Поэтому Си - какашка.

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

Так я ещё не изучил то на что ты мне указал. Дай время то =)

LINUX-ORG-RU ★★★★★
()
int
get_actual_data (int i) {
    // stuff
    return 0; // stub
}

int
get_data (int i) {
    switch (i) {
    case 3:
        return get_data_3 ();
    case 5:
        return get_data_5 ();
    default:
        return get_actual_data (i);
   }
}

void
fill (int a[], size_t size) {
    int step = size / sizeof (int);
    for (int i = 0; i < step; i++) {
        a[i] = get_data (i); 
    }
}

// вот такой
fill (a, sizeof (a));
kostyarin_ ★★
()

как то так

void @[sizeof(a)/sizeof(a[0])]={get_data,get_data,get_data,get_data_3,get_data,get_data_5};
.
.
.
for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++) {
        a[i] = (@[i])(i);
}
qulinxao3 ★★
()
Ответ на: как то так от qulinxao3

приз за лучшую аскии-графику уже можно отдавать тебе

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

Корректоры вообще редко вспоминают, что они корректоры

А ты, наоборот, рано вспомнил ) Не дал прежнему опросу повисеть на главной.

Satori ★★★★★
()

Можно ещё более узкоспециализированный опрос, а то недостаточно?

CryNet ★★★★★
()

Немного не в тему - скажите, а компилятор такие switch оптимизирует? Или вот так в лоб и получится код, что 10 лишних сравнений получится?

Т.е. - есть ли смысл как-то пытаться руками это оптимизировать так, чтобы наиболее вероятный выбор шёл первым, без проверок на частные случаи, у которых вероятность здесь 1/6 (а могла бы быть и 1/100500)?

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

Не старайся, стыдно мне не будет. Если бы действительно стоящий был опрос, я бы огорчился. А вот эту фигню, «метапрог», я не очень высоко ценю.

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

Virtuos86 ★★★★★
()

Лучшее - враг хорошего

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

Мне все равно, будет тебе стыдно или нет. Указал тебе на то, что как корректор ты поступил некорректно, но ты не понял. Вопрос закрыт.

А фигня метапрог или нет, не тебе решать. Люди как раз для этого опрос и создали.

Satori ★★★★★
()

вот такой

BEGIN
IF да THEN да 
END
eR ★★★★★
()

Оба варианта не годятся. Потому что сам дизайн этого куска Г. Зачем может понадобиться выделять get_data_3 отдельно, почему нельзя сделать get_data(3)? Этому нет никакого оправдания в принципе. Если эта функция так устроена, что случай 3 должен быть отдельно, значит это плохо сделанная функция.

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

Всё не так однозначно. Голосовал головой за второй варинт. Но сердцем - за первый. Здесь вроде любят bikeshedding, вангую 10 страниц срача.

d_a ★★★★★
()

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

При наличии функции get_data, в которой можно обработать исключения для 3 и 5, массив может понадобиться только для кэширования результатов этой функции, то есть для скорости. Когда скорость ставят на первое место, красота приносится в жертву.

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

Ты 6 строчек развернул в 26, засрал скоп, нагенерил лишних символов и релокаций, я всё правильно понял?

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

Ты 6 строчек развернул в 26,

6-говнострок развернул в нормальный код.

засрал скоп, нагенерил лишних символов

Используй static если хочешь, мне какое дело.

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

первый если i не миллион

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