История изменений
Исправление
gaylord,
(текущая версия)
:
Помойка не от количества а от того что алгоритм перемешан с объявлениями. Начало функции можно целиком пропустить и смотреть туда тогда когда надо, а алгоритм, не замусоренный всякими int, char и прочими импам, выглядит намного лучше. Ну и ещё - если у тебя в начале функции прямо «куча» переменных - надо подумать о разделении её на более маленькие.
Эм… Ну вот давай сравним.
Объявления в начале:
static void bleh(void)
{
struct foobar *f;
struct bar *b;
int i, ret;
f = foobar_new();
if (!f)
errx(1, "cannot create f");
b = bar_new();
if (!b)
errx(1, "cannot create b");
for (i = 0; i < b->nr_somethings; ++i) {
ret = f->ops->do(&b->somethings[i]);
if (ret)
errx(1, "cannot do something: %d", ret);
}
foobar_free(f);
bar_free(b);
}
Объявления где надо:
static void bleh(void)
{
struct foobar *f = foobar_new();
if (!f)
errx(1, "cannot create f");
struct bar *b = bar_new();
if (!b)
errx(1, "cannot create b");
for (int i = 0; i < b->nr_somethings; ++i) {
int ret = f->ops->do(&b->somethings[i]);
if (ret)
errx(1, "cannot do something: %d", ret);
}
foobar_free(f);
bar_free(b);
}
Мне первое нравится больше исключительно в силу синдрома утенка, но это чистая вкусовщина. Читаемость кода не изменилась.
В C23 появился auto и теперь все ваще хорошо:
static void bleh(void)
{
auto f = foobar_new();
if (!f)
errx(1, "cannot create f");
auto b = bar_new();
if (!b)
errx(1, "cannot create b");
for (auto i = 0; i < b->nr_somethings; ++i) {
auto ret = f->ops->do(&b->somethings[i]);
if (ret)
errx(1, "cannot do something: %d", ret);
}
foobar_free(f);
bar_free(b);
}
Исходная версия
gaylord,
:
Помойка не от количества а от того что алгоритм перемешан с объявлениями. Начало функции можно целиком пропустить и смотреть туда тогда когда надо, а алгоритм, не замусоренный всякими int, char и прочими импам, выглядит намного лучше. Ну и ещё - если у тебя в начале функции прямо «куча» переменных - надо подумать о разделении её на более маленькие.
Эм… Ну вот давай сравним.
Объявления в начале:
static void bleh(void)
{
struct foobar *f;
struct bar *b;
int i, ret;
f = foobar_new();
if (!f)
errx(1, "cannot create f");
b = bar_new();
if (!b)
errx(1, "cannot create b");
for (i = 0; i < b->nr_somethings; ++i) {
ret = f->ops->do(&b->somethings[i]);
if (ret)
errx(1, "cannot do something: %d", ret);
}
foobar_free(f);
bar_free(b);
}
Объявления где надо:
static void bleh(void)
{
struct foobar *f = foobar_new();
if (!f)
errx(1, "cannot create f");
struct bar *b = bar_new();
if (!b)
errx(1, "cannot create b");
for (int i = 0; i < b->nr_somethings; ++i) {
int ret = f->ops->do(&b->somethings[i]);
if (ret)
errx(1, "cannot do something: %d", ret);
}
foobar_free(f);
bar_free(b);
}
Мне первое нравится больше исключительно в силу синдрома утенка, но это чистая вкусовщина. Читаемость кода не изменилась.