If bez curly brackets?

Kit

  • *****
  • 770
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #30 kdy: 22. 06. 2025, 18:55:49 »
Dá se to řešit i pyramidou. Goto dělá vlastně totéž, jen ne strukturovaně:
Hmm, to mě připadá ne zcela optimální, nejméně hned ze dvou důvodů:
1. dost to narušuje vizuální vnímání odsazení vs flow (ok, tohle se možná dá naučit, ale vypadá to strašně)
2. obvykle těch různých cleanupů mívám mnohem méně, než podmínek, které k nim vedou (typicky tři, nějaká alokace struktury, nějakej socket, a případně je třeba dát error na vědomí protistraně), pak by se podobná konstrukce vedla jen k dost nehezkým ošklivostem

Je nějaká zásadní výhoda tohodle stylu kromě "goto bad", která mě uniká?

Goto by vlastně také mělo být odsazeno, protože je to větvení. V tu chvíli ztrácí goto smysl. U té pyramidy jsem se trochu rozšoupl, protože obvykle dodržuji max 4 úrovně odsazení. Navíc bych takhle tu funkci normálně nenapsal.

Goto jsem mimo assembler a Basic nikdy nepoužil. Je to snad špatně?


Mlocik97

  • *****
  • 948
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #31 kdy: 22. 06. 2025, 19:34:49 »
Tak tie "zbytočné" zátvorky:

Kód: [Vybrat]
if (a === b):
    doSomething()
    doSomethingElse()

Nie sú až tak zbytočné, ak:

1. refactoruješ, kde presunutie časti kódu do inej funkcie znamená že sa musí aj zmeniť odsadenie.
2. ak chceš napríklad volať `doSomethingElse()` pokaždé, nie len pri podmienke a === b, musíš to riešiť zmenou odsadenia (a tu je fakt veľký problém to správne riešiť).
Lenže odsadenie je "neviditeľný znak", a musíš teraz riešiť či odsadenie je `\t` alebo `\s` a koľko ich je. To je nie len náročnejšie pri parsovaní ale aj pri čítaní. V Pythonu ľahko prehliadneš či tam máš 4 medzery alebo tabulátor. Navyše rôzne nastavenia šírky tabulátoru tiež pridávajú issue. Ak zas ale riešiš medzerami, tak pre postihnutých skús použiť čítačku "medzera medzera medzera medzera funkcia doSomething". Asi už neznie lákavo.
3. IDE, intellisense a podobne má taktiež problém, o "AI", ktorá si počet medzier medzi tokenmi asi len tak jednoducho "nespracuje", nehovorím.
4. odsadenie je vizuálne odsadenie, určite by to nemalo mať v kóde význam
5. minifiers ak je potreba prenos cez HTTP a optimalizovať výkon, alebo v IoT kde je obmedzená kapacita atď, sa ti poteší že tam máš najebaných stovky zbytočných medzier namiesto pár {}.
6. ďalej je tu issue s fontami, dokonca sú špecifické znaky, ktoré sú složeným znakom medzery a iného znaku.
7. skús niekedy search & replace podľa bloku kódu, keď tam máš {} vs keď to máš celé podľa odsadenia.
8. IDE snippety, ani nehovorím aký bordel narobí zas a znova toto medzerkovanie a odsadzovanie kde kade.
9. ak máš odsadenie napríklad 2 medzerami, ale v bloku je len jedna medzera, IDE to nevie automaticky fixnúť, nevie či to má byť súčasťou bloku alebo nie. Navyše takýto kód zlyhá a hľadanie príčiny je enormne náročné (medzery "nevidíš")
10. diffovanie, ktoré sa rozbije kvôli zmene odsadenia robí krásny bordel v Pull Requestoch.

Asi už je jasné že curly brackets majú význam.
« Poslední změna: 22. 06. 2025, 19:40:30 od Mlocik97 »

Re:If bez curly brackets?
« Odpověď #32 kdy: 22. 06. 2025, 20:05:13 »
Citace
Goto by vlastně také mělo být odsazeno, protože je to větvení. V tu chvíli ztrácí goto smysl.
Wut?

Kód: [Vybrat]
void * alloc_res(void)
{
void *res1 = alloc_res1();
if (!res1) {
return NULL;
}
void *res2 = alloc_res2(res1);
if (!res2) {
goto free_res1;
}
void *res3 = alloc_res3(res2);
if (!res3) {
goto free_res2;
}
void *res4 = alloc_res4(res3)
if (!res4) {
goto free_res3;
}
return res4;

free_res3:
dealloc_res3(res3);
free_res2:
dealloc_res2(res2);
free_res1:
dealloc_res1(res1);

return NULL;
}

Re:If bez curly brackets?
« Odpověď #33 kdy: 22. 06. 2025, 20:56:45 »
Ja väčšinou pri ife nedávam zátvorky, príde mi to zbytočné. Ani si nepamätám kedy som naposledy riešil bug, ktorý by bol týmto spôsobený. Ja ale v takomto prípade zvyknem jeden riadok vynechať.
Kód: [Vybrat]
if (x)
    Do(x);
else
    Dont(x);

Do2();

So zátvorkami mi to ríde trochu overkill a zbytočné predĺženie
Kód: [Vybrat]
if (x)
{
    Do(x);
}
else
{
    Dont(x);
}

Do2();


Kit

  • *****
  • 770
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #34 kdy: 22. 06. 2025, 22:05:08 »
Tak tie "zbytočné" zátvorky:
Nie sú až tak zbytočné, ak:

1. refactoruješ, kde presunutie časti kódu do inej funkcie znamená že sa musí aj zmeniť odsadenie.

Dobrý editor se o to postará, případně můžeš označit blok a odsadit ho.

2. ak chceš napríklad volať `doSomethingElse()` pokaždé, nie len pri podmienke a === b, musíš to riešiť zmenou odsadenia (a tu je fakt veľký problém to správne riešiť).
Lenže odsadenie je "neviditeľný znak", a musíš teraz riešiť či odsadenie je `\t` alebo `\s` a koľko ich je. To je nie len náročnejšie pri parsovaní ale aj pri čítaní. V Pythonu ľahko prehliadneš či tam máš 4 medzery alebo tabulátor. Navyše rôzne nastavenia šírky tabulátoru tiež pridávajú issue. Ak zas ale riešiš medzerami, tak pre postihnutých skús použiť čítačku "medzera medzera medzera medzera funkcia doSomething". Asi už neznie lákavo.

Snížíš jedno odsazení bez ohledu na to, zda jsou tam 2, 3 nebo 4 mezery či tab. Dvakrát stisknu jednu klávesu. To je problém? Nastavení tabulátoru mám podle typu souboru. Pokud projekt vyžaduje jiné, Git umí clean a smudge. Na odsazení vždy používám tab, který je případně editorem online převeden na 2, 3 nebo 4 mezery. Ovšem autoindent je ještě lepší vychytávkou. Tady je výhoda, že u } mi automaticky sníží odsazení dalšího řádku.

3. IDE, intellisense a podobne má taktiež problém, o "AI", ktorá si počet medzier medzi tokenmi asi len tak jednoducho "nespracuje", nehovorím.
4. odsadenie je vizuálne odsadenie, určite by to nemalo mať v kóde význam

To je otázkou vkusu. Python je prostě takový, ve stylu YAML. Pascal má begin a end, který dostal i do SQL.

5. minifiers ak je potreba prenos cez HTTP a optimalizovať výkon, alebo v IoT kde je obmedzená kapacita atď, sa ti poteší že tam máš najebaných stovky zbytočných medzier namiesto pár {}.

HTTP je komprimováno, u IoT ti nic nebrání používat taby, Odsazení je úspornější než {} se středníkem. Těch "zbytečných mezer" tam není mnoho, pokud dodržuješ doporučené max 3-4 úrovně odsazení. Pokud nechceš použít tab, vystačíš si i s jednou mezerou.

6. ďalej je tu issue s fontami, dokonca sú špecifické znaky, ktoré sú složeným znakom medzery a iného znaku.
7. skús niekedy search & replace podľa bloku kódu, keď tam máš {} vs keď to máš celé podľa odsadenia.

Nic z toho se nevyskytuje před odsazením.

8. IDE snippety, ani nehovorím aký bordel narobí zas a znova toto medzerkovanie a odsadzovanie kde kade.

Ty odsazuješ mezerníkem?

9. ak máš odsadenie napríklad 2 medzerami, ale v bloku je len jedna medzera, IDE to nevie automaticky fixnúť, nevie či to má byť súčasťou bloku alebo nie. Navyše takýto kód zlyhá a hľadanie príčiny je enormne náročné (medzery "nevidíš")
10. diffovanie, ktoré sa rozbije kvôli zmene odsadenia robí krásny bordel v Pull Requestoch.

Takový kód neselže, každý blok může mít jiné odsazení. Je však doporučeno, aby bylo jednotné.

Buď máš hloupý editor, anebo nevhodné návyky.


Kit

  • *****
  • 770
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #35 kdy: 22. 06. 2025, 22:11:19 »
Ja väčšinou pri ife nedávam zátvorky, príde mi to zbytočné. Ani si nepamätám kedy som naposledy riešil bug, ktorý by bol týmto spôsobený. Ja ale v takomto prípade zvyknem jeden riadok vynechať.
So zátvorkami mi to ríde trochu overkill a zbytočné predĺženie
Kód: [Vybrat]
if (x)
{
    Do(x);
}
else
{
    Dont(x);
}

Do2();

Nemusí to být delší. {} na samostatném řádku nedělám, protože k tomu nevidím důvod, Stejně tak nevidím důvod mít prázdné řádky uvnitř funkce či metody:
Kód: [Vybrat]
if (x) {
    Do(x);
} else {
    Dont(x);
}
Do2();

Re:If bez curly brackets?
« Odpověď #36 kdy: 22. 06. 2025, 22:43:49 »

Nemusí to být delší. {} na samostatném řádku nedělám, protože k tomu nevidím důvod, Stejně tak nevidím důvod mít prázdné řádky uvnitř funkce či metody:
Kód: [Vybrat]
if (x) {
    Do(x);
} else {
    Dont(x);
}
Do2();
[/quote]

Jj, výsledok je podobný, ono to je len vec vkusu a zvyku, ja mám radšej syntax kde súvisiace zátvorky sú pod sebou, ale zdá sa, že tvoj zápis je rozšírený pri javascripte (asi aj pri čistom C), viem sa tam prispôsobiť, ale tam sa pohybujem minimálne

Kit

  • *****
  • 770
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #37 kdy: 22. 06. 2025, 23:25:50 »
Jj, výsledok je podobný, ono to je len vec vkusu a zvyku, ja mám radšej syntax kde súvisiace zátvorky sú pod sebou, ale zdá sa, že tvoj zápis je rozšírený pri javascripte (asi aj pri čistom C), viem sa tam prispôsobiť, ale tam sa pohybujem minimálne

Používám 16px písmo, abych na to dobře viděl a zároveň chci, aby se mi metoda či funkce vešla na stránku. Závorky na samostatných řádcích mi zhoršují čitelnost, protože musím hodně jezdit očima nahoru-dolů a ztrácím přitom synchronizaci. Prostě se mi to blbě čte a opravdu nejsem placen za počet řádek.

BoneFlute

  • *****
  • 2 033
    • Zobrazit profil
Re:If bez curly brackets?
« Odpověď #38 kdy: 23. 06. 2025, 01:02:25 »
Ja väčšinou pri ife nedávam zátvorky, príde mi to zbytočné. Ani si nepamätám kedy som naposledy riešil bug, ktorý by bol týmto spôsobený.

Minulý týden. A předtím taky relativně běžně.
To přehlédnutí je strašně snadný.

Re:If bez curly brackets?
« Odpověď #39 kdy: 23. 06. 2025, 08:40:03 »
tie zatvorky pri if, to sa este da. Ale ak ma niekto vzorec a neda tam zatvorky, tak to je uz na nervy. Strasne zle sa to cita a ked mas nejaky algoritmus prepisat, tak ta moze aj porazit.

Ink

  • *****
  • 686
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #40 kdy: 23. 06. 2025, 10:39:31 »
tie zatvorky pri if, to sa este da. Ale ak ma niekto vzorec a neda tam zatvorky, tak to je uz na nervy. Strasne zle sa to cita a ked mas nejaky algoritmus prepisat, tak ta moze aj porazit.

Není na to nějaký formátovač, který je přidá?

RDa

  • *****
  • 2 999
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #41 kdy: 23. 06. 2025, 12:59:56 »
tie zatvorky pri if, to sa este da. Ale ak ma niekto vzorec a neda tam zatvorky, tak to je uz na nervy. Strasne zle sa to cita a ked mas nejaky algoritmus prepisat, tak ta moze aj porazit.

+1

Taky me to desne s*re, kdyz pri paroven programovani to kolega ignoruje, ze pry zavorky jsou zbytecne, a u kazdy pripadu stravime minuty hadkou, a pak nekdo, kdo to ma cist / kontrolovat / opravovat / rozsirovat, tam stravi 5-10 minut aby pochopil co je to za podminku. Jako by je tech par stisku klaves a par bajtu na disku zabilo.

Osobne jeste pouzivam vicenasobne ify pro dlouhe vyrazy kde je top level jako AND (&&):

Kód: [Vybrat]
if (podminka1)
if (podminka2)
if (podminka3)
if (podminka4)
{
   neco();
}

Pomaha to verzovacimu systemu, kdy vidite co za cast se zmenila nebo pridala.. namisto diffu dlouheho radku.
Radeji pisu vice ifu bez { } nez resit slozite zda && patri na zacatek radku a pak to cely ma prvni a posledni zavorku nekde daleko od sebe.
Konstrukt s vicero if-ama pod sebou je jasny ze se jedna o top-level and, a neni tam zadny "or magic" kterym by se dane podminky vyradili.

Re:If bez curly brackets?
« Odpověď #42 kdy: 23. 06. 2025, 13:23:40 »
Kód: [Vybrat]
if (podminka1)
if (podminka2)
if (podminka3)
if (podminka4)
{
   neco();
}

Vskutku geniálne, teda do doby než tam niekto skúsi pridať else.

Re:If bez curly brackets?
« Odpověď #43 kdy: 23. 06. 2025, 13:27:45 »
Osobne jeste pouzivam vicenasobne ify pro dlouhe vyrazy kde je top level jako AND (&&):

Kód: [Vybrat]
if (podminka1)
if (podminka2)
if (podminka3)
if (podminka4)
{
   neco();
}
To nie, za toto zaskrtit.
Kód: [Vybrat]
if (podminka1 &&
   podminka2 &&
   podminka3 &&
   podminka4)
{
   neco();
}

V podstate to iste, ale na prvy pohlad dobre citatelne

Re:If bez curly brackets?
« Odpověď #44 kdy: 23. 06. 2025, 13:33:19 »
tie zatvorky pri if, to sa este da. Ale ak ma niekto vzorec a neda tam zatvorky, tak to je uz na nervy. Strasne zle sa to cita a ked mas nejaky algoritmus prepisat, tak ta moze aj porazit.

+1

Taky me to desne s*re, kdyz pri paroven programovani to kolega ignoruje, ze pry zavorky jsou zbytecne, a u kazdy pripadu stravime minuty hadkou, a pak nekdo, kdo to ma cist / kontrolovat / opravovat / rozsirovat, tam stravi 5-10 minut aby pochopil co je to za podminku. Jako by je tech par stisku klaves a par bajtu na disku zabilo.

Osobne jeste pouzivam vicenasobne ify pro dlouhe vyrazy kde je top level jako AND (&&):

Kód: [Vybrat]
if (podminka1)
if (podminka2)
if (podminka3)
if (podminka4)
{
   neco();
}

Pomaha to verzovacimu systemu, kdy vidite co za cast se zmenila nebo pridala.. namisto diffu dlouheho radku.
Radeji pisu vice ifu bez { } nez resit slozite zda && patri na zacatek radku a pak to cely ma prvni a posledni zavorku nekde daleko od sebe.
Konstrukt s vicero if-ama pod sebou je jasny ze se jedna o top-level and, a neni tam zadny "or magic" kterym by se dane podminky vyradili.

Ale fuj! V podstatě všechny jazyky co mají { } (a co znám) neřeší moc NL
Kód: [Vybrat]
if (a != a1
     && b != b1
     && (b2 || b3)) {
 ...
} else {
 ...
}

Pak fungují i očekávaně else, v rámci debugu můžete zakomentovat část podmínky a pro VCS to není problém ;-)