Recept na špagety - java vs. net

Gll

Re:Recept na špagety - java vs. net
« Odpověď #15 kdy: 10. 10. 2017, 19:42:09 »
takze ako nahradit napr. 4 vnorene ify?

Nevnořovat je, ale dát je pod sebe, každý zvlášť. Uvnitř každé z nich mít throw nebo return. Podmínky je obvykle je nutné negovat. Teprve pokud není splněna žádná podmínka, provede se výkonná část kódu, která se nachází až za nimi.

https://wpshout.com/unconditionally-refactoring-nested-statements-cleaner-code/
https://softwareengineering.stackexchange.com/questions/206816/clarification-of-avoid-if-else-advice
https://www.youtube.com/watch?v=kisKOhifiC0

Asi otazka vkusu treba podle Petera Norviga je vice returnu v jedne funkci spatne. Jeho tutorial on good programming style je jeden z mala textu na tohle tema, ktery jsem cetl a dava mi smysl.


Ivan Nový

Re:Recept na špagety - java vs. net
« Odpověď #16 kdy: 10. 10. 2017, 21:09:09 »
Ha, ha, ha, ... Žádné vnořené ify mi při programování nevznikají, prý se to jmenuje gateway style :-)))

například:
Kód: [Vybrat]

       def extract(name):
            def _find(result, n):
                if name in columns[n].options:
                    result.append((n, columns[n].options[name].split(':')))
                return result
            return _find
       
        for name, field in reduce(extract('source'), iter(columns), []):
            pass

        for name, field in reduce(extract('rowid'), iter(columns), []):
            if field == ['']:
               pass
            else:
               pass


balki

Re:Recept na špagety - java vs. net
« Odpověď #17 kdy: 10. 10. 2017, 23:15:38 »
Obcas mam chut v praci na spagety. Jaky je osvedceny recept?

https://cooking.nytimes.com/recipes/1017306-pasta-aglio-olio-e-peperoncino

Boloňský taky dobrý, samozřejmě - udělaný doma, ne upatlaný z polotovaru. A když je sezona, tak spaghetti pomodoro, jednoduchý jak cvičky a naprosto luxusní. Obé kompatibilní s Javou i .NETem  ;D

To ja radsej pouzivam susene spagety, ono vytahovat to z cesta je dost otrava, najma ked clovek nema skill.

jpu

Re:Recept na špagety - java vs. net
« Odpověď #18 kdy: 11. 10. 2017, 07:10:48 »
Citace: Ondra Satai Nekola link=topic=16499.msg229747#msg229747

Záleží na okolnostech. Často je řešení refaktoring, kdy vnitřky extrahuješ do samostatných (obvykle privátních) metod. Což tě donutí je pojmenovat. A to tě zase donutí těm kusům případně nějaký jasný význam.
Takze mas na mysli to, ze 4 ify ostanu vnorene, ale logiku z jednotlivych ifov presunies do metod?

balki

Re:Recept na špagety - java vs. net
« Odpověď #19 kdy: 11. 10. 2017, 09:02:27 »
Citace: Ondra Satai Nekola link=topic=16499.msg229747#msg229747

Záleží na okolnostech. Často je řešení refaktoring, kdy vnitřky extrahuješ do samostatných (obvykle privátních) metod. Což tě donutí je pojmenovat. A to tě zase donutí těm kusům případně nějaký jasný význam.
Takze mas na mysli to, ze 4 ify ostanu vnorene, ale logiku z jednotlivych ifov presunies do metod?

Sorry, ze sa vam miesam, ale osobne, ked nieco zrefactorujem do metod, potom sa mi ten les if-ov aj lepsie prehodi na plain strukturu. Lebo s izolovanymi metodami, kde su nejake vstupy a nejake vystupy (testovatelne) sa lahsie pracuje nez s "kusmi kodu", ktore robia neurcitu cinnost.


gll

Re:Recept na špagety - java vs. net
« Odpověď #20 kdy: 11. 10. 2017, 09:53:21 »
Ha, ha, ha, ... Žádné vnořené ify mi při programování nevznikají, prý se to jmenuje gateway style :-)))

například:
Kód: [Vybrat]

       def extract(name):
            def _find(result, n):
                if name in columns[n].options:
                    result.append((n, columns[n].options[name].split(':')))
                return result
            return _find
       
        for name, field in reduce(extract('source'), iter(columns), []):
            pass

        for name, field in reduce(extract('rowid'), iter(columns), []):
            if field == ['']:
               pass
            else:
               pass


je to pěkné. možná by bylo jednodušší použít sum(map(...), []). Nemusel byste apendovat. To vaše je asi obecnější a něco mi uniká.

dustin

Re:Recept na špagety - java vs. net
« Odpověď #21 kdy: 11. 10. 2017, 09:55:18 »
Přesně tak. Metody mají pořádné pojmenování, jejich lokální proměnné se nemíchají do ostatních (klasické zneužívání již nadefinovaných proměnných v různých částech kódu, kolik chyb už to způsobilo...), jednotlivé vrstvy abstrakce se od sebe krásně oddělí a zpřehlední, zpracování stejného z různých částí algoritmu řeší jen jeden kód v metodě. Základní jednoduché věci, ale bohužel stále ne vývojářský standard... Učí se to vůbec na školách?

Často člověk při takovém refaktoringu narazí i na logickou chybu, kterou v původních 4-úrovňových špagetách nebylo vidět.

gll

Re:Recept na špagety - java vs. net
« Odpověď #22 kdy: 11. 10. 2017, 10:02:19 »
Přesně tak. Metody mají pořádné pojmenování, jejich lokální proměnné se nemíchají do ostatních (klasické zneužívání již nadefinovaných proměnných v různých částech kódu, kolik chyb už to způsobilo...), jednotlivé vrstvy abstrakce se od sebe krásně oddělí a zpřehlední, zpracování stejného z různých částí algoritmu řeší jen jeden kód v metodě. Základní jednoduché věci, ale bohužel stále ne vývojářský standard... Učí se to vůbec na školách?

Často člověk při takovém refaktoringu narazí i na logickou chybu, kterou v původních 4-úrovňových špagetách nebylo vidět.

Když se me takový kéd dostane pod ruku, dokážu ho zkrátit na cca 10-20% původní délky zrušením abstrakcí a zredukováním na jednu vrstvu. Dost mi to zjednodušší budoucí údržbu.

gll

Re:Recept na špagety - java vs. net
« Odpověď #23 kdy: 11. 10. 2017, 10:05:43 »
Přesně tak. Metody mají pořádné pojmenování, jejich lokální proměnné se nemíchají do ostatních (klasické zneužívání již nadefinovaných proměnných v různých částech kódu, kolik chyb už to způsobilo...), jednotlivé vrstvy abstrakce se od sebe krásně oddělí a zpřehlední, zpracování stejného z různých částí algoritmu řeší jen jeden kód v metodě. Základní jednoduché věci, ale bohužel stále ne vývojářský standard... Učí se to vůbec na školách?

Často člověk při takovém refaktoringu narazí i na logickou chybu, kterou v původních 4-úrovňových špagetách nebylo vidět.

Když se mi takový kód dostane pod ruku, dokážu ho zkrátit na cca 10-20% původní délky zrušením abstrakcí a zredukováním na jednu vrstvu. Dost mi to zjednodušší budoucí údržbu.

oprava: me -> mi, kéd -> kód

Re:Recept na špagety - java vs. net
« Odpověď #24 kdy: 11. 10. 2017, 10:06:39 »
Přesně tak. Metody mají pořádné pojmenování, jejich lokální proměnné se nemíchají do ostatních (klasické zneužívání již nadefinovaných proměnných v různých částech kódu, kolik chyb už to způsobilo...), jednotlivé vrstvy abstrakce se od sebe krásně oddělí a zpřehlední, zpracování stejného z různých částí algoritmu řeší jen jeden kód v metodě. Základní jednoduché věci, ale bohužel stále ne vývojářský standard... Učí se to vůbec na školách?

Často člověk při takovém refaktoringu narazí i na logickou chybu, kterou v původních 4-úrovňových špagetách nebylo vidět.

Když se me takový kéd dostane pod ruku, dokážu ho zkrátit na cca 10-20% původní délky zrušením abstrakcí a zredukováním na jednu vrstvu. Dost mi to zjednodušší budoucí údržbu.

Ostatne proc by mely mit veci vhodna jmena, coz?

gll

Re:Recept na špagety - java vs. net
« Odpověď #25 kdy: 11. 10. 2017, 10:09:32 »
Přesně tak. Metody mají pořádné pojmenování, jejich lokální proměnné se nemíchají do ostatních (klasické zneužívání již nadefinovaných proměnných v různých částech kódu, kolik chyb už to způsobilo...), jednotlivé vrstvy abstrakce se od sebe krásně oddělí a zpřehlední, zpracování stejného z různých částí algoritmu řeší jen jeden kód v metodě. Základní jednoduché věci, ale bohužel stále ne vývojářský standard... Učí se to vůbec na školách?

Často člověk při takovém refaktoringu narazí i na logickou chybu, kterou v původních 4-úrovňových špagetách nebylo vidět.

Když se me takový kéd dostane pod ruku, dokážu ho zkrátit na cca 10-20% původní délky zrušením abstrakcí a zredukováním na jednu vrstvu. Dost mi to zjednodušší budoucí údržbu.

Ostatne proc by mely mit veci vhodna jmena, coz?

vhodná jména jsou krátká. Stačí nepoužívat hvězdičkové importy. Nemusí mít každá věc unikátní jméno.

Ladislav Michl

Re:Recept na špagety - java vs. net
« Odpověď #26 kdy: 11. 10. 2017, 10:12:03 »
Přesně tak. Metody mají pořádné pojmenování, jejich lokální proměnné se nemíchají do ostatních (klasické zneužívání již nadefinovaných proměnných v různých částech kódu, kolik chyb už to způsobilo...), jednotlivé vrstvy abstrakce se od sebe krásně oddělí a zpřehlední, zpracování stejného z různých částí algoritmu řeší jen jeden kód v metodě. Základní jednoduché věci, ale bohužel stále ne vývojářský standard... Učí se to vůbec na školách?

Často člověk při takovém refaktoringu narazí i na logickou chybu, kterou v původních 4-úrovňových špagetách nebylo vidět.

Když se me takový kéd dostane pod ruku, dokážu ho zkrátit na cca 10-20% původní délky zrušením abstrakcí a zredukováním na jednu vrstvu. Dost mi to zjednodušší budoucí údržbu.
Pravděpodobně máte na mysli neustálé přepisování většiny z těch zbylých 10-20% při jakkoliv malé změně a úplné otestování celé aplikace, protože vlivem absence jakýchkoliv logických celků (abstrakcí) není automatický dílčí test možný.

dustin

Re:Recept na špagety - java vs. net
« Odpověď #27 kdy: 11. 10. 2017, 10:16:27 »
Vhodná jména jsou taková, která správně popisují, co daná metoda dělá. Samozřejmě co nejkratším způsobem, ale dostatečně.

Kód se má číst jako anglický příběh. Vychytávky a nečitelné optimalizace jsou fajn pro ego jejich autora, ale ne pro zdravý rozum jeho následovníků a dlouhodobou efektivitu investice majitele kódu.

Re:Recept na špagety - java vs. net
« Odpověď #28 kdy: 11. 10. 2017, 10:24:25 »
Přesně tak. Metody mají pořádné pojmenování, jejich lokální proměnné se nemíchají do ostatních (klasické zneužívání již nadefinovaných proměnných v různých částech kódu, kolik chyb už to způsobilo...), jednotlivé vrstvy abstrakce se od sebe krásně oddělí a zpřehlední, zpracování stejného z různých částí algoritmu řeší jen jeden kód v metodě. Základní jednoduché věci, ale bohužel stále ne vývojářský standard... Učí se to vůbec na školách?

Často člověk při takovém refaktoringu narazí i na logickou chybu, kterou v původních 4-úrovňových špagetách nebylo vidět.

Když se me takový kéd dostane pod ruku, dokážu ho zkrátit na cca 10-20% původní délky zrušením abstrakcí a zredukováním na jednu vrstvu. Dost mi to zjednodušší budoucí údržbu.

Ostatne proc by mely mit veci vhodna jmena, coz?

vhodná jména jsou krátká. Stačí nepoužívat hvězdičkové importy. Nemusí mít každá věc unikátní jméno.

Importy s tim nesouviseji. Minimalne na zacatku ten refaktoring povede na (typicky private nebo package private) metody ve stejne tride.

gll

Re:Recept na špagety - java vs. net
« Odpověď #29 kdy: 11. 10. 2017, 10:26:05 »
Přesně tak. Metody mají pořádné pojmenování, jejich lokální proměnné se nemíchají do ostatních (klasické zneužívání již nadefinovaných proměnných v různých částech kódu, kolik chyb už to způsobilo...), jednotlivé vrstvy abstrakce se od sebe krásně oddělí a zpřehlední, zpracování stejného z různých částí algoritmu řeší jen jeden kód v metodě. Základní jednoduché věci, ale bohužel stále ne vývojářský standard... Učí se to vůbec na školách?

Často člověk při takovém refaktoringu narazí i na logickou chybu, kterou v původních 4-úrovňových špagetách nebylo vidět.

Když se me takový kéd dostane pod ruku, dokážu ho zkrátit na cca 10-20% původní délky zrušením abstrakcí a zredukováním na jednu vrstvu. Dost mi to zjednodušší budoucí údržbu.
Pravděpodobně máte na mysli neustálé přepisování většiny z těch zbylých 10-20% při jakkoliv malé změně a úplné otestování celé aplikace, protože vlivem absence jakýchkoliv logických celků (abstrakcí) není automatický dílčí test možný.

Ani  bych neřekl. Ony ty abstrakce často nic nedělají. Typický případ je obalování nějakého modulu třetí strany vlastním API.

Abstrakce mají smysl až tam, kde se opakuje nějaký vzor. Často narážím na abstrakce, které jsou použity pouze jednou. To je plýtvání úsilím hlavně čtenářů toho kódu.