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] sfy-y.livejournal.com 2011-04-05 01:05 pm (UTC)(link)
Тогда делать макрики и не париться.

Но одновременно before и after - не по моим мозгам. :)))


Скачайте как-нить сафроутер (ну, оттуда, например,http://as.fatal.ru/projects/route/index.htm ) - так программил я.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[identity profile] sfy-y.livejournal.com 2011-04-05 03:28 pm (UTC)(link)
Сути не было. Была ошибка в дизайне.