If bez curly brackets?

Re:If bez curly brackets?
« Odpověď #15 kdy: 19. 06. 2025, 20:56:05 »
Lepsi jsou kulaty zavorky.. .
Kód: [Vybrat]
(if (= a b)
  (do-something)
  (do-something-else))



Kit

  • *****
  • 770
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #16 kdy: 20. 06. 2025, 00:16:57 »
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.

Místo goto používám return.

Re:If bez curly brackets?
« Odpověď #17 kdy: 20. 06. 2025, 06:13:19 »
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.

Místo goto používám return.
Což jde dobře v jazycích, které mají defer/destruktory či něco podobného. Jak je třeba před každým z mnoha returnů udělat úklid, tak to začíná být nepohodlné a náchylné k opomenutí.

Re:If bez curly brackets?
« Odpověď #18 kdy: 20. 06. 2025, 09:27:36 »
Lepsi jsou kulaty zavorky.. .
Kód: [Vybrat]
(if (= a b)
  (do-something)
  (do-something-else))


konečně rozumný názor! Na co potřebujeme mít více druhů závorek, když si vystačíme s jedním, s-expressions forever.

Re:If bez curly brackets?
« Odpověď #19 kdy: 20. 06. 2025, 12:36:17 »
Lepsi jsou kulaty zavorky.. .
Kód: [Vybrat]
(if (= a b)
  (do-something)
  (do-something-else))


konečně rozumný názor! Na co potřebujeme mít více druhů závorek, když si vystačíme s jedním, s-expressions forever.

Pripravte sa na budúcnosť!  https://github.com/stereobooster/wisp


Zopper

  • *****
  • 906
    • Zobrazit profil
Re:If bez curly brackets?
« Odpověď #20 kdy: 20. 06. 2025, 13:40:23 »
Lepsi jsou kulaty zavorky.. .
Kód: [Vybrat]
(if (= a b)
  (do-something)
  (do-something-else))

A není tu těch závorek nějak moc? Podle mě nejsou potřeba žádné.

Kód: [Vybrat]
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook.
Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook?
Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook.
Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook.

Wasper

  • ***
  • 185
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #21 kdy: 20. 06. 2025, 13:54:37 »
Místo goto používám return.
To (v céčku) ale neřeší problém, ale přidělává jinde. Takový (pseudocode) typický blok s returnem, a s chybou kterou jsem tam udelal snadno a rychle...
Kód: [Vybrat]
sock = malloc();
if (!sock) return -1;

sock->fd = socket();
if (sock->fd == -1) {
    free(sock);
    return -1;       
}
i = bind(sock->fd, ...);
if (i) {
    close(sock->fd);
    free(sock);
    return -1;
}   

i = connect(sock->fd,...);
if (i) {
    close(sock->fd);
    return -1;
}   

A když se člověk rozhodne tam něco dodělat, tak musí projít všechny ty cleanupy, které jsou tam 100x

Re:If bez curly brackets?
« Odpověď #22 kdy: 21. 06. 2025, 11:52:33 »
Pripravte sa na budúcnosť!  https://github.com/stereobooster/wisp
Last commit: 5 years ago :-)
Ale souhlas, rozhodně se mi to čte líp (a dokonce jsem to i znal z dřívějška). Ale i tak je to furt Lisp a čte si mi to ve srovnání s "normálním" jazykem blbě...

Ink

  • *****
  • 686
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #23 kdy: 22. 06. 2025, 10:11:48 »
Pripravte sa na budúcnosť!  https://github.com/stereobooster/wisp
Last commit: 5 years ago :-)
Ale souhlas, rozhodně se mi to čte líp (a dokonce jsem to i znal z dřívějška). Ale i tak je to furt Lisp a čte si mi to ve srovnání s "normálním" jazykem blbě...

Slepá ulička zůstane slepou, i když ji nově vydláždíme.

Re:If bez curly brackets?
« Odpověď #24 kdy: 22. 06. 2025, 14:55:19 »
Místo goto používám return.
To (v céčku) ale neřeší problém, ale přidělává jinde. Takový (pseudocode) typický blok s returnem, a s chybou kterou jsem tam udelal snadno a rychle...
Kód: [Vybrat]
sock = malloc();
if (!sock) return -1;

sock->fd = socket();
if (sock->fd == -1) {
    free(sock);
    return -1;       
}
i = bind(sock->fd, ...);
if (i) {
    close(sock->fd);
    free(sock);
    return -1;
}   

i = connect(sock->fd,...);
if (i) {
    close(sock->fd);
    return -1;
}   

A když se člověk rozhodne tam něco dodělat, tak musí projít všechny ty cleanupy, které jsou tam 100x

Ale to musis udelat vlastne vzdycky, jedine, ze bys mel neco jako
Kód: [Vybrat]
// ... dalsi pripadne vycistovaci procedury
close_socket:
close(socket);
free_socket:
free(socket);


Re:If bez curly brackets?
« Odpověď #25 kdy: 22. 06. 2025, 15:22:45 »
Já mám ve zvyku používat složené závorky (bloky podle odsazení, jako má třeba Python nebo Scala, nechávám stranou) na explicitní vymezení bloku prakticky vždy. Výjimku může tvořit situace, kdy jde o zmíněný oneliner.

Dříve jsem to nedělal, kdysi dávno (dlouho před goto fail) mě to vypeklo, kdy při přidání dalšího příkazu (který možná jen dumpoval stav) omylem změnilo chování, protože jsem si neuvědomil chybějící {…}. (Pro přesnost: byl to Pascal, takže šlo o begin/end, nikoli o {…}, ale princip zůstává.)

Na druhou stranu podobné problémy může jít řešit i jinou cestou. Máme nástroje, které zformátují kód. Tytéž nástroje lze použít i ke kontrole, jestli formátování kódu odpovídá. Máme CI, které tyto nástroje může spouštět automaticky a kontrolovat kód po každém pushi. (A v některých případech ty problémy lze odhalit i zdánlivě nesouvisejícími nástroji, v případě goto fail tím vznikl unreachable code, nicméně to není univerzální řešení.) Lze obhájit nepoužívání {…} tím, že máme tyto nástroje? Možná, ale:

1. Pokud člověk jen bez kontroly zformátuje kód, mohlo by to projít. Pravda, u pull requestu by to mohlo bît do očí, a i pokud by to prošlo, nejspíš by to bylo odhaleno dříve.
2. Ač obvykle nechci nabádat k davovému chování, tady mi přijde praktičtější se davu držet a psát {…}, protože novému programátorovi to bude zjevnější. Naopak ve vynechávání nevidím moc výhodu.

Samozřejmě záleží na projektu. Například u one-man-show bez ambicí na dalšího vývojáře je větší prostor pro vystoupení z davu.

Kit

  • *****
  • 770
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #26 kdy: 22. 06. 2025, 15:33:19 »
Místo goto používám return.
To (v céčku) ale neřeší problém, ale přidělává jinde. Takový (pseudocode) typický blok s returnem, a s chybou kterou jsem tam udelal snadno a rychle...
Kód: [Vybrat]
sock = malloc();
if (!sock) return -1;

sock->fd = socket();
if (sock->fd == -1) {
    free(sock);
    return -1;       
}
i = bind(sock->fd, ...);
if (i) {
    close(sock->fd);
    free(sock);
    return -1;
}   

i = connect(sock->fd,...);
if (i) {
    close(sock->fd);
    return -1;
}   

A když se člověk rozhodne tam něco dodělat, tak musí projít všechny ty cleanupy, které jsou tam 100x

Dá se to řešit i pyramidou. Goto dělá vlastně totéž, jen ne strukturovaně:
Kód: [Vybrat]
struct socket_wrapper *sock = malloc(sizeof(struct socket_wrapper));
if (sock) {
sock->fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock->fd != -1) {
if (bind(sock->fd, ...) == 0) {
if (connect(sock->fd, ...) == 0) {
// Všechno v pořádku
return sock->fd;
}
// connect selhal
}
// bind selhal
close(sock->fd);
}
// socket selhal
free(sock);
}
// malloc selhal
return -1;

Kit

  • *****
  • 770
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #27 kdy: 22. 06. 2025, 15:43:38 »
2. Ač obvykle nechci nabádat k davovému chování, tady mi přijde praktičtější se davu držet a psát {…}, protože novému programátorovi to bude zjevnější. Naopak ve vynechávání nevidím moc výhodu.

Samozřejmě záleží na projektu. Například u one-man-show bez ambicí na dalšího vývojáře je větší prostor pro vystoupení z davu.

{…} používám všude i ve svých projektech, dokonce i když si chci jen něco vyzkoušet. Prostě jsem si na to zvykl a mám na to klávesové makro :<CR> jako v Pythonu.

Re:If bez curly brackets?
« Odpověď #28 kdy: 22. 06. 2025, 16:30:58 »
Citace
Dá se to řešit i pyramidou. Goto dělá vlastně totéž, jen ne strukturovaně

A to niekomu príde čitateľnejšie?

A ak áno, je k tomu aj nejaký iný dôvod okrem indoktrinácie "goto bad"?

Wasper

  • ***
  • 185
    • Zobrazit profil
    • E-mail
Re:If bez curly brackets?
« Odpověď #29 kdy: 22. 06. 2025, 18:28:37 »
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á?