<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.wpal &#187; web</title>
	<atom:link href="http://blog.web2.com.ua/tag/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.web2.com.ua</link>
	<description>web, programming and linux</description>
	<lastBuildDate>Fri, 20 May 2011 13:29:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Функция отмены последнего действия (Undo) &#8211; это просто (Часть 1.5)</title>
		<link>http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/</link>
		<comments>http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/#comments</comments>
		<pubDate>Wed, 26 Sep 2007 22:48:51 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[translate]]></category>
		<category><![CDATA[Undo]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/</guid>
		<description><![CDATA[Продолжаю переводить серию статей о реализации Undo. Это вторая часть первой части серии заметок &#8220;Функция отмены последнего действия (Undo)&#8221;. Если вы её пропустили, то сначала прочитайте первую часть (перевод первой части).Один с моих читателей, Alex Botero-Lowry, отметил большую проблему реализации Undo c очереди полностью на стороне клиента: если пользователь открывает эту же страницу на второй [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Продолжаю переводить серию статей о реализации Undo.</p></blockquote>
<p><img src="http://blog.web2.com.ua/wp-content/uploads/undo.jpg" class="short" height="135" width="180" />Это вторая часть первой части серии заметок &#8220;Функция отмены последнего действия (Undo)&#8221;. Если вы её пропустили, то сначала прочитайте <a href="http://humanized.com/weblog/2007/09/14/undo-made-easy-with-ajax-part-1/" class="new" target="_blank" title="Undo Made Easy with Ajax (Part 1)">первую часть</a> (<a href="http://blog.web2.com.ua/2007/09/24/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-1/" class="new">перевод первой части</a>).Один с моих читателей, <a href="http://www.geekfire.com/%7Ealex/blog/" class="new" target="_blank" title="Alex Botero-Lowry">Alex Botero-Lowry</a>, отметил большую проблему реализации Undo c очереди полностью на стороне клиента: если пользователь открывает эту же страницу на второй вкладке браузера для просмотра, то эти страницы могут быть не синхронизированы. В примере to-do листа, если вы удаляете три to-do листа и открываете новую вкладку или окно  этой же страницы, то эти to-do всё-таки останутся. Почему? Потому что первая страница знает о удалении (хотя оно и не законченное), а вторая &#8211; нет.<span id="more-395"></span></p>
<p>Возьмем клиентский подход и запустим его. В том, что нет запутанного back-end&#8217;а есть что-то красивое. Мы можем исправить проблему множественных вкладок, синхронизируя очередь событий  со всех открытых страниц с помощью кукиз (cookie).</p>
<p>Хочу подчеркнуть, что метод очереди событий &#8211; очень легкое решение отмены действия. Существуют другие, более надёжные пути реализации Undo, такие как основаные на серверной стороне <a href="http://en.wikipedia.org/wiki/Command_pattern" title="command pattern" class="new">command pattern</a> (пару моих читателей обратили на это внимание и я, возможно, рассмотрю это в следующих заметках). Но это не относится к делу. Когда мы, как инженеры, стараемся решить сложные проблемы, мы часто слишком обобщаем и слишком абстрагируемся к своему back-end решению, не замечая других вариантов. Когда мы делаем это, мы пропускаем простые решения, которые могут помочь пользователям <em>уже сейчас</em>. Некоторые формы Undo как низко-висячие фрукты, почему же не сорвать их? Конец отступления.</p>
<p>Повторяю, мы решаем что случится, когда пользователь удалит некоторые элементы, откроет другую вкладку этой же страницы и те пункты, оказывается, не удалены. Предположим, что очередь событий хранит идентификаторы удалённых объектов и каждый раз когда элемент удаляется или удаление незаконченное, мы пишем очередь в cookie; когда страница закрывается &#8211; мы очищаем куки. Когда страница загружается &#8211; мы проверяем куки и если в них есть не пустой список, то мы на стороне клиента &#8220;удаляем&#8221; элементы и добавляем их в очередь. Теперь каждая новая вкладка/окно открывается, мы гарантировано синхронизируем их.</p>
<p>Проблема решена.</p>
<h2>Сложность</h2>
<p>Итак, что случится когда вы сделаете изменения на одной странице, а потом переключитесь на другую, уже открытую страницу? Это может усложнить жизнь. Мы спасены от необходимости иметь дело с всей проблемой, потому что web не технология &#8220;толчка&#8221;.  В настоящее время, никакое приложение сети, о котором я знаю, без возможности ручного обновления, не может обновить страницу, когда она изменена в другой вкладке. Пользователи используют обновление страницы, чтобы увидеть изменения. Это означает, что мы должны правильно обходится с вариантом, когда пользователь удаляет и восстанавливает данные в одной вкладке, возвращается в другую и нажимает refresh.</p>
<p>Чтобы решить эту проблему, мы должны сделать предположение, что последняя вкладка/окно, в котором пользователь что-то редактировал, содержит наиболее актуальную информацию. Это резонное предположение, потому что последнее с чем пользователь работал, наиболее вероятно будет тем, о чем пользователь думал как последняя версия.</p>
<p>Когда же пользователь обновляет страницу, вызывается метод onUnload. В нём мы должны проверить, совпадает ли очередь страницы с очередью последней сохранённой в кукисах очередью (помните, что очередь событий сохраняется в cookie, когда пользователь удаляет или отменяет удаление). Если две очереди одинаковые, то страница актуальна и мы продолжаем передачу изменений ксерверу. Если две очереди не одинаковые, то текущая страница требует синхронизации с сохранённой в куках очередью, в результате чего она обновляется.</p>
<h2>Попробуйте</h2>
<p>Поиграйте с <a href="http://humanized.com/weblog/images/resources/undo/todo_sync.html" class="new">этим</a>, затем откройте новое окно браузера. Теперь, измените что-то в новом окне и потом обновите старое окно. Всё правильно обновляется.</p>
<h2>Исходный код</h2>
<p><a href="http://humanized.com/weblog/images/resources/undo/source_sync.php" class="new" title="Находится  здесь">&#8230;находится здесь</a>.</p>
<h2><strong>Заключение</strong></h2>
<p>Польза от пути cookie заключается в том, что это улучшает положение с уже редком случае, когда пользователь теряет свою работу в случае краша браузера. Когда браузер &#8220;падает&#8221;, то все изменения сохраняются в куках, итак, когда пользователь загружает страницу опять, его изменения вся-таки применяться.</p>
<p>Система очереди событий с синхронизацией на куках &#8211; это низковисячий фрукт. Это работает не везде, но будет работать в поразительно большом количестве случаев. Это стоит сравнительно небольших сроков.</p>
<p>На следующей неделе, я напишу о решении Undo для время-зависимых действий.</p>
<p><strong>Перевод:</strong> <a href="http://humanized.com/weblog/2007/09/21/undo-made-easy-with-ajax-part-15/" target="_blank" class="new">Undo Made Easy with Ajax (Part 1.5)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

