Чи не "if (0 == value) ..." приносить більше шкоди, ніж користі? [зачинено]


49

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

У всякому разі, ось мої аргументи проти цього:

  • Це порушує природний потік читання програмного коду. Ми, люди, кажемо «якщо значення дорівнює нулю», а не «якщо нуль - це значення».
  • Сучасні компілятори попереджають вас, коли у вас є завдання у вашому стані чи фактично, якщо ваш стан складається саме з того завдання, яке, так, виглядає так само підозріло
  • Ви не повинні забувати ставити подвійний '=', коли ви порівнюєте значення, якщо ви програміст. Ви можете також забути поставити "!" при тестуванні нерівності.

17
Я теж не надто переймаюся цим, але це досить далеко за моїм особистим списком домашніх вихованців.
Адам Кросленд

7
І програмісти іноді пропускають подвійний '='. Це легко зробити помилку і помилку, яку дуже легко не помітити.
sange

8
Як це не конструктивне чи не справжнє запитання?
TheLQ

7
Це закрито, ось ось моя коротка думка: як люди можуть запам’ятати писати, 0 == valueале не пам'ятати писати ==?? Я маю на увазі блискучий, якщо ви думаєте про це, чому б не написати це правильно для початку.
д-р Ганнібал Лектер

3
@muntoo: За словами укладачів, багато речей є "правильними", я не думаю, що це дуже хороший орієнтир.
д-р Ганнібал Лектер

Відповіді:


59

А, так, "Yoda conditionals" ("Якщо нульове значення є, виконайте цей код!"). Я завжди вказую на тих, хто стверджує, що вони "кращі" в таких інструментах, як ворсинка (1). Ця проблема вирішується з кінця 70-х років. Більшість сучасних мов навіть не компілюють такий вираз if(x = 10), як вони відмовляються примушувати результат присвоєння булеві.

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


32
+1 для "Yoda conditionals". Я насправді LOL'd в цьому. :)
Bobby Tables

3
У той час як впорядкування в порядку, я заперечую порівнянні з нулем замість звичайної булевої гіпсі, if(!value).
СФ.

1
Отже, ви вважаєте призначення всередині умовною помилкою?

4
"Більшість сучасних мов навіть не збирають це" Проблема виникає, коли ви використовуєте мову, яка мовчки примушує результат присвоєння булевому. Найпопулярнішою мовою, яку я можу придумати, є це JavaScript. Ось чому я завжди використовую joda conditionals навіть на Java, так що я не забуваю це робити, коли пишу JavaScript. Я перемикаюся між двома досить часто, щоб це могло (і було) проблемою.
Сем Хаслер

3
Хтось знає про компілятор, який не буде компілювати if (0 == x)?
Крістофер Івз

56

Це неприємно, бо накладає невеликий, але помітний ментальний податок.

Люди читають зліва направо практично на всіх мовах програмування (і на більшості природних мов).

Якщо я бачу 123 == x, я подумки розбираю це:

  • 123- і що? неповна інформація.
  • == - ну, 123 - 123, навіщо тестувати ...
  • x- гаразд, так це нас хвилює. Тільки зараз у мене є контекст.
  • Поверніться до розгляду 123і чому х порівнюється з ним.

Коли я бачу x == 123ментальний розбір:

  • x- Надає контекст, я знаю, про яку умову йдеться. Я можу вирішити ігнорувати решту. Виходячи з попереднього потоку, я добре розумію, чому і що має бути (і здивуюся, якщо це інакше).
  • == - Я так думав.
  • 123 - Так.

Зрив невеликий (на простому прикладі), але я завжди це помічаю.

Поставити значення спочатку може бути хорошою ідеєю, якщо ви хочете звернути на нього увагу, наприклад if (LAUNCH_NUKES == cmd). Зазвичай це не є наміром.


5
Саме так. У природних мовах константа завжди триває з тієї ж причини: якщо світло червоне ...
mojuba

2
@mojuba Щоправда, це майже універсально. Як не дивно, є кілька природних мов, де об'єкт стоїть перед суб'єктом (порядок OVS / OSV), але всі вони незрозумілі.
dbkk

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

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

47

Шкідливий? Ні. Це працює в будь-якому випадку.

Погана практика? Дискусійний, у кращому випадку. Це просте оборонне програмування.

Варто втратити сон? Ні.


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

17

Це в основному флеймбайт.

Ні, це не приносить більше шкоди, ніж користі. Простий.

Більше слів?

Аргумент компілятора? Е-е-е, можливо, - не вкладайте занадто багато віри в компілятор, щоб врятувати вас від себе.

«Ви не повинні забувати» - добре Дух - ні, звичайно , ви не повинні тим , що я втомився, я кодування весь день я повинен був використовувати дві різні мови , а іноді, просто іноді, будучи людини я роблю помилка.

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

Важко читати? Ви скаржитеся, що гідний програміст повинен мати == провідний провід (що робить усілякі погані припущення), але той самий гідний програміст не може прочитати значення 0 == ??

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


6
Я думаю, що значення 0 == читається неприродно для тих, хто вивчав алгебру до того, як вивчав програмування.
mojuba

4
Це не суть справи - так, ви маєте рацію, це не правильно читати, але однаково багато чого з того, що ми, як програмісти, пишемо, не є складною як природна мова, і справа в тому, як ви інтерпретуєте те, що ви бачите
Мерф

4
Браво .. Не кажучи вже про те, що через те, що він читає неприродно, ти схильний звернути на це пильну увагу, отже, вловлюєш потенційні помилки.
mocj

7
@mocj - Отже, нам слід кодувати максимально чітко, щоб люди, які читають наш код, дійсно читали наш код?
Kaz Dragon

6
@mocj - Я ціную це, але ваш аргумент полягав у тому, що "заїкання мозку", коли ви читаєте умовно Йоду, - це добре. Я задаю питання, що якщо це так, чи слід ми прагнути написати весь код, щоб ми викликали «заїкання мозку»? Справжнє запитання.
Kaz Dragon

11

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


10

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


5
Це не суть питання, справа в тому, "чи шкідлива вона" - і це не так. Дуже незначне роздратування в гіршому випадку, але не шкідливо.
Мерф

1
У динамічних мовах - абсолютно ви можете помилково
вписати

3
з усією повагою, коли ви провели пізню ніч (або дві) і знайдете джерело (у коді C ++) a = замість ==, це матиме певну вагу.
DevSolo

2
@DevSolo: Я думаю, що це справді повинно відбутися раз або два у вашій кар’єрі, але не більше того
mojuba

9

Деякі люди використовують це, щоб зрозуміти, що саме робить умовний. Наприклад:

Спосіб 1:

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

Спосіб 2:

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

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

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

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


4
Другий приклад змусив мене піти "так?" Перший набагато легше читається. Чудовий приклад. :)
Mateen Ulhaq

6

Для мене це просте кондиціонування. Як хтось, хто навчився (у 90-х) C та C ++, я звик до нього і досі ним користуюсь, хоча причини є меншими.

Після того, як ви "умовні" подивитися на ліву сторону на "постійну", це стає другою природою.

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

Я повністю згоден з / у відповідь Вонко.


5

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

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

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

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


2
Я думаю, що ключове слово тут - "інші способи зробити це";)
mojuba

в цьому випадку так, але в деяких випадках це все-таки найбільш читабельний результат. Моя єдина думка - є деякі законні причини для цього, крім боротьби з мовою чи поведінкою ідеї та типу "о"
Білл

Якщо чесно, у мене є труднощі з умовами Yoda для <= і> =. Знак == - інша справа, тому що в голові я можу просто перемикати символи навколо, але у вашому випадку мені потрібно пам’ятати, що кількість () має бути більшою або дорівнює 2, і це досить прикро для отримання знак меншої або рівності.
Алекс

3

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

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

Тому я б сказав:

if ( 0 <= value )

Але я також сказав:

if ( value <= 100 )

Рівність Я, як правило, перевірятиму зі змінною зліва, хоча вона просто читабельніша.


1
Я звик користуватися if(y > x)весь час. Якщо тільки yне константа.
Mateen Ulhaq

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