psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2011-04-05 03:19 pm

Программерам

Задачка: как оптимизировать такой код, чтобы убрать копи-пасты?
Напрашивается заведение двух функций... а, может, кто-нибудь знает другие трюки?


if (undoCase)
{
	if (op & OpBefore)
	{
		uf.read(&hb, sizeof(hb));
		*hNew= hb;
		++hNew;
		++i;
	}
	if (op & OpAfter)
	{
		uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass redo data
		++hOld;
	}
}
else
{
	if (op & OpBefore)
	{
		uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass undo data
		++hOld;
	}
	if (op & OpAfter)
	{
		uf.read(&hb, sizeof(hb));
		*hNew= hb;
		++hNew;
		++i;
	}
}


Upd: Порядок вызова seek/read важен - там в файле два последовательных блока, наличие/отсутствие которых определяется флагами OpAfter/OpBefore.

[identity profile] os80.livejournal.com 2011-04-05 07:43 pm (UTC)(link)
Я ваш богомерзкий язык знаю плохо, но, если все "логические" переменные считать нормальными булевскими, то будет что-то вроде этого:

void OrFirstOrSecond(boolean First, boolean DoOrNot) {
if (First && DoOrNot) {
uf.read(&hb, sizeof(hb));
*hNew= hb;
++hNew;
++i;
}
else if (DoOrNot) {
uf.seek(sizeof(GHarmonicBase), SEEK_CUR);//pass redo data
++hOld;
}
}

И Ваш код:
OrFirstOrSecond(undoCase, op && OpBefore);
OrFirstOrSecond(!undoCase, op && OpAfter);

(никогда в жизни такого говна в своём коде не напишу, но как решение олимпиадной задачи - почему нет?

[identity profile] os80.livejournal.com 2011-04-06 07:54 pm (UTC)(link)
Не, а чо? Всего лишь предыдущий вариант с циклом в функциональном стиле :-)

[identity profile] psilogic.livejournal.com 2011-04-06 07:55 pm (UTC)(link)
да просто последняя фраза повеселила :)