Когда логические значения лучше, чем целые числа? - PullRequest
6 голосов
/ 24 декабря 2010

В большинстве языков программирования вместо True и False можно использовать 1 и 0. Однако, по моему опыту, целые числа, кажется, всегда проще в использовании.

Вот несколько примеров того, что я имею в виду:

if x is True: x = False
else: x = True

против

x = abs(x-1)

__

if x is False: a = 0
else: a = 5

против

a = 5*x

В каких случаях логические значения проще / эффективнее использовать, чем 1 или 0?

Ответы [ 9 ]

11 голосов
/ 25 декабря 2010

Вы всегда должны использовать любой встроенный логический тип для логических значений в языках высокого уровня. Ваш второй пример был бы ужасом для отладки в случае, если x истинно, но равно значению, отличному от 1, и хитрым, чтобы выяснить для любого разработчика, новичка в коде - особенно тот, кто не знаком с вашим кодированием стиль. Что не так с

x = !x;

или

a = x ? 5 : 0;
7 голосов
/ 24 декабря 2010

Один пример, где целое число может быть более эффективным, чем логическое значение, может быть в реляционной базе данных.Битовый столбец, как правило, не может быть проиндексирован (я не могу говорить для всех баз данных в этом выражении, следовательно, «в общем случае»), поэтому что-то вроде tinyint имело бы больше смысла, если требуется индексация.

СохранитьИмейте в виду, что, в зависимости от использования и от системы, использующей его, в то время как логическое «занимает меньше места», потому что это всего один бит (в зависимости от реализации), целое число - это собственный размер слова аппаратного обеспечения.(Некоторые системы, вероятно, используют полное слово для логического значения, по существу, не экономя место при его запуске на металле, просто для использования простого размера слова.)

В языках программирования высокого уровня выбор междуboolean и int действительно больше читаемости / поддержки кода, чем эффективности.Если значения действительно ограничены значением «истина» или «ложь», то логическое значение имеет смысл.(Находится ли данная модель в заданном состоянии, например, «действителен», или нет? Третий вариант никогда не будет.) Если, с другой стороны, в настоящее время есть два варианта, но может может быть, когда-нибудь, может быть заманчиво использовать логическое значение (даже просто «пока»), но логически логичнее было бы использовать int (или enum).

Имейте это в виду и при выполнении«умные» вещи в коде.Конечно, может показаться более изящным и более клевым, если вы хотите использовать небольшую математическую интуицию вместо использования логического значения, но как это влияет на удобочитаемость кода?Быть слишком умным может быть опасно.

6 голосов
/ 25 декабря 2010

Для читабельности и благих намерений всегда лучше выбирать логические значения для true / false.

Вы знаете, что у вас есть только два возможных варианта. С целыми числами все может стать немного сложнее, особенно если вы используете 0 как false и что-нибудь еще как true.

Вы можете стать слишком умным при использовании целых чисел для true / false, поэтому будьте осторожны.

Использование логических выражений прояснит ваши намерения через 6 месяцев и других людей, которые будут поддерживать ваш код. Чем меньше мозговых циклов вы должны использовать, тем лучше.

4 голосов
/ 24 декабря 2010

Я бы сказал в ваших примерах, что булевы версии более читабельны (по крайней мере, насколько ваши намерения). Все зависит от контекста тоже. Если вы жертвуете удобочитаемостью, пытаясь сделать микрооптимизацию, это просто зло.

1 голос
/ 25 декабря 2010

Я не уверен в эффективности, но во многих случаях я предпочитаю логические значения.

Ваш первый пример может быть легко написан как x = !x, а x = abs(x-1) выглядит для меня очень неясным.* Также при использовании целых чисел вы не можете быть уверены, что х равен 1, а не 2 или -5 или что-то еще.При использовании логических значений, это всегда просто true или false.

0 голосов
/ 30 декабря 2010

Мне нравятся логические значения, они гораздо более читабельны, и вы в основном заключили договор с пользователем.

Например, "Эти значения ТОЛЬКО ИСТИНА или ЛОЖЬ".

0 голосов
/ 28 декабря 2010

Помимо показателей производительности, я считаю булевы и целые числа двумя принципиально разными понятиями в программировании. Boolean представляет условие, целое число представляет число. Ошибки легко вводить, если вы не сохраняете строго значение вашего целочисленного логического 0 или не 0, и зачем беспокоиться даже об этом, когда вы можете просто использовать логические значения, которые позволяют выполнять проверку безопасности / проверки типов во время компиляции? Я имею в виду, возьми метод:

doSomething(int param)

Один только метод не подразумевает / не подразумевает, что параметр интерпретируется как логическое значение. Никто не помешает мне передать ему 1337, и никто не скажет мне, что произойдет, если я это сделаю - и даже если четко задокументировано, что метод 1337 не передается методу (но только 0 или 1), я все еще могу Это. Если вы можете предотвратить ошибки во время компиляции, вы должны.

doSomething (параметр bool)

допускает только два значения: true и false, и ни одно из них не является неправильным.

Кроме того, ваши примеры того, почему целые числа были бы лучше, чем логические значения, немного ошибочны.

if x is True: x = False
else: x = True

можно записать как

x != x

тогда как ваша целочисленная альтернатива:

x = abs(x-1)

потребовал бы, чтобы я знал:

  • Какие возможные значения x могут иметь
  • что делает функция abs ()
  • почему 1 вычитается из x
  • что это на самом деле / ​​делает /. Что это делает?

Ваш второй пример также очень важен для меня.

if x is False: a = 0
else: a = 5

можно записать как:

а = (х)? 5: 0;

тогда как ваша целочисленная альтернатива

a = 5*x

снова требует, чтобы я знал:

  • Что такое Х?
  • Что может быть Х?
  • Что будет, если х = 10? -1? 2147483647

Слишком много условностей. Используйте логические значения для удобочитаемости, здравого смысла и предсказуемого кода без ошибок.

0 голосов
/ 24 декабря 2010

Очевидно, что логические значения могут принимать только true / false или 0/1, и не только потому, что они используют меньше вычислительной мощности и памяти, как уже было сказано в Webnet.

0 голосов
/ 24 декабря 2010

Всегда более эффективно использовать Boolean, потому что его проще обрабатывать и использовать меньше обработки / памяти. По возможности используйте Boolean

...