Я могу вспомнить только две веские причины наличия кнопки «Применить»:
- Изменения не могут быть применены мгновенно, но они заблокируют графический интерфейс на заметное время.
- Изменения имеют смысл только вместе (как транзакция).
Ни один из них не очень распространен. Исторически 1 был правдой почти для любого варианта. Но в наши дни компьютеры работают быстрее, а 1 редко актуален. Если эффект изменения можно увидеть мгновенно, почему бы кому-то не захотеть этого? Таким образом, графический интерфейс (но часто не код) можно упростить, пропустив шаг применения. Я не думаю, что это очень часто, что пользователь действительно нуждается в кнопке отмены также, частично потому что это отчасти неоднозначно. Чего следует ожидать, если я внесу одно изменение, подам заявление, внесу другое изменение и нажму "Отмена"? Будет ли отменено первое изменение (в большинстве приложений ответ отрицательный, потому что его легче реализовать)?
Если да, то какой смысл иметь кнопку «Применить», тогда все будет отменено, а затем нажать «OK / Отмена»? Или нам нужно рассмотреть еще один вариант, когда окно закрыто, и в этом случае первое изменение сохраняется, а второе возвращается?
Если нет, тогда apply в основном устанавливает закладку, которая будет возвращена, если нажата кнопка отмены. Но действительно ли такое сложное поведение действительно необходимо в любом случае из реальной жизни?
Разумно ли сохранять такую сложность исторических причин, потому что пользователи (как полагают) ожидают этого? Я видел, как пользователи всегда нажимают «Применить», затем «ОК». Зачем? Возможно, только потому, что графический интерфейс слишком сложен. Или потому, что не уверены, что «применить» означает «применить и отклонить диалог» (что он делает в некоторых приложениях) и что «ОК» может не применить изменения (я видел приложения с ошибками, где «ОК» просто закрывает окно без применения и, возможно, они есть тоже). По крайней мере, я не думаю, что пользователи в целом правы по поводу точных логик этих сложных решений, поэтому им это не нужно, и этого не должно быть. Люди в основном различают «положительные» (да, хорошо, идти вперед, применить) и «отрицательные» (нет, отменить, отменить, вернуться назад) действия в диалогах, когда более одного из них требует большего внимания со стороны пользователя. Интересно, что обмен одним положительным действием с другим, похоже, не сильно влияет на восприятие пользователей. Если диалоговое окно с кнопками «да / нет» изменено на «ОК / Отмена», многие пользователи даже не заметят.
Это о юзабилити (что гораздо важнее, ИМХО). Мгновенное применение с точки зрения ремонтопригодности может быть очень грязным, если сделано неправильно, но также очень чистым и ремонтопригодным, если все сделано правильно. Если приложение написано с применением метода «применить все сразу», обычно есть одна функция. Вызов такой функции для каждого небольшого изменения, конечно, не очень эффективен. То, что я видел, часто решается разделением функции на несколько разных функций для применения разных вещей, в идеале одну выделенную функцию для каждого вида изменений, которые могут быть сделаны. Это сделает приложение намного более отзывчивым, но поддерживать его ужасно. Так что не ходи туда. Оптимальное решение заключается в использовании MVC (Model-View-Controller) и создании модели для каждого элемента конфигурации и привязке их к полям в форме конфигурации, а также к соответствующим частям приложения (и к хранилищу конфигурации). конец, поэтому каждое изменение сохраняется автоматически). Если в рассматриваемой среде нет MVC, его обязательно стоит написать.