Иногда у меня есть функция, которая должна возвращать true или false. Но иногда три возможных значения имеют больше смысла.
В некоторых языках тезисы будут обрабатываться с целыми числами или с исключениями.
Например, вы хотите указать возраст пользователя, если ему больше 18 лет. И у вас есть такая функция.
if(user.isAdult(country_code)){
//Go On
}else{
// Block access or do nothing
}
Но в некоторых случаях, в зависимости от того, как построено ваше приложение, я мог видеть случай, когда поле дня рождения является неполным. Тогда эта функция должна вернуть что-то неопределенное.
switch(user.isAdult()){
case true:
// go on
break;
case undetermined:
//Inform user birthday is incomplete
case false:
//Block access
}
Как я уже сказал, мы можем справиться с этим с помощью Exceptions и Int, но я считаю, что было бы довольно сексуально встраивать в язык истинные, ложные, неопределенные значения вместо использования некоторых определенных пользователем констант.
Ответы:
Это может быть обработано с помощью перечислений, целых чисел, символов (например, Lisp, Ruby), обнуляемых типов (используйте null в качестве неопределенного состояния), типов опций (например, ML) или некоторой аналогичной конструкции - в зависимости от вашего языка.
Так что, хотя ваш пример и обоснование верны, я не вижу его в списке приоритетов языковых функций для разработки.
источник
null
. В C / C ++ вы можете вернуть enum.Я не видел случая, когда это необходимо. В приведенном вами примере, если это поле необходимо, оно должно быть проверено в другом месте.
isAdult()
по своей сути метод двух состояний: вы либо есть, либо нет. Нет необходимости заставлять его делать что-либо, кроме как возвращать false, если он сталкивается с данными, которые он не может обработать. Например:источник
.isAdult()
запросить самого пользователя, если это действительно то, что вы хотите, и это будет работать лучше.правда, ложь, неизвестно
да нет наверное
в C # вы можете использовать обнуляемый bool (теперь вы можете отшатнуться в ужасе)
в MS-SQL вы можете использовать пустое битовое поле (то же самое)
источник
unknown
.В C ++ это может быть обработано с
bool
невозвратным типом или с помощью исключения. Если вы хотите получить трехзначный тип возврата, используйтеenum
. Это не так сексуально, но работает, и, что более важно, вы можете сделать это, не испортив язык для всех нас.Имея
bool
три многозначных бы вызвать проблемы. Как вы справляетесьbool foo; ... if (foo)...
, предполагая, чтоfoo
может иметь любое из трех значений? Есть преимущества в том, чтобы иметьbool
переменные, которые точно являются одним изfoo
и!foo
всегда верны. Это помогает рассуждать о программах.Проверьте, что люди делают в числовой обработке, когда они могут получить
NaN
значения. Это сложно. Я бы предпочел не проходить через это для обычной логической обработки.Если вы хотите ,
.isAdult()
чтобы справиться с недостаточной информацией, имеют это сделать внутренне, а затем возвращать либоtrue
илиfalse
. В противном случае, каждый раз, когда вы используете его, вам нужно проверить код возврата, прежде чем делать что-либо еще, и придумать способ справиться с этим. Это означало бы, что вам нужно было проверить документы, чтобы увидеть, действительно ли функция выполняет то, что, как было сказано в ее названии, и это станет катастрофой для удобства чтения.источник
Идея довольно полезная. Существует целая область, посвященная борьбе с неопределенностью, которая называется Fuzzy Logic .
К счастью для нас, программистов, вы можете реализовать нечеткую логику с помощью стандартных языковых функций.
Например, в случае, который вы предоставили, неопределенная информация легко определяется с помощью запроса пользователя. Таким образом, перечисление трех состояний, как вы описываете, будет работать нормально.
Есть много других способов быть неуверенными. К таким вопросам относятся:
Многие из этих вопросов могут быть решены с использованием вероятностей в диапазоне от 0,0 (ложь) до 1,0 (истина) и применением математики с плавающей запятой.
Химик-компьютерщик и ученый по имени Дэвид Э. Шоу применил подобные вещи к Уолл-стрит и теперь стоит около 2,5 миллиардов долларов. Так что да, это полезно. :-)
источник
Много лет назад я поиграл с некоторыми алгоритмами, которые выходили для присвоения убеждений ценностям. Было довольно весело. В конечном счете, я извлек из этого то, что логическое выражение часто является надуманным. На самом деле это должно быть значение trilean true / false / other. В экспериментах это, казалось, привело к «лучшему» коду для меня в то время. С тех пор я сдался и делаю то, что делают все остальные, думая внутренне, насколько проще было бы, если бы мы прекратили делать то же самое по-старому ... :-)
источник
Тем не менее, операторы Case или Switch прекрасно подойдут для этого, если использовать целые числа для произвольной работы с переключателем.
Кроме того, в Ruby, хотя 'nil' возвращает значение false при некоторых обстоятельствах, если вы используете оператор равенства,
nil == false
возвращаетсяfalse
, так что вы можете использовать rubynil
для обработки троичной логики.источник
Другой вариант в вашем случае может заключаться в том, чтобы инвертировать элемент управления, применив принцип «не спрашивать», и изменить его на (извините за слово «взрослость», «блокировка мозга»)
где
OnlyAllowAdultsToLoginStrategy
реализует интерфейс:источник
void userIsAdult()
? Возможно, вы имели в видуbool userIsAdult()
?Мой сын спрашивал меня, как эффективно выполнять тесты, которые похожи на это. Проверяемые флаги были только истина / ложь, но у спичечных клавиш было три состояния (должно быть верно, должно быть ложно, или мне все равно). Конечно, это может быть реализовано с 2-битной структурой данных и небольшим изменением, но код такого рода действительно нуждается в комментариях, так как цель просто не различить, глядя на код.
источник
В C эта функция реализована в большинстве функций библиотеки. Например, strcmp сравнивает 2 строки и возвращает 0, если они одинаковы, 1 (т.е. любое положительное целое число), если 1-е «больше», чем 2-е, и -1 (т.е. любое отрицательное целое число), если второе больше первого ,
Тот же самый подход может использоваться в другом месте, + / 0 / - как ваше три-состояние. Это также позволяет вам выполнять логическую логику для значений, если вы знаете 0, если false, а любое другое значение - true.
источник
Для C ++ Boost фактически реализует Tribool, описанный так:
источник
Флажок VB6 имеет эту возможность. Значения флажка могут быть 0 = выключен, 1 = включен, 2 = серый
источник