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] racoonbear.livejournal.com 2011-04-05 12:14 pm (UTC)(link)
Ты не указал цель оптимизации - уменьшить зависимость от условных переходов, или увеличить скорость, или уменьшить количество строк кода \ вызовов, или улучшить читаемость или...

[identity profile] psilogic.livejournal.com 2011-04-05 12:18 pm (UTC)(link)
Убрать дублирующий код, не увеличивая общий объем кода.

[identity profile] racoonbear.livejournal.com 2011-04-05 12:38 pm (UTC)(link)
звучит как подмена цели средством

[identity profile] psilogic.livejournal.com 2011-04-05 12:38 pm (UTC)(link)
возможно... но как упражнение - почему нет

[identity profile] http://users.livejournal.com/_stilgar/ 2011-04-05 04:42 pm (UTC)(link)
Копипаста плоха тем, что поддерживать ее намного труднее, поэтому от нее нужно избавляться по возможности.

[identity profile] racoonbear.livejournal.com 2011-04-06 01:48 am (UTC)(link)
Спасибо, капитан очкевидность. Но реюз одной строчки может быть не борьбой с копипастой, в затуманиванием смысла. Общая парадигма гласит - выносите в функции или отдельные места (отдельные переменные) то, что по смыслу обрабатывается схоже. А если схожесть случайная, то не надо выносом наверх или в функцию её за уши притягивать.