Знаете, я ж могу нажать её.
Не просто нажать, я могу нажать в самый неподходящий момент. Я могу нажать её в середине процесса копирования большого файла, сразу после того, как запустится второй поток.
В следующий раз, когда вы решите добавить кнопку отмены, думайте о ней, как об обязательстве.
В моём мире кнопка отмены имеет два смысла.
Остановить что-то, но ничего не сломать.
Останови, это, мать твою!
Я много раз сталкивался с поведением кнопки отмены, которое неочевидно для пользователя. Обычно я начинаю тыкать кнопку отмены всякий раз, когда вижу её, этим пугаю своих коллег. Я делаю это, чтобы выяснить, что кнопка отмены — зло. И это так. Большинство кнопок отмены срабатывали не сразу или не отменяли глобальные изменения.
Я обнаружил также, что в большинстве программ, вместо того, чтобы реализовать кнопку отмены, программу приходится убивать в памяти, чтобы завершить наполовину сделанную работу без возможности отката.
Немного поясню, какую кнопку я имею в виду. Это не та кнопка, которая появляется в диалоге Ok/Отмена. В большинстве случаев эта кнопка отмены работает, так как выполняет всего лишь функцию возврата обратно, она не отменяет какой-то процесс.
Я говорю о кнопке отмены, которая завершает процесс. Например, кнопка отмены при установке программы или во время обновления из SVN.
Можно называть такой элемент «кнопка для отмены асинхронных операций».
Ну, ладно, только не обманывайте пользователя. Есть вещи, которые в принципе нельзя отменить.
Когда я в самолете, я могу отменить свою поездку, когда дверь в салон еще не закрыта. Я даже могу отменить поездку, когда самолет выкатывается на полосу, если закричу «Я ща всех изнасилую, а потом взорву самолет!»
Но я не могу отменить поездку, когда самолет в воздухе. Если только попробую… Будет плохо. Очень плохо.
Итак, что же делать, когда я деинсталлирую программу или программа меняет базу данных и я вижу эти славненькие маленькие кнопочки отмены? Можно ли их нажать в любой момент?
Конечно же нет! Естественно, что какую-то часть процесса нельзя отменить, т.к. последствия будут фатальными или уже слишком поздно для отката.
Имхо, если действительно нельзя что-то отменить, не показывайте кнопку отмены, как-будто отменить можно. Просто напишите: «Извините, вы не можете отменить этот процесс сейчас».
Я даже не хочу знать, почему я не могу что-то отменить. То есть, что сделает меня более счастливым, знание того, что Большой адронный коллайдер может уничтожить Землю (the Unicorn Glitter Engine is in a critical state and any disruptions could end life) в случае отмены или кнопка отмены просто будет не активной (или вовсе не видна)?
Я виню себя. Я знаю, что создал кучу кнопок отмены в прошлом, от которых больно и тоскливо.
Но что мы можем сделать как разработчики?
В первую очередь, мы должны тщательно продумывать, что будет в случае прерывания длительного процесса. На каждом шаге процесса нужно предусмотреть возможность отмены, если это не приведёт к удалению данных и зависанию приложения. В любом длительном процессе нужно определить, какие части можно отменить, какие нет смысла отменять.
Ваша задача, как разработчика, обеспечить именно отмену процесса, причем немедленную. Это очень важно!
Это поведение, которое пользователи ожидают от приложения и от самого значения слова «отменить». Конечно, чтобы сделать это, нужно проделать дополнительную работу. Возможно, вам придётся долго продумывать многопоточность вашего приложения. Придется долго продумывать процесс отката. Но, если вы не сделаете этого, ваша кнопка отмены будет похожа на историю про мальчика, который кричал «Волк!», но никто не верил ему.
Если вы не готовы проделать такую работу, то лучше не показывайте пользователям кнопку отмены, потому, что, спорим, я её нажму!
Не просто нажать, я могу нажать в самый неподходящий момент. Я могу нажать её в середине процесса копирования большого файла, сразу после того, как запустится второй поток.
Отмена это обязательство
В следующий раз, когда вы решите добавить кнопку отмены, думайте о ней, как об обязательстве.
В моём мире кнопка отмены имеет два смысла.
Остановить что-то, но ничего не сломать.
Останови, это, мать твою!
Я много раз сталкивался с поведением кнопки отмены, которое неочевидно для пользователя. Обычно я начинаю тыкать кнопку отмены всякий раз, когда вижу её, этим пугаю своих коллег. Я делаю это, чтобы выяснить, что кнопка отмены — зло. И это так. Большинство кнопок отмены срабатывали не сразу или не отменяли глобальные изменения.
Я обнаружил также, что в большинстве программ, вместо того, чтобы реализовать кнопку отмены, программу приходится убивать в памяти, чтобы завершить наполовину сделанную работу без возможности отката.
Проясняем ситуацию
Немного поясню, какую кнопку я имею в виду. Это не та кнопка, которая появляется в диалоге Ok/Отмена. В большинстве случаев эта кнопка отмены работает, так как выполняет всего лишь функцию возврата обратно, она не отменяет какой-то процесс.
Я говорю о кнопке отмены, которая завершает процесс. Например, кнопка отмены при установке программы или во время обновления из SVN.
Можно называть такой элемент «кнопка для отмены асинхронных операций».
Но нужно дать возможность пользователю отменять действия
Ну, ладно, только не обманывайте пользователя. Есть вещи, которые в принципе нельзя отменить.
Когда я в самолете, я могу отменить свою поездку, когда дверь в салон еще не закрыта. Я даже могу отменить поездку, когда самолет выкатывается на полосу, если закричу «Я ща всех изнасилую, а потом взорву самолет!»
Но я не могу отменить поездку, когда самолет в воздухе. Если только попробую… Будет плохо. Очень плохо.
Итак, что же делать, когда я деинсталлирую программу или программа меняет базу данных и я вижу эти славненькие маленькие кнопочки отмены? Можно ли их нажать в любой момент?
Конечно же нет! Естественно, что какую-то часть процесса нельзя отменить, т.к. последствия будут фатальными или уже слишком поздно для отката.
Имхо, если действительно нельзя что-то отменить, не показывайте кнопку отмены, как-будто отменить можно. Просто напишите: «Извините, вы не можете отменить этот процесс сейчас».
Я даже не хочу знать, почему я не могу что-то отменить. То есть, что сделает меня более счастливым, знание того, что Большой адронный коллайдер может уничтожить Землю (the Unicorn Glitter Engine is in a critical state and any disruptions could end life) в случае отмены или кнопка отмены просто будет не активной (или вовсе не видна)?
Возвращаясь к разработчикам
Я виню себя. Я знаю, что создал кучу кнопок отмены в прошлом, от которых больно и тоскливо.
Но что мы можем сделать как разработчики?
В первую очередь, мы должны тщательно продумывать, что будет в случае прерывания длительного процесса. На каждом шаге процесса нужно предусмотреть возможность отмены, если это не приведёт к удалению данных и зависанию приложения. В любом длительном процессе нужно определить, какие части можно отменить, какие нет смысла отменять.
Ваша задача, как разработчика, обеспечить именно отмену процесса, причем немедленную. Это очень важно!
Это поведение, которое пользователи ожидают от приложения и от самого значения слова «отменить». Конечно, чтобы сделать это, нужно проделать дополнительную работу. Возможно, вам придётся долго продумывать многопоточность вашего приложения. Придется долго продумывать процесс отката. Но, если вы не сделаете этого, ваша кнопка отмены будет похожа на историю про мальчика, который кричал «Волк!», но никто не верил ему.
Если вы не готовы проделать такую работу, то лучше не показывайте пользователям кнопку отмены, потому, что, спорим, я её нажму!