it-swarm-eu.dev

Nerobí „pokud (0 == hodnota) ...“ více škody než užitku?

To je jedna z věcí, které nejvíc nenávidím, když to vidím v kódu někoho jiného. Vím, co to znamená a proč to někteří lidé dělají tímto způsobem („co kdybych místo toho omylem dal '='?“). Pro mě je to velmi podobné, jako když dítě jde dolů po schodech a počítá kroky nahlas.

Každopádně zde jsou mé argumenty proti:

  • Naruší přirozený tok čtení programového kódu. My, lidé, říkáme „pokud je hodnota nula“ a ne „pokud je nula hodnotou“.
  • Moderní kompilátoři vás upozorní, když máte úkol ve svém stavu, nebo ve skutečnosti, pokud se váš stav skládá pouze z tohoto úkolu, který, ano, vypadá stejně podezřele
  • Při porovnávání hodnot, pokud jste programátor, byste neměli zapomenout dát dvojnásobek '='. Můžete také zapomenout dát "!" při testování nerovnosti.
50
mojuba

Ah, ano, "Yoda kondicionéry" ("Pokud je hodnota nula, vykonejte tento kód, musíte!"). Vždycky poukazuji na kohokoli, kdo tvrdí, že jsou „lepší“ na nástroje, jako jsou vlákna (1). Tento konkrétní problém byl vyřešen od konce 70. let. Většina moderních jazyků ani nezkompiluje výraz jako if(x = 10), protože odmítají donutit výsledek přiřazení booleovskému výrazu.

Jak říkali ostatní, rozhodně to není problém, ale to vyvolává trochu kognitivní disonance.

59
TMN

Je to nepříjemné, protože ukládá malou, ale znatelnou duševní daň.

Lidé čtou zleva doprava prakticky ve všech programovacích jazycích (a ve většině přirozených jazyků).

Pokud vidím 123 == x, Tak to mentálně analyzuji:

  • 123 - tak co? neúplné informace.
  • == - dobře, 123 je 123, proč to vyzkoušet ...
  • x - ok, takže o to nás znepokojuje. Teprve teď mám kontext.
  • Vraťte se k přehodnocení 123 A proč je x ve srovnání s ním.

Když vidím x == 123 Mentální parsování je:

  • x - Poskytuje kontext, vím o čem je podmínka. Mohu se rozhodnout ignorovat zbytek. Na základě předchozího toku mám dobrý nápad, proč a co má přijít (a být překvapený, pokud se liší).
  • == - Myslel jsem si to.
  • 123 - Jo.

Přerušení je malé (v jednoduchém příkladu), ale já vždy si to všimnu.

Uvedení hodnoty jako první může být dobrý nápad, pokud na to upozorníte chcete, např. if (LAUNCH_NUKES == cmd). Normálně to není záměr.

56
dbkk

Škodlivý? Ne. Funguje to obousměrně.

Špatná praxe? V nejlepším případě diskutabilní. Je to jednoduché obranné programování.

Vypadá to, že spíte? Ne.

47
Wonko the Sane

To je v podstatě fimbait.

Ne, nedělá to víc škody než užitku. Jednoduchý.

Více slov?

Argument překladače? Erm, ish, možná - nedělej příliš mnoho víry v pomocníka, aby tě zachránil před sebou.

"Neměli byste zapomenout" - dobře duh - ne, samozřejmě, neměli byste mezitím být unavený, kódoval jsem celý den, musel jsem používat dva různé jazyky a někdy, jen někdy, když jsem člověk, udělám chybu.

Smysl tohoto druhu chování je, že jeho defenzivní, není tam proto, že očekáváte, že udělá chyby víc, než máte pojištění, protože očekáváte zhroucení ... ale pokud uděláte to, aby byla pokryta jeho Nice.

Těžko číst? Stěžujete si, že slušný programátor by měl mít== hardwired (což dělá všechny druhy špatných předpokladů), ale ten samý slušný programátor nedokáže přečíst hodnotu 0 == ??

Neubližuje, má potenciální výhody, hloupou otázku, nechte ostatní, aby to dělali, pokud chtějí a pokračovali.

17
Murph

Neříkal bych to škodě, ale je to nepříjemné. Takže ne, neřekl bych, že ano.

11
whatsisname

Nikdy jsem to necítil celý 'co když zapomenu a =?' opravdu vážně. Ano, můžete udělat překlep, ale my všichni uděláme překlepy, zdá se hloupé změnit celý styl kódování, protože se bojíte udělat chybu. Proč nečinit všechny své proměnné a funkce malými písmeny bez interpunkce, protože byste mohli zapomenout na kapitalizaci nebo podtržení jednoho dne?

10
GSto

Někteří lidé jej používají k tomu, aby jasně ukázali, co podmíněný dělá. Například:

Cesta 1:

FILE *fp;

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

Cesta 2:

FILE *fp;

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

Někteří lidé se domnívají, že druhý příklad je stručnější, nebo argumenty zvrácené ilustrují smysl testu (podmíněné) před samotným testem.

Ve všech věcech mi to ani tak nevadí. Mám svůj mazlíček o stylu a největší je nekonzistentnost. Takže to udělejte stejným způsobem, důsledně a nebude mi vadit čtení vašeho kódu.

Smíchejte to až do bodu, kdy to vypadá, že na něm pracovalo šest různých lidí s vlastním osobitým stylem, trochu jsem naštvaný.

9
Tim Post

Pro mě je to jednoduchá klimatizace. Jako někdo, kdo se naučil (v 90. letech) C a C++, jsem si na to zvykl a stále jej používám, i když důvody jsou poučeny.

Jakmile jste "podmíněni" podívat se na levou stranu pro "konstantu", stává se to druhou přirozeností.

Také ji používám pouze pro ekvivalenci (nebo negovanou ekvivalenci), nikoli pro větší/menší než.

Úplně souhlasím s odpovědí Wonka.

6
DevSolo

Jedním z případů, kdy to považuji za užitečné, je to, že variabilní část if je poměrně dlouhá a zobrazení hodnot usnadňuje čtení kódu. Nejlepší příklady jsou jazyky s tečkovaným oborem názvů.

Například něco, na čem jsem pracoval s jednoduchým přihlášením, mělo situaci, kdy byste mohli mít dvě souběžné relace, pokud by se vyskytl určitý typ chyby a byl obnoven určitým způsobem, takže k tomu musím přidat manipulátor, který byl uvnitř něco takového:

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

Je pravda, že v tomto příkladu existují i ​​jiné způsoby, jak toho dosáhnout, ale to by byl případ, kdy by verze číslo jedna byla lépe čitelná.

5
Bill

A přesto k chybám dochází. A někdy chcete přiřazení v operátoru smyčky, kde byste jinak mohli zkontrolovat rovnost, nebo alespoň je běžnou praxí používat ji.

Poněkud to držím. Rada, kterou jsem následoval (možná od Code Complete), je udržovat, co by mělo být při porovnání v levém dolním rohu. Diskutoval jsem o tom s kolegou dříve a myslel si, že je to trochu šílené, ale na to jsem si velmi zvykl.

Takže bych řekl:

if ( 0 <= value )

Ale řekl bych také:

if ( value <= 100 )

Rovnost budu mít tendenci kontrolovat s proměnnou vlevo, i když je to jen čitelnější.

3
glenatron