Интерфейсы

индекс
44,19

Построение интерфейса: описание паттерна «Активные фильтры» (Active Filtering)

image image image image
Фильтры — мы сталкиваемся с ними постоянно, они на сайтах и в приложениях. У кого, при поиске той или иной информации, не возникала мысль: «Здесь бы фильтр не помешал»?

Мы предлагаем поговорить о фильтрации. Зачем она нужна? Ведь кто ищет, тот всегда найдет? И проанализирует? Или все же нет?

Предположим ваш сайт или приложение содержит необходимую для пользователя информацию, причем в большом объеме. Обратиться ли пользователь к Вам? Да, конечно. В худшем случае человек просто запутается в объеме данных, в лучшем сможет самостоятельно отобрать необходимое и отправиться сводить и анализировать все предоставленное ему в отдельных документах и таблицах, которые он будет создавать самостоятельно. Вернется ли он к вам, или пойдет искать более удобное представление необходимым ему данным? Скорее второе.

Мы предлагаем Вам статью, в которой, основываясь на опыте ведущих разработчиков, рассмотрим, зачем и когда имеет смысл использовать фильтры, как их организовать, где расположить, и как сделать понятными для пользователя и сами фильтры, и результаты, полученные с их помощью.


Пользователям приходится отсеивать и перебирать огромное количество информации для того, чтобы, проанализировав ее, найти что-то специфическое.

Что можно сделать?
Дать возможность пользователям изменять фильтры для больших потоков информации, и видеть активно обновляющиеся результаты после выполнения корректирующих запросов.

В каких случаях использовать?
В идеале вам необходимо уметь представлять информацию графически. И хотя этот метод обычно применяют при составлении таблиц и списков, ориентироваться необходимо в первую очередь на пользователя, поскольку метод помогает представить запрашиваемую информацию наглядно.
Сложная или объемная информация по меньшей мере должна содержать один (а лучше несколько) параметров фильтрации. Обычно в параметры фильтрации входит целый набор аспектов: цифры, данные, логические значения или иные известные величины, которые пользователь может без усилий изменить с помощью слайдера/бегунка, чекбокса, переключателя, выпадающего списка, и т.д. Использование простого текстового ввода с клавиатуры, основанное на ключевом слове, менее распространено.
Наиболее распространенная цель присутствия фильтров – это предоставление возможности для анализа и исследования. Поиск же какой-то конкретной информации – задача второстепенная.

Почему именно так?
В первоначально называемых «динамических запросах» ключевым открытием стало то, что визуализация полученных результатов – это «наиважнейшая часть активных запросов, равно как и прямое управление уточняющими параметрами в них». Мгновенный или почти мгновенный отклик является решающим для успешного результата, а визуальный контроль облегчает тонкую настройку и корректировку фильтров. Помните, что ключевая цель данного паттерна – это анализ и исследование, поэтому пользователь будет применять активную фильтрацию для того, чтобы помочь себе в восприятии результатов поиска и в поиске интересных соотношений в потоке информации. Фактически, данный паттерн может восприниматься как инструмент для сравнения.
Неотъемлемая часть этого паттерна – это разные виды контроля над фильтрами, которые интуитивно понятны, легки в использовании, и, к тому же, не вынуждают пользователя переключаться с простого указания курсором мышки (стилуса) на ввод данных с клавиатуры. Для соблюдения правил этого паттерна следует полностью избегать ввода данных с клавиатуры. В противном случае: представьте себе пользователя, применяющего сенсорный экран терминала, карманного ПК, или мобильного телефона. Крайне неудобно, если таковым пользователям придётся переключаться на клавиатурный ввод, чтобы найти желаемое.
Этот метод намного лучше, чем представление множества поисковых форм с открытыми критериями для выполнения запросов или чем использование какого-либо языка для запросов, по двум причинам: пользователю удобен мгновенный отклик и отсутствие необходимости ввода данных с клавиатуры.
Если вы хотите использовать этот метод для поиска специфической информации, то наиболее подходящим кандидатом для этого стала бы Фасетная навигация, которая похожа на данный паттерн, но, однако, более приспособлена к поиску, чем к изучению, анализу и/или сравнениию. Также хотелось бы отметить следующее: если критерий имеет простую линейную зависимость c данными, отображаемыми в форме таблицы, то лучше смотреть в сторону такого паттерна как Табличный фильтр, поскольку его легче выполнить и он более понятен.

Как же это сделать?
Необходимо будет поделить экран на 2 основные зоны: результаты и фильтры. Результаты могут быть визуальными (например, в форме графика или иерархического дерева) или даже просто в виде списка или таблицы. Какой из методов визуализации наибольшим образом подходит для текущей информации решать вам, но следует отдавать предпочтение графической, как очень важной для анализа и исследования.
Область фильтрации должна быть расположена в очевидном месте и быть четко определенной. Она должна, легко ассоциироваться с результатами, так чтобы не было даже малейшей двусмысленности в том, к чему применяется фильтр. Это обычно достигается через визуальную схожесть – поместите его непосредственно рядом или выше результатов. Ниже – обычно не самый лучший вариант, если только фильтры и результаты все еще соотносятся друг с другом на одном экране.
Виды контроля, как это отмечено в «Логическом обосновании», должны осуществляться с помощью указующих устройств (курсора мышки, стилуса, пальца человека на сенсорном экране). Для линейного поиска данных используется двухкнопочный слайдер. Для однозначных числовых и временных величин также можно использовать слайдер. Если критерий поиска зрительно понятен, то можно использовать селектор, но сводить его к минимуму из-за пространственных ограничений. Пользователи не должны прокручивать страницу для просмотра и настройки фильтров. Для последовательных фильтров используются обычные средства — ниспадающие списки и тому подобные.
Идеально, если результат обновляется сразу же, как только меняется фильтр. Например, бегунок слайдера должен инициировать обновление результатов сразу же по мере его перемещения. Если обработка запроса занимает слишком много времени, то наилучшим решением (вторым по важности после мгновенной фильтрации) был бы способ, основанный либо на ослаблении критериев, либо на небольшой задержке во времени. Иначе говоря интерфейс программы может производить небольшую паузу фильтра, после которой обновлять результаты. Наименее подходящий способ фильтрации – это принуждение пользователя (после того, как он воспользовался параметрами фильтра) к нажатию кнопки для отправки запроса. Однако, если обработка запроса занимает более двух секунд, можно ускорить процесс нажатием вручную, дабы облегчить системе задачу. Но в этом случае ценность активной фильтрации находится под вопросом.

Примеры:

Яндекс Маркет
image
Один из самых известных примеров для данного паттерна — это Яндекс Маркет. Тут так же используется набор инструментов из бегунка, чекбоксов, и д.р. При этом пользователь тут же оповещается о количестве отобранных, подходящих под указанные параметры моделей, а результат выводится только после подтверждения введенных данных.
Ссылка на онлайн пример: market.yandex.ru

Nokia
image
Nokia использует в основном чекбоксы, результаты отбора моментально отображаются в правой части экрана.
Ссылка на онлайн пример: www.nokia.ru/products/phones

Демонстрационный интернет-магазин (Flex)
image
В данном примере используются и чекбоксы, и выпадающий список, и бегунок. Очень удобно и красиво выполнен отбор элементов в правой части экрана.
Ссылка на онлайн пример: examples.adobe.com/flex2/inproduct/sdk/flexstore/flexstore.html

МТС. Тарифный калькулятор
image
Это один из наиболее наглядных использований паттерна Активные Фильтры. По мере выставления параметров в левой части экрана, справа появляются данные о наиболее выгодных тарифах.
Ссылка на онлайн пример: www.tk.mts.ru/mskc
+43
1 июня 2010, 11:11
100

комментарии (28)

+2
rocket #
Прошу раскрыть вопрос реализации данной технологии на уровне баз данных. Не гонять же на каждый пользовательский чих select count(*)
0
yakubov #
А может пользоваться SQL_CALC_FOUND_ROWS?
+3
zerkms #
а может всё таки не пользоваться? www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
0
hg_04 #
странная статья, сравнивают SQL_CALC_FOUND_ROWS и count, но при этом к count не плюсуют еще время выполнения выборки 5 айтемов.
+1
zerkms #
Статья очень правильная от очень серьёзных и авторитетных людей.

Что и куда нужно плюсовать?
0
hg_04 #
да был не прав, не внимательным смотрел
–1
radogast #
Я что-то очень сомневаюсь, что подобные серьезные компании будут использовать MySQL. А не серьезные и не заметят нагрузки на сервер базы данных при пересчетах.
0
hg_04 #
что ж, у всех, такая не любовь к MySQL. В приведенных примерах, где 1 апдейт в секунду будет, поскольку слабо верится, что добавлением товаров занимаются тысячи людей, можно поставить десятки репликаций и все будет летать.
+2
radogast #
Каждому свое. Я готов любить MySQL до тех пор, пока он твердо стоит на ногах, а не валяется в бессознательном состоянии…
+2
TheShock #
гугл ведь пользуется
0
zarazum #
А Facebook использует…
0
apple_fan #
По-идее можно всё сильно кешировать. Естественно, будут проблемы с часто обновляющимися данными (вроде количества оставшихся билетов). Может, в таких случаях можно предупреждать: «Данные могут быть немного устаревшими».
+1
qbique #
круто! пользователю сразу станет легче от осознания того, что он работает с неактуальными данными
0
KLUBS #
А может один раз выбрать все необходимые метрики. Как пользователь выберет что-то тогда уже загрузить отдельно эту сущность из базы и показать актуальные данные.
+1
web4_0 #
Можно и сфинкс заюзать, если абсолютная точность данных не критична.
0
zerkms #
а вариантов других нет — или грузить всё и фильтровать на клиенте (допустимо только тогда, когда данных реально мало. как оптимизация для узких диапазонов — вполне) или делать аяксовые запросы.

да и COUNT(*) совсем не страшный, правда.
0
lair #
(а) почему бы и не гонять? его стоимость на правильной базе невелика.
(б) если оказывается, что стоимость велика, можно кэшировать сабсет данных по поиску целиком, и в памяти делать выборки по нему.
0
vooD #
Объясните, почему эта статья — перевод, и почему ссылка на оригинал ведет не на статью?
0
MKrivosheev #
Что значит «почему эта статья — перевод»? Потому что, видимо, она переведена с другого языка.
Ваш Капитан.

А по поводу ссылки согласен, лучше наверно подправить.
0
Kuper #
Вещь действительно очень полезная и удобная… Где бы почитать про реализацию данной системы? Может кто-нить поделится ссылкой/опытом?
+2
AlexeyTokar #
Да что там читать-то?

На примере kinobaza.tv/filter

Клиентская часть фильтра реализуется элементарно на JS созданием пяти классов (единичный выбор, множественный выбор, выбор диапазона + вспомогательные 2 класса). Затем для каждого критерия фильтра создается объект соответствующего класса, на события изменения объекта навешиваются обновления интерфейса (Observer)

Как было сказано в статье, если выборка долго выполняется, то ставим задержку (пол секунды достаточно). По истечении задержки, если больше изменений фильтра небыло, отправляем запрос на сервер. Обработкой фильтра и поиском подходящих результатов у нас занимается Sphinx. Он выдает id элементов, попавших под выборку. По этим id получаются записи из БД или кеша (в зависимости от наличия во втором).

Ну и финальный этап — генерация представления и вставка вместо уже существующего блока с результатами :)
0
laevsky #
Если пользователь во время фильтрации изменил значение фильтра, race condition не возникает? И как с этим бороться кроме блокирования фильтров или синхронного аякс запроса?
0
AlexeyTokar #
прерываем текущий активный запрос и иннициируем новый, благо XmlHttpRequest позволяет. Этому конечно же предверяем отложенную загрузку с учетом что пользователь мог изменить фильтр случайно и решил исправиться.
0
laevsky #
Ага, точно, спасибо=)
–3
AlexFadeev #
Жаль только, что у МТС калькулятор на flash выполнен (для всего этого есть jQuery, притом из коробки), да еще и вылазит из верстки…
0
webdiktor #
Каждый вариант имеет свои недостатки и достоинства, и универсального нету.
Месяц назад на хабре был обзор англоязычных статей про интерфейсы, очень понравилось первое решение. Вполне может посоревноваться с примером с Нокиа.
Интересная реализация получилась на Подбор подарка
Те же фильтры, они же представлены в виде теста, в любой момент предлагается выбрать значение одного фильтра, однако одним кликом можно перейти на любой другой фильтр.
Очень актуально, когда вариантов выбора всех значений для всех фильтров очень много.
В этой задачей это кажется лучшим вариантом, но, разумеется, не универсальным.
Хотя если бы и был какой-то универсальный, лучший механизм, внедренный повсеместно — привыкшие к такому интерфейсу пользователи не замечали бы его возможных недостатков.
0
keltanas #
Как бы так сделать, чтобы при выборе другого региона, вся эта флэшина не заргужалась заново…
И у меня создалось впечатление, что Питер в явном игноре…
0
dimaniko #
Безотносительно к паттерну и переводу. «Автор», каталог паттернов Quince — на три четверти тянут из книжки Тидвелл: designinginterfaces.com/

Красавцы.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.