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 12:46 pm (UTC)(link)
// op&OpBefore ==!(op&OpAfter) accepted


(undoCase&(!op&OpAfter))?(uf.read(&hb, sizeof(hb)),*hNew++= hb,++i;) :
uf.seek(sizeof(GHarmonicBase), SEEK_CUR),++hOld)

Усё.

[identity profile] psilogic.livejournal.com 2011-04-05 12:50 pm (UTC)(link)
Ничего не понял...
Одно ясно, что это неверно, т.к. в некоторых случаях может понадобится seek+read или read+seek, а у вас - только read либо только seek

[identity profile] sfy-y.livejournal.com 2011-04-05 12:56 pm (UTC)(link)
Там в начале дисклеймер, (предполагается, что программер умеет именовать переменные)

[identity profile] psilogic.livejournal.com 2011-04-05 12:59 pm (UTC)(link)
хрен поймешь этот дисклеймер

но OpBefore == 1, OpAfter == 2, а op == некая комбинация битов, включая OpBefore и OpAfter

[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. А по жизни - является.

(no subject)

[identity profile] psilogic.livejournal.com - 2011-04-05 15:09 (UTC) - Expand

(no subject)

[identity profile] sfy-y.livejournal.com - 2011-04-05 15:28 (UTC) - Expand

[identity profile] sfy-y.livejournal.com 2011-04-05 02:28 pm (UTC)(link)
Где там у Вас в коде выполняется seek+read или read+seek?

[identity profile] psilogic.livejournal.com 2011-04-05 03:01 pm (UTC)(link)
уровень понял :)

[identity profile] sfy-y.livejournal.com 2011-04-05 03:06 pm (UTC)(link)
Увидел. Так это ошибка by design.

Пойдете с электронным паспортом через контроль - кивните, стэк драйверов там мой. :)

[identity profile] psilogic.livejournal.com 2011-04-05 03:11 pm (UTC)(link)
"стек драйверов" - какие слова знаете :))))

[identity profile] sfy-y.livejournal.com 2011-04-05 03:33 pm (UTC)(link)
Так случилось. Я и Кнута читал, и Оллонгрена, и Мартина, и много кого ещё. Когда-то писал ЦУПы (6 штук). В 2005-2006 от скуки написал драйверы для электронных паспортов (по заказу ГУП Атлас).

Шли бы Вы со своими редакторами? :)))

[identity profile] boldcat.livejournal.com 2011-04-09 02:55 pm (UTC)(link)
Где у Кнута написано, что по можно посмотреть на названия переменных и переписать логику?

[identity profile] sfy-y.livejournal.com 2011-04-09 03:13 pm (UTC)(link)
А в каком словаре написано, что fat и bold - синонимы?

[identity profile] boldcat.livejournal.com 2011-04-09 05:58 pm (UTC)(link)
:) :) :) :)
А я никнейм не по словарю подбирал :)
Желаю Вам успехов!

[identity profile] sfy-y.livejournal.com 2011-04-09 06:20 pm (UTC)(link)
:))) И Вам.