| Comments: |
А как должен выглядеть system-wide undo в многопользовательской системе?
Так если она многопользовательская, то всякое действие совершается каким-либо пользователем, который может отменять только свои действия.
Но что если какое-либо действие другого пользователя уже сделано с учетом отменяемого? Это означает, что такой undo будет не откатом во времени, а именно "обратным действием" -- простая метафора не работает.
А сохранять состояние системы на каждый момент перед измемением? В этом же вся фенька, или я что-то не так понимаю? Пусть бы уже, действительно, пришел какой-нибудь лесник в духе Беркгаута и меня прогнал.
Вот ровно это-то и не получится. Потому что при восстановлении старого состояния отменятся все действия других пользователей, произведенные со времени твоего отменяемого. Пример -- в следующем комменте vap@lj. Вообще же: 1. Как правило, undo устроен не так. Потому что обычно состояние системы большое, а изменение маленькое. Представь себе, что ты редактируешь мегабайтный файл и стерла в нем букву. Так, как ты описываешь, придется хранить текущее состояние файла плюс такое же огромное предыдущее (и так на всю глубину undo). На самом деле достаточно запомнить, что это была за буква и где стояла. *2. Видимо, идея undo в принципе хорошо подходит далеко не ко всем программам. Она идеальна, когда есть активный пользователь и пассивные данные, с которыми он работает и которые не меняются без его ведома. А как только начинается взаимодействие с внешним миром, undo теряет смысл. Что такое, например, undo в чате? 3. Как только система становится многопользовательской, даже обычные файлы оказываются активной средой -- с ними работают другие. --- *Примечание для программистов: с другой стороны, редактор может быть построен на каких-нибудь Окасакинских структурах -- и тогда, действительно, достаточно сохранять копию, и больших потерь не будет, поскольку большая часть структуры разделяется.
Унду в чате -- это чтобы равносильно команде: "Данную фразу в лог не записывать!" Унду в системе типа uupc -- чтобы равносильно стиранию письма перед отправкой, пока оно лежит-копится в спуле. %-)
| From: | vap@lj |
| Date: | September 23rd, 2004 - 02:56 pm |
|---|
| | | (Link) |
|
Интересная задачка. Ну, например, можно ввести понятие "общение с внешним миром". То есть, все действия, приводящие к выдаче некоторого внешнего воздействия (внешнего по отношению к выч. системе и пользователю), не могут быть откатываемыми (или могут быть, но только в той части, которая "осталась" внутри выч. системы). Тогда все действия, "пересекающие" границы "выч. система + один ее пользователь" объявляются внешними воздействиями и их результаты не откатываются. Пример - в /tmp лежал файл, пользователь 1 его стер, пользователь 2 решил его открыть и обломался, пользователь 1 отменил удаление файла. Файл обратно появился, но пользователь 2 уже успел обломаться.
В таком случае для пользователя оказывается трудно -- а заранее просто невозможно, -- предсказать, какие действия будут отменимыми, а какие нет. Кроме того, одно неотменимое действие закрывает доступ ко всем отменимым, которые были до него. Беркгаут, ау! Сне-гу-роч-ка!
Пользователь 2 может попробовать и еще раз. Мне сразу вспомнилось эмпирическое правило Витуса Вагнера про то, что время устаревания кэша отрицательной информации в мире Open Source - около полугода. Вот ровно то самое, но в действительности. Живем же.
Ой, тогда нормальной работы не будет, а все только будут тыкать в кнопку "отменить", -- кто кого перетыкает... А нельзя так: Вася стирает файл, а он на самом деле остается гдубоко в системе -- в последней версии. Потом Петя открывает файл на запись, а ему система говорит: знаешь, файл я тебе открыть могу, но вообще-то его Вася уже стер. Хочешь -- восстанавливай, редактируй. Петя говорит: давай, хочу. Потом Вася говорит системе: а восстанови-ка мне файл! А система ему: тебе как, в твоей версии, как было перед удалением, или в Васиной новой? Дальше разбираются Петя с Васей лично.
Ну, в жизни-то мы и посложнее задачки решаем. Да и тот же CVS, о котором тут же рядом шла речь, в условиях конкурентной разработки - внесли мы с коллегой пару изменений, а они возьми и подерись (что характерно, могли и не подраться). Ну и что? Кто первый встал, того и грабли. Резолвит конфликт и продолжает. Нормально работается. В обычной жизни, к которой CVS не прикрутишь, тяжелее. Но тоже лечится, и тоже порой результат ошибочного действия исправляется. Не всегда путем Undo :-), но и не всегда путем создания того, что надо, с нуля.
Грубо говоря, в качестве примера могу привести переставление стула в комнате из одного положения в другое. Что, никогда не случалось видеть, как муж переносит обратно стул, который ты 10 минут назад оттуда переставила? И что, в итоге работа кончается, и начинается перетягивание стула?
Я, впрочем, не имел в виду, что система достанет Пете файл, удаленный Васей. Я имел в виду, что система расскажет Пете, что файл удален. Если Петя знает, что он там был, и имеет право его восстановить - результатом будет восстановленный файл, и Васе скажут "ваш файл восстановлен еще вчера". Если не имеет права (в нашем исходном примере, с /tmp - не имеет) - он может вступить во взаимодействие с Васей уже на этом этапе. Если этого почему-то не получилось, он может попробовать еще раз послезавтра - вдруг Вася завтра решит его восстановить?
![[User Picture]](http://lj.rossia.org/userpic/5300/2147486121) | | | совсем в дебри ущли | (Link) |
|
Так это и получается перетягивание стула вместо работы, разве нет?
![[User Picture]](http://lj.rossia.org/userpic/35373/2147509942) | | From: | besm6@lj |
| Date: | September 28th, 2004 - 08:41 am |
|---|
| | Re: совсем в дебри ущли | (Link) |
|
А, то есть у вас дома именно так все запущено? Не, у нас без труда и очень быстро получается договоренность, и работа идет дальше.
![[User Picture]](http://lj.rossia.org/userpic/5300/2147486121) | | | Re: совсем в дебри уШли | (Link) |
|
У нас дома ничего не запущено, я же над своими файлами одна работаю. Я-то говорила про Ваш пример:
...Если этого почему-то не получилось, он может попробовать еще раз послезавтра - вдруг Вася завтра решит его восстановить?
Это же общее рассуждение, а не про конкретною ситуацию.
![[User Picture]](http://lj.rossia.org/userpic/35373/2147509942) | | From: | besm6@lj |
| Date: | September 28th, 2004 - 09:54 am |
|---|
| | Re: совсем в дебри уШли | (Link) |
|
Я недаром привел пример со стулом. Как пример того, что у нормальных людей описанная ситуация не приводит к перетягиванию каната вместо работы. Из того, что ты продолжаешь упорствовать, следует, что пример со стулом у тебя не работает, т.е. если вам с мужем понадобился стул в разных местах комнаты, работа прекращается сразу и напрочь.
> Это же общее рассуждение, а не про конкретною ситуацию
Для опровержения общего утверждения достаточно единственного контрпримера. Программа пятого класса современной неплохой школы.
![[User Picture]](http://lj.rossia.org/userpic/5300/2147486121) | | | переход на личности | (Link) |
|
Да что ты меня этим мужем тыкаешь? Я незамужем! %)
![[User Picture]](http://lj.rossia.org/userpic/35373/2147509942) | | From: | besm6@lj |
| Date: | September 28th, 2004 - 01:43 pm |
|---|
| | Re: переход на личности | (Link) |
|
Я для примера. | |