LINUX.ORG.RU

История изменений

Исправление 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);
}

Мне первое нравится больше исключительно в силу синдрома утенка, но это чистая вкусовщина. Читаемость кода не изменилась.