12.01.2012, 14:14 | #1 |
Участник
|
Серые кнопки. Изначально неверное решение.
Предыстория:
В стандартной функциональности Ахарты повсеместно используются "серые" кнопки. То есть в какой-то момент времени кнопка доступна, а в какой-то момент времени она становится недоступной и пользователь не может на нее нажать. Казалось бы - о! Как здорово! Пользователю не даем делать то, что ему нельзя! На самом деле - все совсем не так. Мне кажется - это абсолютно НЕВЕРНОЕ решение. Серые кнопки в многопользовательской среде - это полный абсурд! А теперь обосную свою точку зрения. Доводы Почему НЕЛЬЗЯ делать кнопки недоступными 1. Ахарта - многопользовательска среда. И если эта конкретная кнопка в данный момент на данной форме недоступна, то это НЕ ОЗНАЧАЕТ, что это действие в данный момент времени на данной форме совершить нельзя. Это означает, что в момент, когда открывались текущие данные это действие делать было нельзя. Но через буквально полсекунды после того, как эта кнопка отобразилась недоступной, какой-то другой пользователь сделал действие, которое РАЗРЕШАЕТ действие по данной кнопке. Но текущая форма (а следовательно и пользователь) об этом еще НЕ ЗНАЮТ. В итоге - только после обновления данных становится возможным сделать уже давно доступную операцию. Еще хуже, если кнопка в момент отображения данных доступна. На самом деле - какой-то другой пользователь уже мог сделать другую или эту же операцию со своего рабочего места! Но текущая форма (а следовательно и пользователь) об этом еще НЕ ЗНАЮТ. Пользователь радостно жмет на доступную кнопку.... И тут масса вариантов. От корректного отображения ошибки (если программист был хороший) до полного бреда в данных и краха базы. 2. Информативность. Основное объяснение почему надо сделать недоступную кнопку от постановщиков задачи и конечных пользователей: "Вот кнопка серая и пользователь сразу видит, что данную операцию делать нельзя." Даже если не принимать в расчет довод №1 о многопользовательской среде, все равно данное объяснение не выдерживает никакой критики по одной простой причине. "ПОЧЕМУ нельзя?!" А ведь данный вопрос постоянно возникает перед пользователем, когда он видит серую кнопку. Хорошо, если пользователь опытный. Он знает, что разнесенный заказ уже нельзя больше разнести. Тут и тупой сообразит. А что делать, если недоступна кнопка например изменения настроек? Вот она была доступной, и вдруг стала недоступной. Почему?! И побежал бедный неопытный пользователь к более опытному товарищу. Более опытный товарищ посмотрел на эту серую кнопку, почесал репу, и сказал "Не знаю". И побежали они оба к консультанту. Консультант посмотрел на эту серую кнопку, почесал репу, и сказал "Не знаю". И побежали они втроем к программисту. Программист поставил точку останова на форме и посмотрел в коде отчего же эта кнопка все таки серая... Ага. Вот почему!!! Все стало ясно и понятно. Все правильно. Она должна быть серой. Все довольны, все смеются. Всего этого можно было бы легко избежать, если бы кнопка оставалась доступной, но перед началом операции была сделана обязательная проверка на допустимость совершаемых действий. И если вдруг данное действие в данный момент времени запрещено, то пользователю было бы выдано ясное и понятное сообщение ПОЧЕМУ этого делать нельзя. Сразу снимается куча вопросов. 3. Информативность. Пункт два. Возражение от постановщиков задачи и конечных пользователей: "Но ведь пользователь сразу хочет видеть что данное действие недопустимо, не нажимая на кнопку!" Даже если не принимать в расчет довод №1 о многопользовательской среде, все равно, данное требование не удовлетворяется Недоступностью кнопки. Потому что для того, чтобы увидеть, что данное действие недоступно нужно обязательно сделать текущими просматриваемые данные. Например в гриде выбрать определенную запись. И если нужно просмотреть допустимость действия по ста записям, нужно встать на каждую!! из этих ста записей. Поэтому "сразу" это не аргумент. Сразу - это выведенная иконка для каждой записи в гриде или информативное дисплейное поле. Например, если по какой-то записи нужно отображать - есть дочерние документы или их нет, то делать кнопку открытия дочерних документов недоступной - не информативно. Намного лучше - вывести дисплейную иконку для каждой строки грида, отображающую что документы есть. И можно даже этой иконкой отобразить в каком статусе эти документы. Подобное, более оптимальное и информативное решение, альтернативное "серой кнопке", можно найти в каждом конкретном случае. 4. Производительность. Играться с доступностью кнопки – ресурсоемкое занятие. При каждом действии пользователя, форма должна отслеживать какие данные изменились и делать запрос к базе данных для того, чтобы определить какие кнопки делать недоступными, а какие нет. Таких запросов может быть очень много (если много кнопок на форме) и эти запросы будут валиться к базе данных ПОСТОЯННО. При каждой смене строки. Если же продумать более верное решение - например дисплейное поле, то запрос к базе данных будет сделан только для отображаемых в данный момент записей. один раз. может быть несколько запросов, но все равно их будет меньше, чем при постоянной проверки допустимости кнопок. 5. Программируемость. Для того, чтобы сделать кнопки серыми мы никак не можем обойтись без программного кода на форме. Программный код на форме - это изначально плохо. Даже если мы весь код запросов переносим в статические методы на сервер, даже если мы переносим методы анализа в класс... Все равно. Программирование и последующая поддержка формы для программиста усложняется в разы. К тому же, обычно, код, который делает кнопки недоступными, полностью дублирует (должен дублировать!) код проверки допустимости совершения конкретного действия. что приводит к дублированию кода и постоянному расхождению в критериях "доступности" кнопки и реальной возможности сделать какое-либо действие. Для программиста всегда намного проще сделать одну проверку в нужном классе, чем постоянно дергать форму для того, чтобы изменить критерии доступности кнопки. Вывод Серые кнопки - ЗЛО. Все должны это понимать. Даже если все же принимается решение делать конкретную кнопку недоступной при некоторых критериях, мы должны обязательно принимать во внимания изложенные выше соображения. ПС Не смог сдержать крик души. На каждом проекте - одно и то же! Серые кнопки... серые кнопки... серые кнопки. И на каждом проекте приходится с ними долго и упорно сражаться и жить.... Я не призываю полностью отказаться от серых кнопок. Я не призываю переписать уже имеющийся функционал. Давайте хоть новую функциональность проектировать грамотно? |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5), Ivanhoe (3), Lucky13 (3), Roman777 (2), rINT (1), pitersky (2), Bega (2), e@gle (3), mazzy (2), Corkscrew (1), Logger (2). |
12.01.2012, 14:56 | #2 |
Участник
|
Я бы не был столь категоричным
Поэтому нужно и программировать с учетом, что среда многопользовательская. Яркий пример форма складского журнала. Обратите внимание на метод formMethodTimeOutRedraw в классе JournalFormTable, который как раз и занимается обновлением текущего курсора через определенные моменты времени. На это должны быть пользовательские инструкции. Да HelpText для кнопки никто не отменял. Такие кнопки обычно кидаются в подменю, чтобы не устраивать "светомузыку" на форме. В таком случае не так уж и часто вызываются всякие проверки. Цитата:
Проверка - есть законченное действие. Нужно выносить её в отдельный метод. Потом вызывайте этот метод сколько душе угодно. Никакого дублирования нет. |
|
|
За это сообщение автора поблагодарили: (1), gl00mie (2). |
12.01.2012, 15:12 | #3 |
Участник
|
Довод "Многопользовательская среда", имхо, натянут.
Довод "Информативность" очень подкупает. Выскажу своё мнение по поводу информативности. "Информативность" полезна при обучении. При активной работе более приоритетными становятся другие требования к интерфейсу. Я бы не смешивал вместе эргономику рабочего интерфейса и контекстной справки. Цитата:
Т.е. допустим, что для обработки некого документа необходимо провести его через 5 статусов. Для этого делаем 5 кнопок расположенных друг под другом. Пусть специфика процесса такова что некоторые статусы можно перепрыгивать, а некоторые нет. Если кнопки всех статусов будут всегда активны, то как довести до пользователя информация о том какой из статусов может быть пропущен а какой нет? Также немаловажную роль играет психологический момент. Система, которая "раньше" ограничивает пользователя в неправильных действиях, предвосхищая ошибки, субъективно вызывает больше доверия. |
|
|
За это сообщение автора поблагодарили: lev (5), egorych (5), _scorp_ (5). |
12.01.2012, 15:39 | #4 |
Участник
|
Я не дочитал, но в общем случае, я полностью согласен.
На самом деле, в NAV вроде даже делали прототип, который делал как раз оповещение, если нельзя, с детальной причиной. Думаю, в АХ это тоже когда-то появится. |
|
|
За это сообщение автора поблагодарили: Logger (1). |
12.01.2012, 16:18 | #5 |
Британский учённый
|
Я дочитал и полностью не согласен.
Имхо подход с неактивными кнопками очень удобен, функционален и информативен. Если есть необходимость объяснить пользователю, почему кнопка неактивна, то для этого нужна справка, где пользователь должен иметь возможность получить ответ. Пункт с производительностью мне вообще непонятен, так как считаю что данный прием используются на гриде, где данные уже прочитаны и нет необходимости обращаться к БД вновь. Если такая необходимость есть, то конечно тогда проще сделать проверку по нажатию кнопки - помоем это логично и понятно для любого программиста. Если продолжать мысль автора, то тоже самое можно сказать про запрет редактирования полей, это ведь нужно настраивать свойства поля, а то и возможно в коде менять свойства в рантайме, обращаться к базе, а это ресурсоемкая задача. Можно ведь разрешить редактировать любое поле, а потом выполнять проверку и выводить оповещение с детальной причиной, если обновить поле нельзя.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
12.01.2012, 17:56 | #6 |
Участник
|
Главное преимущество программного вывода сообщения над статической пусть и контекстной справкой в том, что в рантайм есть возможность определить истинную причину недоступности той или иной операции и включить в текст сообщения конкретные значения обрабатываемых величин. В то время как в справке может находится пусть и полный но общий перечень причин. Пользователь читающий такую справку может лишь догадываться из-за каких именно причин кнопка или текстовое поле заблокированно в данной конкретной ситуации.
Хочется иметь возможность "спросить" у заблокированного контрола причину по которой он заблокирован. Но ради этого делать все контролы доступными - перебор. P.S.: Если мыслить шире, подобные рассуждения можно применить не только к свойству "доступности" но и ко всем другим. Представьте себе систему, которая могла бы в любой момент объяснить природу происхождения значения той или иной величины в отчёте и на форме на человеческом языке рассказать по каким правилам было рассчитано значение, какие параметры повлияли на расчёт. Не система - мечта . Утопия? |
|
12.01.2012, 18:26 | #7 |
Британский учённый
|
Вот именно, что утопия. Кнопки это частный случай, я например гораздо чаще сталкиваюсь с необходимостью узнать, почему та или иная галка неактивна или почему система ведет себя именно так, а не как я ожидал. Но почему то обвинили именно кнопки, которые имхо гораздо меньше требуют объяснения при логичной и удачной архитектуре.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
12.01.2012, 22:40 | #8 |
Гость
|
Цитата:
С одной стороны получаем некую заботу системы о пользователе, с другой стороны вознаграждаем информативным сообщением об ошибке особо любознательных. Это конечно извращение, но раз уж пошла такая пьянка ... |
|
13.01.2012, 08:25 | #9 |
Участник
|
Цитата:
Сообщение от Кирилл
Можно просто закрашивать кнопку серым цветом, оставляя доступной для нажатия
С одной стороны получаем некую заботу системы о пользователе, с другой стороны вознаграждаем информативным сообщением об ошибке особо любознательных. Это конечно извращение, но раз уж пошла такая пьянка ... |
|
13.01.2012, 09:22 | #10 |
Участник
|
ИМХО поток сознания не до конца формализован, аргументы сильно притянуты за уши!
Согласен с S.Kuskov - проще предупредить неправильные действия юзера, чем разгребать потом что он сделал! Тем более простым юзерам (кладовщик, например) ну совсем не надо знать почему кнопку нельзя нажать! И сообщения они как правило не читают - "там что-то написано было, но я не прочитал и закрыл" ИМХО 1 - автор рассуждает как чистый консультант! Поработайте на клиенте с годик хотя-бы и узнаете, что лучше не дать нажать или проверять каждый раз. ИМХО 2 - "правильный" подход к программированию (все в классы, долой код на форме и т.п.) хорош в теории, в реальной жизни это приводит к DAX2012, где уже нельзя осуществить поиск номенклатуры по наименованию!
__________________
Axapta 3.0 sp - хз какой, kr2 |
|
|
За это сообщение автора поблагодарили: Link (2). |
13.01.2012, 09:49 | #11 |
северный Будда
|
Цитата:
1) разгребать ничего не надо будет в любом случае. Ни так, ни так никакой обработки данных не будет 2) а вот это совсем неправда. зачем человека держать за дрессированную обезьяну? человек должен понимать смысл того, что он делает и почему он этого сделать не может. хотя бы на самом общем уровне. в целом я согласен с автором. серые кнопки лучше только в том случае, когда имеются не отменяемые пользователем действия (например, разноска складского журнала - её нельзя отменить, можно только отсторнировать сам журнал). во всех остальных случаях предпочтительнее активная кнопка с проверкой.
__________________
С уважением, Вячеслав |
|
13.01.2012, 10:22 | #12 |
Участник
|
Цитата:
Сообщение от pitersky
крайне неубедительные возражения
1) разгребать ничего не надо будет в любом случае. Ни так, ни так никакой обработки данных не будет 2) а вот это совсем неправда. зачем человека держать за дрессированную обезьяну? человек должен понимать смысл того, что он делает и почему он этого сделать не может. хотя бы на самом общем уровне. Понимаете - реалии жизни таковы, что в более-менее большой/средней фирме количество сотрудников, которые могут/а главное ХОТЯТ понимать что они делает достаточно мало. И все они занимают какие-то руководящие должности. А вот люди, которые делают рутинные операции не будут задумываться на д проблемами выскакивающих сообщений! Ну такова жизнь! Может где-то и есть идеальные кладовщики, но их очень мало!
__________________
Axapta 3.0 sp - хз какой, kr2 |
|
13.01.2012, 10:42 | #13 |
северный Будда
|
Цитата:
Сообщение от egorych
Вы консультант/внедренец?
Понимаете - реалии жизни таковы, что в более-менее большой/средней фирме количество сотрудников, которые могут/а главное ХОТЯТ понимать что они делает достаточно мало. И все они занимают какие-то руководящие должности. А вот люди, которые делают рутинные операции не будут задумываться на д проблемами выскакивающих сообщений! Ну такова жизнь! Может где-то и есть идеальные кладовщики, но их очень мало! А по сути - надо требовать от пользователей чтение сообщений. Надо! Я лично требую всегда. Потому что информация в инфолог выводится не просто так. P.S. Я на клиенте работаю, если что.
__________________
С уважением, Вячеслав |
|
|
За это сообщение автора поблагодарили: lev (2). |
14.01.2012, 02:24 | #14 |
Участник
|
В общем-то уже почти все по делу ответили, но ведь это не повод...
Цитата:
Сообщение от ta_and
Не смог сдержать крик души. На каждом проекте - одно и то же! Серые кнопки... серые кнопки... серые кнопки. И на каждом проекте приходится с ними долго и упорно сражаться и жить...
Я не призываю полностью отказаться от серых кнопок. Я не призываю переписать уже имеющийся функционал. Давайте хоть новую функциональность проектировать грамотно? Цитата:
Сообщение от S.Kuskov
Главное преимущество программного вывода сообщения над статической пусть и контекстной справкой в том, что в рантайм есть возможность определить истинную причину недоступности той или иной операции и включить в текст сообщения конкретные значения обрабатываемых величин. Хочется иметь возможность "спросить" у заблокированного контрола причину по которой он заблокирован.
Вообще же, если скатиться к саморекламе я что-то подобное пытался реализовать во Вспомогательных классах проверки условий и утверждений. С момента публикации практически во все методы DEV_Check был добавлен опциональный параметр - выводить ли сообщения или просто возвращать true/false, за счет которого удалось реализовать нечто подобное. Другое дело, что касается это лишь модификаций, реализованных с использованием соотв. классов, т.е. это совсем "нестандарт". И опять же, это все не бесплатно: я как-то оптимизировал с Trace Parcer'ом производительность одного класса (импорт из csv-файла ), и выяснилось, что отчасти в низкой скорости работы виновен указанный класс: за счет кэширования результатов некоторых специфичных проверок удалось ощутимо повысить производительность. Цитата:
Цитата:
|
|
14.01.2012, 11:51 | #15 |
Участник
|
Так нельзя.Это неуважение к автору.
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
16.01.2012, 10:06 | #16 |
северный Будда
|
Цитата:
Сообщение от gl00mie
большей части совершенно не интересны сообщения в инфологе, покуда кнопки нажимаются и что-то делается. Вот когда не делается, не получается - только тогда возникает понимание, что что-то не так. К сожалению, у людей зачастую мотивация (в утрированном, финансовом смысле) такова, что читать инфологи им некогда и незачем, главное - циферки нужные "повысить", потому что платят им за эти циферки, а не за понимание.Увы и ах...
Да и вообще - что значит "некогда и незачем"? я ещё не встречал ситуации, когда обработка с финальным (или ошибочным) инфологом не имела бы никакого отношения к обязанностям человека, её запустившего. А если имеет, значит это и есть его работа - читать такие сообщения и решать возникающие проблемы. либо самостоятельно, либо через непосредственного руководителя.
__________________
С уважением, Вячеслав |
|
|
За это сообщение автора поблагодарили: ta_and (4). |
16.01.2012, 11:07 | #17 |
Участник
|
Цитата:
Решают они конечно эти проблемы - путем перекладывания их на других людей. Если что-то не работает, то инфологи никто не читает, а сразу обращения в техподдержку/к программистам : "Ваша чертова программа ни фига не работает." Хотя в итоге нередко бывает что сам пользователь и накосячил. |
|
16.01.2012, 11:25 | #18 |
северный Будда
|
Цитата:
Так было год назад. Сейчас в 90% случаев звонят с ситуациями, которые действительно не решить на уровне пользователя. Так что это всё разрешимо.
__________________
С уважением, Вячеслав |
|
16.01.2012, 12:06 | #19 |
Участник
|
Бог с ними, с конечными пользователями. Речь то про что была:
Цитата:
Сообщение от ta_and
Хорошо, если пользователь опытный. Он знает, что разнесенный заказ уже нельзя больше разнести. Тут и тупой сообразит. А что делать, если недоступна кнопка например изменения настроек? Вот она была доступной, и вдруг стала недоступной.
Почему?! И побежал бедный неопытный пользователь к более опытному товарищу. Более опытный товарищ посмотрел на эту серую кнопку, почесал репу, и сказал "Не знаю". И побежали они оба к консультанту. Консультант посмотрел на эту серую кнопку, почесал репу, и сказал "Не знаю". И побежали они втроем к программисту... |
|
16.01.2012, 13:04 | #20 |
Участник
|
Думаю было бы удобнее обращаться с серыми кнопками, если бы можно было:
1. Выделить серую кнопку. Сейчас можно выделить только если кнопку помещена в MenuButton, просто кнопку на форме выделить нельзя. По крайне мере в 3.0 так, в других версиях не знаю 2. Задать отдельный HelpText для серой кнопки. То есть еще одно свойство типа DisabledHelpText значение которого показывалось бы как обычный HelpText, но только если кнопка серая. Если пункт 2 можно реализовать, перекрыв метод helpField, то пункт 1 требует изменений в ядре, насколько я знаю |
|
|
За это сообщение автора поблагодарили: Logger (3). |
Теги |
динамический хелп |
|
|