что значит опциональные поля
Обязательно или нет? Как отмечать поля в формах
Привет, я Антон, UX-дизайнер в eLama — платформе для автоматизации интернет-рекламы. Мы довольно часто работаем с формами. Раньше мы выделяли обязательные поля, но увидели мнение, что этот подход не самый правильный. Мы решили разобраться, а как правильно, но быстро поняли, что единых правил нет: кто-то делает акцент на обязательных полях, кто-то, наоборот, говорит, что некоторые поля можно пропустить. Попробуем сравнить самые распространенные подходы.
Все делают по-разному
Самые распространенные способы
1. Отмечать обязательные поля звездочкой
➕ Занимает мало места.
➖ Обычно обязательных полей больше, чем необязательных, поэтому визуального шума тоже больше.
➖ Требуют расшифровки в коде для скринридера.
2. Подписывать необязательные поля
➕ Скорее всего, таких отметок будет немного, а значит, визуального шума будет меньше, чем от звездочек.
➕ Мы не давим на пользователя и не принуждаем его заполнять поля. Наоборот, мы экономим его время, показывая ему, что некоторые поля можно пропустить.
➖ Отметка может потеряться на фоне заголовка, и пользователь может ее не увидеть.
➖ Неочевидно, что поля в верхней части формы нужно заполнить обязательно. Пользователь может понять это, только когда увидит необязательные поля.
3. Вообще не отмечать поля, а показывать ошибки при отправке формы
➕ Отсутствие визуального шума. Особенно это важно в больших формах.
➖ Не всем понравится заполнять форму повторно после того, как она загорится красным.
➖ Не сразу понятно, какие поля можно пропустить, а какие нет.
4. Отмечать обязательные поля звездочкой, а необязательные —подписывать
➕ Согласно этому исследованию, такие формы самые удобные: пользователь сразу видит, какое поле пропустить можно, а какое нет.
➖ В больших формах такие отметки создают визуальный шум.
➖ Требуют расшифровки в коде для скринридера.
Важно: ставить обязательные поля выше необязательных
Если пользователь не заметит отметки, он скорее заполнит верхние поля. Если форма разбита на смысловые группы, в каждой из них обязательные поля должны быть выше, чем необязательные.
Как делаем в eLama
Мы решили использовать четвертый способ, потому что удобство пользователя важнее, и это преимущество перевешивает недостатки подхода.
Так обязательное поле не теряется даже в большой форме
Но в некоторых случаях мы используем и третий способ.
Когда не ставим отметки
1. Если поле одно
Чтобы разблокировать кнопку, можно сделать только одно: заполнить поле
2. Если можно заполнить любое поле
Кнопка разблокируется, если заполнить любое из полей
Вместо заключения
Кроме этих способов наверняка есть и другие. Важно выбрать один-два подхода, которые подходят вашему продукту.
Спасибо Сергею Токареву и Елене Отроковой за помощь в подготовке материала и редактуру.
«Опционально» — это значит «возможно, но не обязательно»
Опция, как маркетинговый ход
Конкуренция заставляет производителей товаров и поставщиков услуг стремиться к удешевлению своей продукции. Чтобы привлечь внимание потенциального покупателя к себе, в прайс-листах они часто указывают цену на самые простые комплектации приборов, оборудования и бытовой техники или же на самые дешёвые услуг. А когда заинтересованный клиент появляется, ему рассказывают о том, что он может приобрести еще и это, и то, и вот это, а дополнительно для него могут сделать так и вот так.
Иногда клиент сам спрашивает о наличии какой-либо функции у приглянувшегося ему бытового прибора или механизма.
И тут наступает момент, когда человек слышит это волшебное слово: «опция». Оказывается, всё, что ему предлагают менеджеры фирмы, и всё, о чём он спрашивает сам, опционально — это значит, дополнительно.
О чём речь?
Суть дела в том, что в самой дешёвой (так называемой базовой) комплектации отключены, а иногда и вовсе не смонтированы некоторые функции или устройства, принципиально не влияющие на работоспособность механизма. К примеру, в ноутбук для удешевления не встраивается web-камера, в легковом автомобиле отсутствует стереосистема или вообще нет радиоприёмника.
Продавец тут же объяснит, что интересующая покупателя функция прилагается опционально. Это значит, что для подключения web-камеры или радио есть специальное гнездо, стереосистему специалисты автосервиса встроят такую, какую клиент выберет на витрине, но за отдельную плату.
Как это работает?
Иногда уже дома, изучая инструкцию, покупатель видит напротив какой-либо функции или комплектующей детали пометку «опционально». Возникает закономерный вопрос о том, что значит опциональное подключение?
Всё довольно просто. Например, у автомобиля имеется фаркоп — он есть, и этим всё сказано. А что именно к нему будут цеплять – опционально. Это значит, можно прикрепить грузовой прицеп, чтобы привезти с дачи картошку, а можно с помощью троса вытащить чужой автомобиль из грязи или отправиться в путешествие с домом на колёсах.
То же самое и с любым другим бытовым прибором, компьютером или ноутбуком. К ноутбуку с помощью порта USB опционально можно подключить телефон, фото- и видеокамеру, чтобы скачать на жёсткий диск фотографии или видео, снятые на отдыхе и в гостях. Можно присоединить переносной носитель информации или web-камеру.
Например, есть необходимость связать с ноутбуком смартфон через Bluetooth. У смартфона эта функция имеется и она включается простым нажатием на иконку в меню. А в ноутбуке она имеется опционально — это значит, чтобы ею воспользоваться, нужно подключить к ноутбуку автономный Bluetooth-порт. Операционная система его опознает, активирует подходящий драйвер и всё. Можно пользоваться.
Удобно это или нет?
Удобно. В настоящее время существует настолько большое количество всевозможных дополнительных возможностей, что включение их всех сразу в то или иное устройство может поднять его цену до недосягаемых высот, с одной стороны. А с другой – перегрузит его функциями, не всегда необходимыми или вообще не нужными владельцу.
Зачем переплачивать за наличие багажника на крыше автомобиля, если никто ничего возить на нём не собирается? Зачем человеку, в принципе не увлекающемуся фотографией и видеосъёмками, наличие в телефоне камеры? Ведь её стоимость вложена в цену телефона. Пусть лучше эти возможности остаются опциональными, и те, кому надо, докупят их отдельно.
Использование std::optional в С++17
Давайте возьмём пару от двух типов — что вы можете сделать с композицией подобного рода?
В этой статье я расскажу вам про std::optional — новый вспомогательный тип, добавленный в C++17. Это обёртка для вашего типа и флаг показывает, инициализировано ваше значение или нет. Давайте посмотрим, где это может быть полезно.
Вступление
Добавлением логических флагов к другим типам вы можете достичь то, что называется «Nullable типы». Как было сказано ранее, флаг используется для обозначения того, доступно значение или нет. Такая обёртка выразительно представляет объект, который может быть пустым (не через комментарии :).
Вы можете достигнуть пустого значения объекта с помощью использования уникальных идентификаторов (-1, бесконечность, nullptr ), но это не так точно выражает мысль, как отдельный тип-обёртка. Вы даже можете использовать std::unique_ptr и трактовать пустой указатель как неинициализированный объект — это сработает, но вместе с этим вы должны будете смириться с затратами на выделения памяти для объекта там, где в этом нет необходимости.
Этот тип является типом-значением (value-type) (таким образом, вы можете копировать его). Более того, для std::optional не нужно отдельно выделять память.
Использование
Обычно, опциональный тип может быть использован в следующих сценариях:
Хотя иногда тяжело решить, стоит ли использовать опциональный тип, вы точно не должны его использовать для обработки ошибок. Он лучше всего подходит для тех случаев, когда отсутствие значения является нормальным поведением программы.
Простой пример
Ниже вы можете увидеть простой пример того, что можно сделать с использованием опционального типа:
Серия
Эта статья является частью моей серии про библиотечные утилиты C++17. Вот список других тем, про которые я рассказываю:
Ресурсы по C++17 STL:
Создание std::optional
Есть несколько вариантов создания std::optional :
Как вы можете видеть в примере выше, вам доступна удивительная гибкость создания объекта. Создание объекта очень простое как для примитивных типов, так и для более сложных.
Например, вы можете написать:
Я расскажу про std::in_place позже, не переключайте канал и оставайтесь с нами.
Возврат std::optional из функции
Конечно, вы также можете просто объявить пустой опциональный объект в начале вышей функции и присвоить ему посчитанное значение, если оно корректно. Таким образом, мы можем переписать код выше следующим образом:
Какая версия лучше, зависит от контекста. Я предпочитаю короткие функции, поэтому мой выбор — версия №1 (с несколькими return ).
Получение значения
Возможно, самая важная операция для опционального типа (помимо его создания) — это то, как вы можете получить сохранённое значение.
Для этого есть несколько вариантов:
Таким образом, наиболее удобно, возможно, будет проверить, есть ли реальное значение в опциональном объекте, и затем использовать его:
Возможности std::optional
Давайте посмотрим, какие ещё есть возможности у опционального типа:
Изменение значения
Вот небольшой пример:
Этот код доступен здесь: @Coliru.
Сравнения
При выполнении кода выше, будет выведено:
Этот код доступен здесь: @Coliru.
Примеры с std::optional
Ниже вы найдёте два примера, где std::optional подходит идеально.
Имя пользователя с необязательным никнеймом и возрастом
Этот код доступен здесь: @Coliru.
Парсинг целых чисел из командной строки
Этот код доступен здесь: @Coliru.
Код выше использует опциональный тип данных для того, чтобы показать, успешно ли выполнено преобразование. Обратите внимание, что на самом деле мы обернули исключения, которые могут быть выброшены C++, в опциональный тип данных, поэтому мы пропустим все ошибки, связанные с этим. Этот момент достаточно спорный, так как обычно мы должны сообщать пользователю об ошибках.
Другие примеры
Производительность и анализ использования памяти
Если подходить абстрактно, то ваша версия STL может реализовывать опциональный тип данных как:
В кратце, std::optional просто оборачивает ваш тип, подготавливает место для него и добавляет один логический параметр. Это означает, что он увеличит размер вашего типа в соответствии с правилами выравнивания.
Есть один коментарий для этой конструкции: «Ни одна стандартная библиотека не сможет реализовать std::optional так (она должна использовать union из-за constexpr )». Поэтому код выше просто демонстрирует пример, а не реальную реализацию.
Правила выравнивания важны, как говорит стандарт:
Например, если у вас есть такой тип:
То он займёт больше места, чем если бы вы использовали свой тип вместо std::optional :
В первом случае размер структуры равен 32 байтам! Во втором случае всего лишь 24.
По ссылке великолепное объяснение насчёт производительности и использованию памяти, взятое из документации boost: вопросы производительности.
И в статье «Эффективные опциональные значения» автор рассуждает, как написать обёртку для опционального типа, которая может быть немного быстрее.
Интересно, есть ли шанс использовать хоть какую-то магию компилятора и повторно использовать некоторое пространство, чтобы поместить этот дополнительный флаг «инициализации объекта” внутри опционального типа. Тогда бы никакого дополнительного пространства не было бы необходимо.
Особенный случай: std::optional и std::optional
В то время как вы можете использовать std::optional для любого типа, которого захотите, вам надо проявить особое внимание при использовании опционального типа с логическим типом и указателями.
std::optional ob — о чём это говорит? С этой конструкцией вы имеете логический тип с тремя состояниями. Поэтому, если он вам и правда нужен, возможно лучше использовать настоящий троичный тип — std::tribool boost::tribool (правка: Antervis).
Более того, использование такого типа может сбивать с толку, потому что ob преобразуется в bool если в нём внутри есть значение и *ob возвращает хранимое значение (если оно доступно).
Похожая ситуация может проявиться с указателями:
Указатель на int на самом деле является nullable типом, поэтому оборачивание в опциональный тип только усложнит его использование.
Фух! Да, это было очень много текста про опциональный тип, но это не всё.
Тем не менее, мы рассмотрели основное использование, создание и оперирование эти удобным типом. Я считаю, что у нас есть много случаев, когда опциональный тип подходит намного лучше, чем использование некоторых предопределённых значений для представления nullable типов.
Я бы хотел напомнить следующие вещи про опциональный тип:
Значение слова «опционально»
опционально
1. спец. наречие к прилагательному опциональный; необязательно, по усмотрению клиента, на выбор клиента ◆ Следующие документы запрашиваются опционально, после согласования условий предоставления кредита
Делаем Карту слов лучше вместе
Привет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать Карту слов. Я отлично умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!
Спасибо! Я обязательно научусь отличать широко распространённые слова от узкоспециальных.
Насколько понятно значение слова каление (существительное):
Синонимы к слову «опционально»
Предложения со словом «опционально»
Понятия, связанные со словом «опционально»
Отправить комментарий
Предложения со словом «опционально»
Некоторые конструкции рассчитаны на участие человека наравне с автоматическими системами помощи водителю, другие предлагают участие человека опционально, у третьих вообще нет интерфейса для водителя.
Опционально можно поголодать, дабы помочь своему организму.
Пришлось срочно придумывать паллиатив в виде опционально поставляемой флешки.
Синонимы к слову «опционально»
Карта слов и выражений русского языка
Онлайн-тезаурус с возможностью поиска ассоциаций, синонимов, контекстных связей и примеров предложений к словам и выражениям русского языка.
Справочная информация по склонению имён существительных и прилагательных, спряжению глаголов, а также морфемному строению слов.
Сайт оснащён мощной системой поиска с поддержкой русской морфологии.
Документация
Опциональные типы
353 views 20.10.2014 admin_ 0
Опциональные типы используются в тех случаях, когда значение может отсутствовать. Опциональный тип подразумевает, что возможны два варианта: или значение есть, и его можно извлечь из опционала, либо его вообще нет.
Заметка
В C или Objective-C нет понятия опционалов. Ближайшее понятие в Objective-C это возможность вернуть nil из метода, который в противном случае вернул бы объект. В этом случае nil обозначает «отсутствие допустимого объекта». Тем не менее, это работает только для объектов, и не работает для структур, простых типов C, или значений перечисления. Для этих типов, методы Objective-C, как правило, возвращают специальное значение (например NSNotFound ), чтобы указать отсутствие значения. Этот подход предполагает, что разработчик, который вызвал метод, знает, что есть это специальное значение и что его нужно учитывать. Опционалы Swift позволяют указать отсутствие значения для абсолютно любого типа, без необходимости использования специальных констант.
В приведенном ниже примере используется метод Int() для попытки преобразовать String в Int :
Мы можем установить опциональную переменную в состояние отсутствия значения, путем присвоения ему специального значения nil
Заметка
nil не может быть использован с не опциональными константами и переменными. Если значение константы или переменной при определенных условиях в коде должно когда-нибудь отсутствовать, всегда объявляйте их как опциональное значение соответствующего типа.
Если объявить опциональную переменную без присвоения значения по умолчанию, то переменная автоматически установятся в nil для вас:
Заметка
nil в Swift не то же самое что nil в Objective-C. В Objective-C nil является указателем на несуществующий объект. В Swift nil не является указателем, а является отсутствием значения определенного типа. Устанавливаться в nil могут опционалы любого типа, а не только типы объектов.
Инструкция If и Принудительное извлечение
Если опционал имеет значение, он будет рассматриваться как «неравным» nil :
Более подробную информацию об инструкции if можно получить в главе Управление потоком.
Заметка
Привязка опционалов
Привязку опционалов для инструкции if можно писать как показано ниже:
Мы можем переписать пример possibleNumber сверху, используя привязку опционалов, а не принудительное извлечение:
Это может быть прочитано как:
«Если опциональный Int возвращаемый Int(possibleNumber) содержит значение, установи в новую константу с названием actualNumber значение, содержащееся в опционале»
Заметка
Неявно извлеченные опционалы
Иногда, сразу понятно из структуры программы, что опционал всегда будет иметь значение, после того как это значение впервые было установлено. В этих случаях, очень полезно избавиться от проверки и извлечения значения опционала каждый раз при обращении к нему, потому что можно с уверенностью утверждать, что он постоянно имеет значение.
Эти виды опционалов называются неявно извлеченные опционалы. Их можно писать, используя восклицательный знак ( String! ), вместо вопросительного знака ( String? ), после типа, который вы хотите сделать опциональным.
Неявно извлеченные опционалы полезны, когда известно, что значение опционала существует непосредственно после первого объявления опционала, и точно будет существовать после этого. Неявно извлечённые опционалы в основном используются во время инициализации класса, как описано в разделе «Бесхозные ссылки и неявно извлеченные опциональные свойства«.
Честно говоря, неявно извлеченные опционалы — это нормальные опционалы, но они могут быть использованы как не опциональные значения, без необходимости в извлечении опционального значения каждый раз при доступе. Следующий пример показывает разницу в поведении между опциональной строкой и неявно извлеченной опциональной строкой при доступе к их внутреннему значению как к явной строке:
Можно представлять неявно извлеченный опционал как передачу прав опционалу для автоматического извлечения всякий раз, когда он используется. Вместо размещения восклицательного знака после имени опционала каждый раз, когда вы его используете, ставьте восклицательный знак после типа опционала вовремя его объявления.
Заметка
Если вы попытаетесь получить доступ к неявно извлеченному опционалу когда он не содержит значения — вы получите runtime ошибку. Результат будет абсолютно тот же, если бы вы разместили восклицательный знак после нормального опционала, который не содержит значения.
Вы по прежнему можете обращаться к неявно извлеченному опционалу как к нормальному опционалу, чтобы проверить, содержит ли он значение:
Вы также можете использовать неявно извлеченный опционал с привязкой опционалов, чтобы проверить и извлечь его значение в одном выражении:
Заметка
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.