Зробити велику справу з == true?


105

Є мій колега, який постійно пише:

if (someBool == true)

Це підводить мене до стіни! Потрібно чимось зробити це чи просто відкинути його?


12
Я віддаю перевагу явне , if (some_flag == true)але приховане if (is_something)або if (has_something). Зверніть увагу на назви змінних.
fredoverflow

69
Нагадуйте своєму колезі, що тип someBool == trueтакож бульний, тому за тією ж логікою він повинен бути if ((someBool == true) == true).
Майк Сеймур

2
@GSto: Я думаю, ви це знаєте, але в PHP ви можете це зробити, щоб "кинути" що-небудь на bool і може бути корисним.
zneak

2
@zneak Або ви можете бути більш зрозумілими та використати $var = (bool) some_expression. І в більшості випадків це навіть не має значення, оскільки PHP здійснюватиме необхідні перетворення динамічно.
waiwai933

4
завжди перевіряйте константу спочатку, якщо (правда == деякийБул), якщо ви випадково набрали = замість == [так, я жартую!]
Стівен А. Лоу,

Відповіді:


126

Це лише зайвий код, а не життя чи смерть. Однак….

Якщо це відбувається багато, це може бути проблемою з тим, як someBoolйого називають. Добре ім'я може пройти довгий шлях до усунення потреби в цьому==true

if(IsSomeCondition)

або

if(hasCondition)

або

if(somethingExists)

наприклад.


Це дзвінки для мене найбільш вірні. Все про чіткість та мистецтво називання, оригінальний синтаксис не так вже й поганий, але це правильний шлях до кращого коду.
TJB

2
Бий мене до цього! Без відповідного іменування більш лаконічна еквівалентність взагалі не має сенсу.
Полювання на Трою

4
Мені довелося someBool == trueкілька разів використовувати для застарілого коду для наочності. Але якщо я пишу з нуля, я відповідно називаю цю змінну та використовуюif (isSomething)
nimcap

Я погоджуюсь, хоч іменування вирішило б це, якщо припустити, що ім'я SomeBool, це може означати що завгодно і бути будь-якого типу (ціле число, рівне кількості булевих масивів у масиві, можливо?). Булеві потрібні якісь екзистенційні дієслова, інакше їх завжди буде важко прочитати самостійно.
Морган Херлокер

Я згоден, мова йде про читабельність. Якщо змінні названі добре, вам це не потрібно. Якщо вираз читається краще з ним, я б пішов на "== true", також він відповідає, якщо ви використовуєте "== false" замість (некрасивого) "if (! ())".
Ронні Брендель

71

Коли я бачу someBool == true, я не можу не відчути, як програміст не втілив ідею оцінки , що є досить фундаментальним недоліком.

Однак моя думка перекошена, тому що я проводив кілька літ у коледжі, навчаючи програмуванню дітям, які часто писали такі вирази, тому що вони справді не освоїли розумову вправу оцінювати вираз. Після того, як вони ринули концепцію, надмірність стала очевидною.

Для грамотного професійного програміста це, мабуть, не так. Це, мабуть, лише шкідлива звичка, яку вони розвинули в перші дні програмування і ніколи не похитнулися. Але це все одно мене трохи налякало б, якби це було першим, що я бачив когось робити в інтерв'ю.


Я б не так швидко завадив це за звичку. Я чула деякі справді приголомшливі речі з вуст професійних програмістів. Зазвичай невдовзі після цього хтось із кракерів пішов, "як це колись працювало?"
Даш-Том-Банг

12
Від усієї думки погоджуйтеся про оцінку. Я часто замислювався: "Де це зупиняється?" якщо ((((х == вірно) == TRUE) == TRUE) = брехня!) // і так далі ...
yawmark

1
Іноді я б писав if (c == true) return true; else return false;, але 99% часу (1% є, оскільки я ніколи не можу бути впевненим, що я не пропустив) я негайно помічу і заміню все це return c. Я очікую, що більшість грамотних програмістів повинні зробити щось подібне, якби на початку кар’єри вони виробили звичку. Чого я не очікував - це відповідь wtf.
Лі Лі Райан

1
О, хлопче, мистецтво мислення. Я буквально натрапив на це в нашій кодовій базі минулого тижня. if (!someCondition) { someCondition = false; }Я бачив деякі (е, багато) надмірності, а також деякі неможливості в нашому коді, але цей був настільки простий, але настільки обтяжуючий, що думати, що хтось насправді його написав. Кілька разів, навіть.
Ентоні Пеграм

1
Зауважте лише, що я бачив кілька випадків, if(x) x=true;які НЕ були зайвими, а скоріше еквівалентними x=!!x;(нормалізуючи х до 0/1)
jkerian

58

Це і мене зводить з розуму, але я б сказав, що згадайте надмірність їм конструктивно, а потім відмовитись, навіть якщо вони не згідні.

Як варіант, ви можете спробувати такий підхід:
Ви: Чи можете ви почати використовувати наступну конвенцію коду для оцінки булевих?

if (someBool==true)&&(true==true) {}

Їх: Чому ми це зробимо? Друга половина цього твердження є зайвою, вона завжди оцінюватиметься правдою.

Ви: Джордж, ви праві. Дурний мене. Давайте просто підемо з версією без всякої надмірності тоді. Як щодо?

if (someBool) {}

6
Так, погодився. Це нерозумно, але ти повинен вибирати свої бійки, і цей код справді робить те, що буде робити твій колега. Згадайте це у не-"Що, чорт з вами, НЕ БУДЕ ?!" якийсь спосіб, то киньте його. Хоча якщо вони почнуть тягнути лайно типу "if (someBool! = True)" або "if (! SomeBool == true)" або інші подібні згортки, це може бути бій, який варто вибирати ....
BlairHippo

3
Як (someBool == false) гірше, ніж якщо (someBool == true)?
FinnNk

5
true=trueНЕ компілюється, ви не можете призначити до true;-)
fredoverflow

1
Я звик до if(somebool == false)або !=, але завжди проти помилкової і не відповідає дійсності. Я вважаю це зайвим, але оскільки стандарт кодування наполягає, що це if()виглядає як функція викликає пробіл між паренами, допомагає мені її прочитати. Сам по собі бул - це бул, але if (somePointer)не летить; Я вважаю за краще, if (somePointer != NULL)оскільки вказівник - не бул.
Даш-Том-Банг

5
Йдеться про читабельність, а не нелогічність чи (мікро) зменшення кількості
Ronny

45

Я думаю, що якщо щось настільки тривіальне - це ваша найбільша проблема з колегами, ви повинні вважати себе везунчиком.


5
Добре кажучи, корисно прагнути до досконалості, але, безумовно, є більше риби для смаження
TJB

3
Я думаю, ви говорите це про кожну проблему, яка заслуговує на обговорення.
Дейв Ван ден Ейнде

2
Це потенційно вказує на набагато більші проблеми. Невелика коричнева пляма на стелі у вашому гаражі може здатися не великою справою, але це може означати, що у вас є великий протікання води.
Джош

42

Ви обов'язково повинні припинити цю шкідливу звичку. Акуратно ...

Не забути написати подвійні знаки рівності, перетворивши код на:

if (someBool = true)

Наприклад, у C # це створюватиме лише попередження, а не помилку. Тож якщо ви не ставитесь до попереджень як помилок, код буде працювати, встановіть змінну на істинне та завжди введіть умову.


6
Це не релевантний аргумент. Якщо ви працюєте такою мовою, ви можете просто перенести правду на іншу сторону. Питання полягає в тому, чи взагалі включати правду.
Кам

8
@Cam: Ви пропустите точку. Зворотній логікою я не пропоную.
Гуффа

15
@Cam - Він дає реальний приклад, коли це може бути проблемою. Я б сказав, що це досить актуально.
ChaosPandion

1
@Guffa Cam дуже прав. Це не привід припиняти використання == (anyType) у блоках if.
Ронні Брендель

2
@Ronny: Ні, це не може статися з будь-яким типом (якщо мова насправді не допускає будь-який тип як умову). Заява if (answer = 42) {}просто не компілюється, тому що вираз не бул.
Гуффа

21

Я згоден з вами, але я збираюся тут зіграти захисника диявола:


Залежно від мови та назви змінної, x == true доречно:

Розглянемо наступну ситуацію в мові зі статичним набором тексту та примусовим типом для інтегральних типів:

if (actionsAllowed){
    //do actions, since they are allowed
    //...
}

Хтось, читаючи цей розділ коду, може не зрозуміти відразу, що ActionsAllowed - булева змінна - це також може бути ціле число, що представляє кількість дозволених дій. Отже, додаючи == true, стає зрозуміло, що x є булевим, а не цілим числом, примушеним до булевого:

if (actionsAllowed == true){
    //do actions, since they are allowed
    //...
}

13
читабельність == GoodThing
Muad'Dib

5
if ((читабельність == GoodThing) == true) ...
JoelFan

1
bool isGoodThing = читальність? true: (codingStandards? true: (internalizationOfConcept? true: false));
johnc

17
Тому перейменуйте змінну actionsAreAllowed.
Graeme Perrow

9
Написавши, if (x) { ...ви вже стверджуєте, що xбулева або конвертована в булева. Те, що ви називаєте, не має значення.
Даніель Ервікер

15

А як щодо нульових булів?

bool? MyFlag = null;

if (MyFlag == true)
    ;  

if (MyFlag)  // error, doesn't compile!
    ; 

якщо (MyFlag.Value)
johnc

1
Не у всіх мовах є нульові булі, і багато хто з тих, хто є, приймуть вашу другу конструкцію.
zneak

1
@johnc: "if (MyFlag.Value)" може насправді не робити те, що ви хочете, оскільки він може кинути виняток, якщо MyFlag є нульовим (що ви можете перевірити, перевіривши MyFlag.HasValue).
Людовик Шабант

4
Це мій домашній улюбленця з незмінними цибулями :)
Jarrod Dixon

3
бул? isValid = null; if (isValid ?? false);
Сколіма

11

Як правило, ви не хочете робити велику справу з умовами кодування, якщо зазначена конвенція якимось чином не перешкоджає проекту суттєвим чином. Я бачив, як багато гострих аргументів зростають через такі дрібні речі, як кодові регіони та провідні підкреслення.

Попри це, я не бачу проблем із додаванням == trueдо умовної заяви. Власне кажучи, я маю звичку використовувати == falseна відміну від провідного оклику при тестуванні на негативні умови. Я думаю, що це читабельніше.

Якщо існує конвенція, я кажу, дотримуйтесь її, якщо немає підстав для змін. Однак не варто насправді викликати велику смердію.


1
Залежно від вашої мови, деякаValue не обов'язково може бути еквівалентом істини, навіть якщо вона оцінюється як справжня. Наприклад, (9 == True)в Python оцінюється як false, і я б уявив собі подібне в C ++.
Даш-Том-Банг

регіони коду та провідні підкреслення змушують мене вдарити людей по обличчю.
MGOwen

11

Ак. Я той хлопець. Сором, ганьба. Це я дізнався, і як я "автоформатую" в голові. Єдиний раз, коли я використовую вподобаний синтаксис Джоеля, - коли змінна bool має префікс дієслова типу "є". Мені потрібне дієслово, будь то "є", "може", "зробив", інакше мені потрібно == надати дієслово "дорівнює". Я ніколи не можу порушити цю звичку, тому зрозумію, якщо ти не скажеш "привіт" мені на вулиці.


7
Це не погано. Код, який читається як справжній текст, набагато кращий, ніж неявний foo. Зберігайте цю звичку заради читабельності.
Ронні Брендель

11

нагадуйте про "булевий код божевілля", подібний до цих

if(someBool == true)
   otherBool = false;
else
   otherBool = true

Замість:

 otherBool = !someBool

Це смішно, мені довелося підтримувати систему, яка засмітила всюди. Це мене зводило з розуму.
Тіарт

8

Особисто мені категорично не подобається спосіб сказати "не" мовами, що базуються на С. Цей маленький знак оклику занадто легко не помітити.

Тому я виписую його повністю:

if (someCondition == false) {

Прочитавши це деякий час, я теж хочу симетрії

if (someCondition == true) {

Тому вважайте це артефактом С, який використовує !замість not.


3
C ++ на насправді має в notоператора, а так само C (як тільки ви включите стандартний заголовок <iso646.h>). Якщо ви не хочете (або не можете) використовувати цей заголовок (або , якщо ви застрягли з Java або C #), я пропоную покласти пробіл після знаку оклику: if (! condition). Це робить його дещо помітнішим.
Конрад Рудольф

1
Я роблю Java. notне є варіантом.

6

Це залежить від мови, але зазвичай це погана ідея ...

У С ніколи цього не робіть. Занадто просто знайти ситуацію, коли значення, яке ви тестуєте, не є хибним (не нульовим), але також не дорівнює єдиному значенню, визначеному як "справжнє".

У Ruby зробіть це лише в тому випадку, якщо ви абсолютно впевнені, що хочете зазнати невдач у всьому, крім булевої правди.

У C ++ та інших статичних мовах із типом bool це зайве і може призвести до помилок програмування при неправильному введенні =замість ==або помилок просування, як зазначено в коментарях.


Насправді, у мовах, де оператор присвоєння повертає значення ... на зразок C ++ ... if (b == true) {, не є просто зайвим. Це також трохи ризиковано, тому що ви можете випадково призначений trueна b.
Стівен C

4
Це не просто зайве в C ++, це небезпечно. Якщо ви пишете if (b == true), а bце не бул, конверсії типу йдуть неправильним шляхом. A bool- це інтегральний тип, який, як правило, перетворюється на відповідний інтегральний тип зі значенням 1. Якщо ви пишете, скажімо, int b(2); if (b == true)тоді trueдля intзначення порівняння стає значенням 1, а не bпримусовим у тип bool, який би дав правильний результат.
Девід Торнлі

@DavidThornley, увімкніть попередження у вашому компіляторі. Трактувати попередження як помилки - це краще техніка оборонного програмування, а не уникання ==.
Абікс

5

Ви думаєте, що це погано? Як щодо:

if(someCondition) {
  return true;
} else {
  return false;
}

2
Хлопчик, скільки разів я бачив це. Це робить хороший випадок для такого інструменту, як ReSharper.
Робота

Так - якщо ви наймаєте комори, то купуйте ReSharper.
Кірк Бродхерст

4

я віддаю перевагу

if (bVal)

або

if (!bVal)

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


4
Бо любов до всього, що є святим, доти, доки воно не є if (!bNotVal) чи if (bNotVal)навіть не в першу чергу. Тверді негативи в іменах робить все важче для читання.
Даш-Том-Банг

2
Я знав, що розробник, який закипить, - це не підключений; if (isNotConnected == true) ... yuck
johnc

4

ви повинні сказати йому, що він робить це неправильно.

його

if (true == someBool) {

}

якщо він коли-небудь забуде його = він у великому неприємності в своєму стилі написання.


3

Як щодо

if (x == "true")

ЧОМУ ТАКЕ СТРАН ?!


Я працюю над усталеним PHP-кодом правильно, а іноді знаходжу щось подібне if(preg_match('/title/', implode($_POST))){. PHP, досить сказано, мені потрібно знайти кращу роботу.
Кейо

4
Так, я також бачу, якщо (x == "1"), але зазвичай це стосується поганого дизайну db.
atfergs

Я використовував подібні конструкції, коли xнадходив із введення користувача (наприклад, файл конфігурації або веб-служба). Однак я зазвичай допускаю інші вірні значення, тому це закінчується більше якif x.lower().strip() in ["true", "yes", "on", "1"]
eswald


3

Я пишу такий код!

Ось чому:

"if bla == true" читається як речення, де як "if bla" - це не у багатьох випадках. Це просто звучить неправильно, коли читаєте фактичний код.

Крім того, компілятор попереджає про призначення в блоках if, тому дійсно немає небезпеки при використанні == true. (плутаючи це з =)

Також хлопці, які не пишуть "== true", використовують це "! ()" Для "== false"? Я вважаю це справді некрасивим. І якщо ви використовуєте "== false", то лише дуже послідовно використовувати "== true", а не два чіткі способи перевірки істинності.


3
Ви говорите, що "якщо bla" не читається як речення ... це означає, що ваша змінна названа неправильно ... що з цим не так: якщо (userHasRights) doSomething ()
JoelFan

"у багатьох випадках". Так, ти правий. Перейменування теж добре. З "if (QWidget :: acceptDrops () == true)" у вас немає можливості перейменувати. можливо, було б добре назвати це doesAcceptDrops () ... Це занадто багато клопоту (і неможливо бути послідовним, використовуючи це правило пропуску в будь-якому API), тому узгоджуючись з іншими "== що б" не було, Я настійно пропоную не пропускати це, щоб він не виглядав по-різному, таким чином виглядає послідовно.
Ронні Брендель

3

Пам'ятайте, що ви працюєте як частина команди, тому вам потрібно працювати разом. "Грає добре з іншими" все ще є важливою рисою особистості навіть після початкової школи :)


2

Як правило, пропустіть '== true', але навряд чи варто навіть хвилини обговорити це, якщо ви не включили його до стандартів кодування вашої команди.


3
Крім того, якщо це відповідає стандартам кодування команди, вам дійсно потрібно переоцінити стандарти, щоб позбутися подібних дрібниць.
JohnFx

Домовились! На
всякий

2

Хоча я згоден як розробник C #, я не можу сказати, що це завжди так. Наприклад, у Javascript, === виконає коалесценцію типу. Тож припустимо, що var x = 3 тоді:

if(x) --> true

поки

if (x === true) --> false

Я думаю, що це інакше, ніж ==, оскільки навіть у JS я б не використовував if (x == true), а просто щось над цим подумати.

Цей тип стосується ще однієї точки, хоч і з’явився в моєму кабінеті:

bool b = false;

В C #, bool b; було б достатньо і підштовхує b до хибного . Однак більш чітко писати вищезазначений рядок і все одно повинен бути вирваний компілятором під час оптимізації.

Тому я здогадуюсь, що це не завжди так очевидно, що є, і це не є хорошою практикою, і багато цього зводиться до уподобань, а також до мовних особливостей / вигадок.


bool b;лише ініціалізується на false, коли bє поле. Ви повинні явно ініціалізувати локальні змінні.
Метью Флашен

+1 погодився. Це те саме питання з іншими мовами (сценарії). Ви повинні бути чіткими, якщо хочете протестувати булеві trueабо просто "вірні". Наприклад, тобто будь-яка не порожня рядок розглядається, == trueале не === trueв деяких мовах.
Мартін Вікман

2

Ага так, але що робити, якщо змінна є нульовою? (бул?)

Деякі мови (C #) вимагатимуть і замінити, або порівняти з "true".

bool? isAccepted = true;

if((bool)isAccepted)
{...}

if(isAccepted == true)
{...}

2

Молоді знають правила, а старі знають винятки;)

Останнє C#, якщо ви маєте справу з компанією null-able bool, вам доведеться:

bool? x = null;
bool? y = true;
bool? z = false;
if (x == true || y == true || z == true) {
    // That was the only way that is reasonably readable that I know of
    // to accomplish this expression.
}

Якщо tristate не є проблемою, то зазвичай не повинно бути причин щось порівнювати з true/ True. Однак у Pythonта кількох інших мовах, таких як, C/C++ви можете виконувати ifвираз без bool. Ці мови мають унікальні правила інтерпретації цілих чисел, покажчиків, списків тощо як істинних або помилкових. Десь цього не хочеш. Наприклад, у цьому фрагменті Python:

x = True
y = 'abcdef'
z1 = x and y
z2 = (x == True) and (y == True)

Тут zмає бути True, але z2має бути False. Тепер Clojureмова підходить до цього ще одним способом - andфункція не обов'язково оцінюється як a bool, але ifвміє це впоратися.

Незалежно від мови, щоразу, коли ви виявите, що щось порівнюєте Trueабо False, це, мабуть, варто прокоментувати.


Перша проблема випливає з помилкової передумови IMO, використовуючи жахливі назви змінних. Нехай х, у, г були названі notExceptButHasX, exceptNotButIsntY, doNotUnlessIsExceptZ? Як це спричиняє читабельність вашої проблеми? Якщо x, y, z були названі чимось на кшталт "isEnabled", "isEffective", "hasProperty", то ваше висловлювання стає isEnabled || isEffective || hasPropertyнабагато більш читабельним, ніж порівняння з trueабо false.
Томас

1

Таке кодування раніше теж потерло б мене неправильно. Хоча ваш ідентифікатор прикладу названий "someBool", використання цього стилю кодування ненавмисно для змінної, яка не була гарантована булевим, може мати ненавмисну ​​поведінку. Якщо значення "someBool" не є точно "true" або "false", результат буде хибним.

У минулому році я зіткнувся з дуже тонкою помилкою, спричиненою таким стилем кодування, який було важко визначити, бо хтось заглядає за такі конструкції. Ви б подумали: "Як це може бути неправильно?" Це ж стосується і таких добре зрозумілих виразів, як "(var)" або "(! Var)", які ви читаєте або кодуєте їх, не перевіряючи їх поведінку.

Тож я ввів пару стандартів кодування, щоб зменшити існування таких помилок у базі даних кодексу та ймовірність того, що такі тонкі помилки випадково повзуть колись у майбутньому.

  1. Усі вирази повинні бути скоплені в дужках відповідно до їх намірів.
  2. Усі булеві тести повинні бути виражені у негативному вигляді, наприклад "suchBool! = False".

Очистивши код, який не відповідає новому стилю, я виявив і виправив ще кілька випадків таких тонких помилок.


1
Наявність у деякихBool здатних бути чимось іншим, ніж ПРАВИЛЬНА / ЛАЖНА - це погана практика кодування.
AttackingHobo

@AttackingHobo, це одна з підводних помилок відсутності булевих типів на мові та / або не використання класу для надання точної потрібної поведінки.
Huperniketes

1

Довелося використовувати це весь час у ActionScript 2 (правда, тепер це мертва мова), оскільки:

var something:Boolean = org.black.box.unknown.ThisMightNotExistYet();

// this is slightly ambiguous
if(something)
{
}

// because if you allow undefined you might actually mean
if(false != something)
{
}

// which can mean something different than
if(true == something)
{
}

// and comparing against what you actually MEAN is less script than
if(undefined != value && value)
{
}

Тому майже завжди було краще бути конкретним.


1

Я згоден. Це надмірна конструкція, спеціально для сильно набраних мов.

Щоб додати ще одне неправильне використання булевих, я виявив подібну конструкцію ще багато разів у Javascript (особливо у деяких монстр-функціях монстра, як у 100+ рядках):

//create the variable, not initializing it
var flag;
//...
//assing a value to the var, by the example 
flag=$("mycheckbox").selected;
//...

//and at the moment of use it:
if(flag!=true) {
   //code to execute when the checkbox is unchecked
}

Здається, що через відсутність суворого визначення типу цієї мови, деякі програмісти вважають за краще не возитися зі false|undefinedзначеннями.


1

У мене є колега, який матиме такий код:

if(something == true)

А потім, для якогось тесту / налагодження, він захоче не викликати цей блок, щоб він змінив його на:

if(something == true && false)

А потім періодично він змінить його на:

if(false)

Найгірше те, що цей тип налагодження відмовився від мене при нагоді і справді погано читати інших розробників!


0

Я б сказав, що послідовність є королем у базі даних коду. Тож вам слід використовувати стиль, який в основному використовується у вашій організації. Спробуйте зробити свій бажаний стиль частиною офіційних інструкцій щодо кодування компанії. Якщо це вже є в інструкціях, просто дотримуйтесь його.

(Це, як було сказано, теж мене би дуже роздратувало - але, мабуть, недостатньо, щоб зробити з нього велику справу).


0

Я вважаю за краще не ставити зайвий == true, але іноді випадково включаю його і не помічаю. Людина, можливо, не помітила їх і випадково розмістила. Я читаю свій код і іноді помічаю, що я розмістив додатковий == true, щоб видалити це == true. Я іноді цього не помічаю і радо вітаю когось, хто скаже мені, що я розмістив це зайве.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.