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


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.

Date: 2011-04-05 01:07 pm (UTC)
From: [identity profile] psilogic.livejournal.com
Это код из обработки undo/redo. В случае операции
1) удаления надо сохранить то, что было ДО удаления (для undo),
2) вставки надо сохранить то, что будет ПОСЛЕ вставки (для redo),
3) изменения надо сохранить то, что было ДО (для undo) и будет ПОСЛЕ (для redo) изменения
так и получается одновременно :)

Date: 2011-04-05 01:15 pm (UTC)
From: [identity profile] sfy-y.livejournal.com
А catch - не канает?

Любой подобный наворот говорит о неправильном дизайне. Просто ловить ошибки и отрабатывать.

Date: 2011-04-05 01:16 pm (UTC)
From: [identity profile] psilogic.livejournal.com
да при чем тут ошибки?
обычный undo/redo в редакторе

Date: 2011-04-05 01:18 pm (UTC)
From: [identity profile] sfy-y.livejournal.com
А в чём разница?

Date: 2011-04-05 01:24 pm (UTC)
From: [identity profile] psilogic.livejournal.com
а при чем тут ошибки? :)

Date: 2011-04-05 02:15 pm (UTC)
From: [identity profile] sfy-y.livejournal.com
Упс. Ну, совсем по-быстрому подробно не объясню.

Любая нештатная ситуация легко обрабатывается катчем. А лучше книжки почитать.

Date: 2011-04-05 02:17 pm (UTC)
From: [identity profile] psilogic.livejournal.com
В этом коде нет никакой нештатной ситуации. Просто юзер в редакторе захотел выполнить команду undo или redo.

Date: 2011-04-05 02:29 pm (UTC)
From: [identity profile] sfy-y.livejournal.com
Ой, мама. Всё, уровень понял.

Date: 2011-04-05 02:55 pm (UTC)
From: [identity profile] sfy-y.livejournal.com
Ну, ох 2 раза.

catch команду Undo {
делать Undo
}

Date: 2011-04-05 03:01 pm (UTC)
From: [identity profile] psilogic.livejournal.com
Команда Undo не является нештатной ситуацией.

Date: 2011-04-05 03:03 pm (UTC)
From: [identity profile] sfy-y.livejournal.com
Ну божешка ты ж мой. Просто event-driving. А по жизни - является.

Date: 2011-04-05 03:09 pm (UTC)
From: [identity profile] psilogic.livejournal.com
а catch не является событием (event)

кроме вас, остальные комментаторы суть ухватили

продОлжите строить из себя умного, или, может, хватит? :)

Date: 2011-04-05 03:28 pm (UTC)
From: [identity profile] sfy-y.livejournal.com
Сути не было. Была ошибка в дизайне.
Page generated Aug. 19th, 2025 03:23 pm
Powered by Dreamwidth Studios