Recept na špagety - java vs. net

Re:Recept na špagety - java vs. net
« Odpověď #30 kdy: 11. 10. 2017, 10:30:25 »
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.

Zdaleka ne nutne. Pokud neco schovavaji pod dobrym jmenem, tak zjednodusi cteni tim, ze dotycneho odstini od detailu, ktere v dany okamzik nepotrebuje.

Vseho primerene, samozrejme.


Ladislav Michl

Re:Recept na špagety - java vs. net
« Odpověď #31 kdy: 11. 10. 2017, 10:38:06 »
Tahle to beru, ovšem z původní odpovědi mi to nějak nevyplývalo...

gll

Re:Recept na špagety - java vs. net
« Odpověď #32 kdy: 11. 10. 2017, 10:49:35 »
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.

Ego se dá honit i na abstrakcích a natahování kódu. Je otázka, kdo nadělá víc škody.

dustin

Re:Recept na špagety - java vs. net
« Odpověď #33 kdy: 11. 10. 2017, 10:55:22 »
Škodu nadělá ten, kdo zhorší čitelnost kódu pro ostatní. Ať už jakýmkoliv způsobem. Čitelnost kódu má po každé úpravě minimálně zůstat, spíše se zlepšit. Není to žádná teorie, všichni vývojáři s tím bojují každý den.

gll

Re:Recept na špagety - java vs. net
« Odpověď #34 kdy: 11. 10. 2017, 11:13:07 »
Škodu nadělá ten, kdo zhorší čitelnost kódu pro ostatní. Ať už jakýmkoliv způsobem. Čitelnost kódu má po každé úpravě minimálně zůstat, spíše se zlepšit. Není to žádná teorie, všichni vývojáři s tím bojují každý den.

Čitelnost je subjektivní metrika. Proto existují různé style guides, aby se lidé nemuseli hádat co je a co není čitelné. Lze automaticky kontrolovat i názvy proměnných, aby splňovaly určitá pravidla.

Délka kódu je objektivní metrika. Kratší kód by měl dostat přednost.



Re:Recept na špagety - java vs. net
« Odpověď #35 kdy: 11. 10. 2017, 11:13:52 »
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.

Ego se dá honit i na abstrakcích a natahování kódu. Je otázka, kdo nadělá víc škody.

To se nedělá kvůli egu, ale protože po tobě může udržovat kód chlápek s motorovou pilou, co si zjistí tvou adresu...

Udělat kód co nejcitelnější je téměř vždy základní ohleduplnost k okolí.

Re:Recept na špagety - java vs. net
« Odpověď #36 kdy: 11. 10. 2017, 11:15:18 »
Škodu nadělá ten, kdo zhorší čitelnost kódu pro ostatní. Ať už jakýmkoliv způsobem. Čitelnost kódu má po každé úpravě minimálně zůstat, spíše se zlepšit. Není to žádná teorie, všichni vývojáři s tím bojují každý den.

Čitelnost je subjektivní metrika. Proto existují různé style guides, aby se lidé nemuseli hádat co je a co není čitelné. Lze automaticky kontrolovat i názvy proměnných, aby splňovaly určitá pravidla.

Délka kódu je objektivní metrika. Kratší kód by měl dostat přednost.

Že je něco objektivní znamená, že to umíš měřit. Ne že je to důležitější. (Tohle je jeden z nejtypičtějších omylů vůbec.)

dustin

Re:Recept na špagety - java vs. net
« Odpověď #37 kdy: 11. 10. 2017, 11:20:50 »
Délka kódu je objektivní metrika. Kratší kód by měl dostat přednost.

V žádném případě s takovým zjednodušením nesouhlasím.

gll

Re:Recept na špagety - java vs. net
« Odpověď #38 kdy: 11. 10. 2017, 12:24:31 »
Délka kódu je objektivní metrika. Kratší kód by měl dostat přednost.

V žádném případě s takovým zjednodušením nesouhlasím.

Jasně, je to zjednodušující, ale většinou to platí. Zbytečně dlouhý kód je IMHO častější problém. Upřednostňování kratšího kódu doporučuje většina autorů různých style guidů.

Citace
Maximize LOCNW lines of code not written.
Shorter is better and shortest is best.

-- Jim Meehan

https://www.cs.umd.edu/~nau/cmsc421/norvig-lisp-style.pdf

Kit

Re:Recept na špagety - java vs. net
« Odpověď #39 kdy: 11. 10. 2017, 13:07:52 »
vhodná jména jsou krátká. Stačí nepoužívat hvězdičkové importy. Nemusí mít každá věc unikátní jméno.

Vhodné jméno se musí brát včetně kompletního namespace. Pokud obsahuje pleonasmy, je to špatně a je to zdrojem budoucích problémů. Hvězdičkové importy už snad moderní IDE nedělají. Java bohužel neumí aliasy v importech, což občas svádí k těm nežádoucím unikátním názvům tříd.

dustin

Re:Recept na špagety - java vs. net
« Odpověď #40 kdy: 11. 10. 2017, 13:43:37 »
Zbytečně dlouhý kód je IMHO častější problém. Upřednostňování kratšího kódu ...

Taky nemluvím o zbytečně dlouhém kódu, ale o přehledném. A ten se určitě nedosáhne minimalizací LOC. Příklad - ve wicketu (ale i pythonovském remi) bývá v konstruktorech komponent hodně dlouhá lineární sekvence vytváření a přidávání subkomponent. Jednotlivé subkomponenty mívají více řádků kódu, často jich několik spolu úzce souvisí. Když takový lineární kód nerozsekám do řady vhodně pojmenovaných metod, je z toho dlouhá nepřehledná špageta. Více LOC.

Někdy i pouhé vytvoření a úvodní nastavení proměnné, které by šlo vyřešit jednořádkovým ternárním operátorem, strčím do extra metody s if/else, když potřebuji okomentovat důvody jednotlivých variant a na první pohled nejsou zřejmé. Opět více LOC. Občas se hodí strčit do vhodně pojmenované metody i jeden řádek, než jej v toku kódu popisovat komentářem. Často právě takové krátké metody bývají vhodnými kandidáty na přetížení potomky, až za pár měsíců přijdou další požadavky vzniklé na základě praktického používání stávající funkčnosti. Protože ty metodky řeší právě jednu věc, kterou je požadavek v potomkovi rozšířit. Každá metoda volaná jen z jednoho místa logicky prodlužuje kód. Jenže má jasně viditelné a dané vstupy a jasný výstup, narozdíl od bloku kódu špagety, ze kterého pochází.

K tomu je ale potřeba pořádný editor, který umí metody včetně typů a vhodných názvů vytahovat na jednu klávesovou zkratku, a ne to dělat cut/paste...

Takových případů se najde mraky. Je to o čitelnosti a snadnosti pochopení, ne o celkové délce.

Kit

Re:Recept na špagety - java vs. net
« Odpověď #41 kdy: 11. 10. 2017, 14:09:10 »
Zbytečně dlouhý kód je IMHO častější problém. Upřednostňování kratšího kódu ...

Taky nemluvím o zbytečně dlouhém kódu, ale o přehledném. A ten se určitě nedosáhne minimalizací LOC. Příklad - ve wicketu (ale i pythonovském remi) bývá v konstruktorech komponent hodně dlouhá lineární sekvence vytváření a přidávání subkomponent. Jednotlivé subkomponenty mívají více řádků kódu, často jich několik spolu úzce souvisí. Když takový lineární kód nerozsekám do řady vhodně pojmenovaných metod, je z toho dlouhá nepřehledná špageta. Více LOC.

Někdy i pouhé vytvoření a úvodní nastavení proměnné, které by šlo vyřešit jednořádkovým ternárním operátorem, strčím do extra metody s if/else, když potřebuji okomentovat důvody jednotlivých variant a na první pohled nejsou zřejmé. Opět více LOC. Občas se hodí strčit do vhodně pojmenované metody i jeden řádek, než jej v toku kódu popisovat komentářem. Často právě takové krátké metody bývají vhodnými kandidáty na přetížení potomky, až za pár měsíců přijdou další požadavky vzniklé na základě praktického používání stávající funkčnosti. Protože ty metodky řeší právě jednu věc, kterou je požadavek v potomkovi rozšířit. Každá metoda volaná jen z jednoho místa logicky prodlužuje kód. Jenže má jasně viditelné a dané vstupy a jasný výstup, narozdíl od bloku kódu špagety, ze kterého pochází.

K tomu je ale potřeba pořádný editor, který umí metody včetně typů a vhodných názvů vytahovat na jednu klávesovou zkratku, a ne to dělat cut/paste...

Takových případů se najde mraky. Je to o čitelnosti a snadnosti pochopení, ne o celkové délce.

Pokud dodržíš kritéria, která jsi napsal, zpravidla obdržíš kód, který je nejen čitelnější, ale i kratší.

Jednoduchým ukazatelem, ve kterých místech provést uvedené refaktorování, jsou prázdné řádky uvnitř metod. Zpravidla oddělují funkčí celky, které by měly být v samostatných metodách, nezřídka i v jiných třídách.

gll

Re:Recept na špagety - java vs. net
« Odpověď #42 kdy: 11. 10. 2017, 18:25:03 »
Zbytečně dlouhý kód je IMHO častější problém. Upřednostňování kratšího kódu ...

Taky nemluvím o zbytečně dlouhém kódu, ale o přehledném. A ten se určitě nedosáhne minimalizací LOC. Příklad - ve wicketu (ale i pythonovském remi) bývá v konstruktorech komponent hodně dlouhá lineární sekvence vytváření a přidávání subkomponent. Jednotlivé subkomponenty mívají více řádků kódu, často jich několik spolu úzce souvisí. Když takový lineární kód nerozsekám do řady vhodně pojmenovaných metod, je z toho dlouhá nepřehledná špageta. Více LOC.

Někdy i pouhé vytvoření a úvodní nastavení proměnné, které by šlo vyřešit jednořádkovým ternárním operátorem, strčím do extra metody s if/else, když potřebuji okomentovat důvody jednotlivých variant a na první pohled nejsou zřejmé. Opět více LOC. Občas se hodí strčit do vhodně pojmenované metody i jeden řádek, než jej v toku kódu popisovat komentářem. Často právě takové krátké metody bývají vhodnými kandidáty na přetížení potomky, až za pár měsíců přijdou další požadavky vzniklé na základě praktického používání stávající funkčnosti. Protože ty metodky řeší právě jednu věc, kterou je požadavek v potomkovi rozšířit. Každá metoda volaná jen z jednoho místa logicky prodlužuje kód. Jenže má jasně viditelné a dané vstupy a jasný výstup, narozdíl od bloku kódu špagety, ze kterého pochází.

K tomu je ale potřeba pořádný editor, který umí metody včetně typů a vhodných názvů vytahovat na jednu klávesovou zkratku, a ne to dělat cut/paste...

Takových případů se najde mraky. Je to o čitelnosti a snadnosti pochopení, ne o celkové délce.

Jasně, že se to nesmí brát doslovně. Proti krátkým funkcím/metodám nikdo nic nemá. Pokud něco opravdu dělají. Pokud se přidávají jen jako mezivrstva pro volání jiných funkcí, je to IMHO špatně.

dustin

Re:Recept na špagety - java vs. net
« Odpověď #43 kdy: 11. 10. 2017, 19:00:07 »
Nemusí dělat nic jiného, než že jen rozdělují kód do logicky souvisejících bloků a nějak je výstižně pojmenovávají (obvykle jedno slovo nestačí). I takové metody mají pro čitelnost a přehlednost význam.

Kit

Re:Recept na špagety - java vs. net
« Odpověď #44 kdy: 11. 10. 2017, 19:47:41 »
Nemusí dělat nic jiného, než že jen rozdělují kód do logicky souvisejících bloků a nějak je výstižně pojmenovávají (obvykle jedno slovo nestačí). I takové metody mají pro čitelnost a přehlednost význam.

Pokud nestačí jedno slovo v názvu metody, tak stojí za zvážení, zda třída splňuje SRP a zda není vhodné ji rozdělit.