If bez curly brackets?

If bez curly brackets?
« kdy: 19. 06. 2025, 12:04:43 »
Ahojte,

Nedávno som mal konverzáciu s novým kolegom cca o takomto príklade:
Kód: [Vybrat]
if (a==b)
    for (...)
        doSomething()

A bol som šokovaný, že je zástancom (nielen) if-ov bez curly brackets. Ja som si myslel a dúfal, že táto diskusia je už mŕtva, pochovaná a zabudnutá minimálne od roku 2014.

Je tu ešte niekto z tohto klubu? Môžete mi povedať svoje argumenty?


Karmelos

  • *****
  • 1 173
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #1 kdy: 19. 06. 2025, 12:19:13 »
Máš to blbě, žádný curly brackets, ale dvojtečky. Má to bejt takhle:

Kód: [Vybrat]

if a == b:
    for ...:
        doSomething()
Gréta je nejlepší.

Re:If bez curly brackets?
« Odpověď #2 kdy: 19. 06. 2025, 12:21:24 »
Já. Od té doby co jsem musel refaktorovat kód jednoho exportu, kde bylo 5-15 zavíracích závorek vedle sebe, mám k používání nadbytečných znaků fyzický odpor. Věřím že kdyby to prase, co to psalo přede mnou, nesměl používat nadbytečné závorky, tak by se v tom ztratil a musel to napsat strukturovaněji.

Programátor má rozumnět jazyku ve kterám píše  kód.

Re:If bez curly brackets?
« Odpověď #3 kdy: 19. 06. 2025, 12:27:12 »
Máš to blbě, žádný curly brackets, ale dvojtečky. Má to bejt takhle:

Kód: [Vybrat]

if a == b:
    for ...:
        doSomething()
Súhlasím, ale tu žiaľ nejde o Python.

RDa

  • *****
  • 2 992
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #4 kdy: 19. 06. 2025, 12:31:33 »
bez { } pouzivam if jen jako oneliner:

Kód: [Vybrat]
if (isLost) lostCount++;


Re:If bez curly brackets?
« Odpověď #5 kdy: 19. 06. 2025, 12:37:00 »
Vzdy pouzivat curly brackets!

Kód: [Vybrat]
<script>

    function testWithBraces(a, b) {
        if (a == b) {
            for (let i = 0; i < 3; i++) {
                console.log("With braces: i =", i);
                console.log("This line always runs!");
            }
        }
    }

    function testWithoutBraces(a, b) {
        if (a == b)
            for (let i = 0; i < 3; i++)
                console.log("Without braces: i =", i);
                console.log("This line always runs!");
    }

    testWithBraces(5, 5);
    // With braces: i = 0
    // This line always runs!
    // With braces: i = 1
    // This line always runs!
    // With braces: i = 2
    // This line always runs!

    testWithBraces(5, 6);
    // Nothing

    testWithoutBraces(5, 5);
    // Without braces: i = 0
    // Without braces: i = 1
    // Without braces: i = 2
    // This line always runs!

    testWithoutBraces(5, 6);
    // This line always runs!

</script>

Re:If bez curly brackets?
« Odpověď #6 kdy: 19. 06. 2025, 13:11:06 »
Nepoužívať zložené zátvorky je tak super nápad, že Go a Rust to rovno zakázali.

Re:If bez curly brackets?
« Odpověď #7 kdy: 19. 06. 2025, 13:36:49 »
Stěžovat si na závorky ... a dávat jako ukázku kód s goto ...

A já si myslel, že goto se nedoporučuje už od devadesátek

Re:If bez curly brackets?
« Odpověď #8 kdy: 19. 06. 2025, 14:04:17 »
Stěžovat si na závorky ... a dávat jako ukázku kód s goto ...

A já si myslel, že goto se nedoporučuje už od devadesátek
Nepoužívam to ako príklad krásneho kódu. Je to extrémne známy prípad so závažnými bezpečnostnými dôsledkami, ktorý spopularizoval tento problém.

Ale áno, oči mi takmer vypadli, keď som tam videl goto. Mimochodom, aj v jadre linuxu sa nachádzajú goto.

Re:If bez curly brackets?
« Odpověď #9 kdy: 19. 06. 2025, 14:25:34 »
ak je to nieco jednoduche, ako napr. if nasledovany return, alebo continue tak nepouzivam, ak su napr. dva if pod sebou, tak tam ich dam.
Inak sa snazim, ak je to bez zatvoriek, bud dat do jedneho riadku, alebo dat tabulator, aby to bolo vizualne jasne.

Re:If bez curly brackets?
« Odpověď #10 kdy: 19. 06. 2025, 14:32:21 »
Stěžovat si na závorky ... a dávat jako ukázku kód s goto ...

A já si myslel, že goto se nedoporučuje už od devadesátek

Ten bug bol ale skutočne spôsobený nepoužitím zložených zátvoriek.
To goto je v tom nevinne, a je tam použite správne.
Príkaz goto sa bežne v C používa na uvoľnenie prostriedkov, obzvlášť pri chybových stavoch.
Je to zaužívaný vzor, A NIE JE NA TOM NIČ ZLÉ. Kernel je toho plný, a mnohé C knižnice tiež.

Iné jazyky to môžu mať riešené lepšie, napr. D -- scopeguard, Go -- defer, C++ -- RAII.

Re:If bez curly brackets?
« Odpověď #11 kdy: 19. 06. 2025, 15:59:05 »
A bol som šokovaný, že je zástancom (nielen) if-ov bez curly brackets. Ja som si myslel a dúfal, že táto diskusia je už mŕtva, pochovaná a zabudnutá minimálne od roku 2014.
A co na to říká samotný odkazovaný článek?
Citace
Maybe the coding style contributed to this by allowing ifs without braces, but one can have incorrect indentation with braces too, so that doesn't seem terribly convincing to me.
Jo jo, mrtvá, pochovaná a zapomenutá ::)

Wasper

  • ***
  • 184
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #12 kdy: 19. 06. 2025, 16:21:02 »
Je tu ešte niekto z tohto klubu? Môžete mi povedať svoje argumenty?
Podobně jako RDa - pro onelinery to používám běžně, pro cokoli dalšího jsem to kdysi používal taky, ale život mě hodně rychle naučil, že je to dost špatný nápad, ty chyby co tam tím člověk nadělá jsou extrémně blbě vidět.

Kit

  • *****
  • 761
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #13 kdy: 19. 06. 2025, 16:50:42 »
Já. Od té doby co jsem musel refaktorovat kód jednoho exportu, kde bylo 5-15 zavíracích závorek vedle sebe, mám k používání nadbytečných znaků fyzický odpor. Věřím že kdyby to prase, co to psalo přede mnou, nesměl používat nadbytečné závorky, tak by se v tom ztratil a musel to napsat strukturovaněji.

Tolik závorek často nemívám ani v celé funkci, přestože je povinně používám. Možná to bylo způsobeno zbytečně hluboko zanořenými podmínkami.

Wasper

  • ***
  • 184
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #14 kdy: 19. 06. 2025, 20:15:40 »
Tolik závorek často nemívám ani v celé funkci, přestože je povinně používám. Možná to bylo způsobeno zbytečně hluboko zanořenými podmínkami.
Dost často jsem tuhle prasárnu viděl v případě, že se autor kódu slepě držel zásady že goto je fuj.

Jak už tu zaznělo výše,  typicky ve funkcích, které mají několik málo rozdílných clean-upů je to naprosto legální praktika, která právě vnořená ifová pekla eliminuje.