Dvě podmínky ve while

Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Dvě podmínky ve while
« Odpověď #105 kdy: 02. 09. 2015, 15:32:05 »
Pořád řešíte počet řádků funkce, ale to není moc dobrá metrika. Mnohem lepší je cyklomatická složitost funkce.

Když budu mít 1000 řádkovou funkci s cyklomatickou složitostí 1, tak ji můžu rozdělit do 100 fukcí po 10 řádcích, ale jejich cyklomatická složitost bude pořád 1. Mentální kapacita nutná k pochopení jedné funkce s 1000 řádky nebo 100 funkcí s 10 řádky je pořád stejná. Nic moc tím rozdělením neziskám.

Když budu mít 1000 řádkovou funci s cyklomatickou složitostí 100, tak vím, že je to opravdu blbě. Tohle nikdo nikdy nepochopí (ani autor). Tady je jediná cesta, rozdělit to do více malých funkcí s malou cyklomatickou složitostí.

Hááálelůja, přesně tak, jenom ještě doplním, že i tu jednoduchou 1000 řádkovou funkci může (a nemusí ) být vhodné rozdělit kvůli opakujícím se částem kódu, záleží na situaci a na "zdravém selském rozumu", nikoliv na 20-ti řádkové poučce.


Kit

Re:Dvě podmínky ve while
« Odpověď #106 kdy: 02. 09. 2015, 15:52:43 »
A co v případě, že už mám funkce na získání potřebných dat k dispozici (např. pokud tvořím modul) a potřebuji pouze různá data vzít, poskládat a vrátit výsledek? Mám si je skládat po 20 ti řádcích na funkci do jednoho public array, nebo si mám data rozdělit do několika arrays, ty potom sloučit a vrátit, nebo si mám array naskládat v jednom řádku s délkou několik set až tisíc znaků a s použitím zkrácených ifů, nebo si mám znovu napsat již existující systémové funkce nějak jinak, nebo si mám udělat jednu funkci getDataParts, která bude mít sice třeba 100 řádků a na konci return, ale hlavní funkce getData už bude mít "jenom" $cosi=getDataParts a return, nebo rovnou udělat jednu 100 řádkovou funkci s jedním returnem?

Dlouhé řádky ti nepomohou, když máš soft limit na 65 znacích jako já :-)

Základem je kvalitní dekompozice aplikace. Určitě nemáš sekvenci 200 příkazů, které by nebyly nějak grupovány do podmíněných bloků či cyklů. Vnořené cykly jsou nejviditelnějšími objekty pro refaktorování. Nebývá mnoho důvodů dva vnořené cykly nechávat v jedné funkci.

Stejně tak vnořené switche, tolik typické pro konečné automaty, se dají logicky rozdělit do dvou vrstev, kdy vrchní vrstva podle hodnoty stavu volá funkci druhé vrstvy a předá jí vstupní symbol. Druhá vrstva ten symbol zpracuje a do první vrstvy vrátí returnem hodnotu nového stavu. Každý stav tak má svoji vlastní funkci. Úplně stejně jak máš ten automat rozkreslený na papíře.

Konečný automat se skutečně dá efektně i efektivně řešit na nějaké datové struktuře - nejlépe na kolekci objektů. A není to pomalé - zkus si to změřit. Dokonce to bývá rychlejší než vnořené switche, zejména u nenumerických klíčů. Místo sekvenčního porovnávání jednotlivých case se totiž používá vektor pointerů.

Pokud tedy budeš refaktorovat funkci o 200 řádcích, určitě to nedělej horizontálně, ale vertikálně. Klidně i do tří nebo více vrstev. Každý vnořený scope je kandidátem na nižší vrstvu. Dokonce i dvacetiřádkové funkce se dají rozvrstvit až na jednotlivé řádky, ale v rámci zachování zdravého rozumu je dobré se zastavit právě u těch 5-20 řádků, které by se už dále členit moc neměly, protože pak už se čitelnost nezvyšuje, ale opět snižuje.

Nemusíš se bát, že se tím program nějak zpomalí. Když se podíváš pod pokličku dnešních kompilátorů, tak zjistíš, že jejich optimalizátory často rozbalují volání drobných funkcí tak, jako kdyby to byla makra. Typicky gettery/settery nahrazují přímým přístupem k proměnné, přístupová práva řeší už v době překladu.

Kit

Re:Dvě podmínky ve while
« Odpověď #107 kdy: 02. 09. 2015, 15:58:23 »
A proč jsem to sem dával? Protože pořád řešíte velikost switche a aerospace coding standards, které lze považovat za nejvíce restriktivní, ji v podstatě neomezují.

Aerospace coding standards však zcela jistě řeší cykly uvnitř switchů a switche uvnitř cyklů stejně jako switch uvnitř switche, podmínku uvnitř podmínky a cyklus uvnitř cyklu. To jsou prostě kandidáti na rozdělení do vrstev.

k

Re:Dvě podmínky ve while
« Odpověď #108 kdy: 02. 09. 2015, 16:34:33 »
Dlouhé řádky ti nepomohou, když máš soft limit na 65 znacích jako já :-)

Máš k tomu nějaký kruciální důkaz jako zmíněná cyklomatická složitost, nebo je to zase jenom cargo cult z VT100 nebo VGA? :)
Abychom se nezdržovali, tak na standardním LCD za $100 je vidět 50x200 znaků kódu najednou, po odpočtení ostatních oken a menu.

Kit

Re:Dvě podmínky ve while
« Odpověď #109 kdy: 02. 09. 2015, 17:30:58 »
Dlouhé řádky ti nepomohou, když máš soft limit na 65 znacích jako já :-)

Máš k tomu nějaký kruciální důkaz jako zmíněná cyklomatická složitost, nebo je to zase jenom cargo cult z VT100 nebo VGA? :)
Abychom se nezdržovali, tak na standardním LCD za $100 je vidět 50x200 znaků kódu najednou, po odpočtení ostatních oken a menu.

Na svém LCD monitoru s rozlišením 1280×1024 vidím v editoru 40 řádek a na každém z nich 115 znaků. Když však kus programu pošlu do nějakého fóra, tak těch max 65 znaků na řádek je tak akorát na to, aby se vešel mezi ty pruhy reklam po stranách. Máš snad nějaký pádný důvod k tomu, aby ty řádky byly delší než 65 znaků? Dlouhé řádky mi prostě vadí při čtení - při jejich správném zalomení to vypadá mnohem lépe, lépe se mi s nimi pracuje a přitom mě nijak neomezují.

Pokud je 300znakový příkaz správně zalomen třeba do 6 řádek, klidně mu mohu přidat dalších 100 znaků aniž bych nějak ohrozil jeho čitelnost. Pouze se mi zápis funkce či metody prodlouží o 2-3 řádky. Pokud tu nudli nacpeš na jeden 400znakový řádek ... Už jsi někdy pročítal diff takových zdrojáků?

Co máš pořád s tím kargo kultem? Evidentně vůbec netušíš, co to je. Nebo si snad myslíš, že se celý den modlím, aby mi někdo přivezl lepší monitor nebo aby někdo opravil chybu či omezení v nějakém oblíbeném frameworku?


v

Re:Dvě podmínky ve while
« Odpověď #110 kdy: 02. 09. 2015, 17:46:33 »
Dlouhé řádky ti nepomohou, když máš soft limit na 65 znacích jako já :-)

Máš k tomu nějaký kruciální důkaz jako zmíněná cyklomatická složitost, nebo je to zase jenom cargo cult z VT100 nebo VGA? :)
Abychom se nezdržovali, tak na standardním LCD za $100 je vidět 50x200 znaků kódu najednou, po odpočtení ostatních oken a menu.

Na svém LCD monitoru s rozlišením 1280×1024 vidím v editoru 40 řádek a na každém z nich 115 znaků. Když však kus programu pošlu do nějakého fóra, tak těch max 65 znaků na řádek je tak akorát na to, aby se vešel mezi ty pruhy reklam po stranách. Máš snad nějaký pádný důvod k tomu, aby ty řádky byly delší než 65 znaků? Dlouhé řádky mi prostě vadí při čtení - při jejich správném zalomení to vypadá mnohem lépe, lépe se mi s nimi pracuje a přitom mě nijak neomezují.

Pokud je 300znakový příkaz správně zalomen třeba do 6 řádek, klidně mu mohu přidat dalších 100 znaků aniž bych nějak ohrozil jeho čitelnost. Pouze se mi zápis funkce či metody prodlouží o 2-3 řádky. Pokud tu nudli nacpeš na jeden 400znakový řádek ... Už jsi někdy pročítal diff takových zdrojáků?

Co máš pořád s tím kargo kultem? Evidentně vůbec netušíš, co to je. Nebo si snad myslíš, že se celý den modlím, aby mi někdo přivezl lepší monitor nebo aby někdo opravil chybu či omezení v nějakém oblíbeném frameworku?

https://en.wikipedia.org/wiki/Cargo_cult_programming

"applying a design pattern or coding style blindly without understanding the reasons behind that design principle"

IMHO celkem sedí, viz fiasko s return ze switche

gamer

Re:Dvě podmínky ve while
« Odpověď #111 kdy: 02. 09. 2015, 17:56:17 »
Aerospace coding standards však zcela jistě řeší cykly uvnitř switchů a switche uvnitř cyklů stejně jako switch uvnitř switche, podmínku uvnitř podmínky a cyklus uvnitř cyklu. To jsou prostě kandidáti na rozdělení do vrstev.

Ne tohle se tam opravdu neřeší, přečti se ten coding standard. Ale řeší se tam maximální délka řádku a maximální délka funkce:
Kód: [Vybrat]
Source lines will be kept to a length of 120 characters or less.
Any one function (or method) will contain no more than 200 logical source lines of code (L-SLOCs).
Samozřejmě to nelze považovat za dogma, tahle si to prostě nastavili. Nicméně je to asi přes limity tvého monitoru  ;)

Kit

Re:Dvě podmínky ve while
« Odpověď #112 kdy: 02. 09. 2015, 18:02:08 »
https://en.wikipedia.org/wiki/Cargo_cult_programming
"applying a design pattern or coding style blindly without understanding the reasons behind that design principle"
IMHO celkem sedí, viz fiasko s return ze switche

Zkus někdy jako referenční materiál použít něco jiného než Wikipedii. Ano, mají to tam blbě a také jsi to blbě pochopil.

Přečti si nejprve něco o skutečném kargo kultu a jeho letištích, proč to vzniklo a proč se jim piloti musí vyhýbat. Pak možná pochopíš, že v programování to znamená spoléhat se na "vyšší inteligenci", která nám přináší nové postupy, nové kompilátory, nové knihovny i nové frameworky. A když nám něco z toho nefunguje, tak se dovoláváme toho, aby to někdo spravil.

Jak vidíš, s VT100 to vůbec nesouvisí a s nějakým omezením 65 znaků/řádek, 20 řádek/funkci nebo 65 řádek/třídu také ne. Totéž s likvidací klíčových slov break i else. Prostě jsem si stanovil jasná, porušitelná, užitečná a pro mne krásná pravidla, která mi vyhovují. K nikomu se nemodlím, nikoho slepě nekopíruji. Není to tedy kargo kult.

k

Re:Dvě podmínky ve while
« Odpověď #113 kdy: 02. 09. 2015, 18:15:41 »
Na svém LCD monitoru s rozlišením 1280×1024 vidím v editoru 40 řádek a na každém z nich 115 znaků. Když však kus programu pošlu do nějakého fóra, tak těch max 65 znaků na řádek je tak akorát na to, aby se vešel mezi ty pruhy reklam po stranách. Máš snad nějaký pádný důvod k tomu, aby ty řádky byly delší než 65 znaků? Dlouhé řádky mi prostě vadí při čtení - při jejich správném zalomení to vypadá mnohem lépe, lépe se mi s nimi pracuje a přitom mě nijak neomezují.

No tak to máš zastaralý monitor, dnes máme standard FullHD od $100 a mnoho programátorů má takové dva nebo jeden větší. Jednou za deset let se standard o něco zvětší, začínalo se na pouhých 640*480, možná i méně. Argument postování do fór je zcela mimo mísu. Zalomení na 65 nepřekvapivě způsobí menší přehlednost, způsobí zbytečnou nutnost scrolovat. Dle selského rozumu by dnes bylo zalamování někde na 150-200 znacích.

k

Re:Dvě podmínky ve while
« Odpověď #114 kdy: 02. 09. 2015, 18:17:50 »
Jak vidíš, s VT100 to vůbec nesouvisí a s nějakým omezením 65 znaků/řádek, 20 řádek/funkci nebo 65 řádek/třídu také ne.

Limit 20 řádků zcela jasně pochází jako cargo cult z VT100, to jsme si tady dneska dokázali.
Odkud se vzalo číslo 65 ještě nevím, ale určitě to bude něco podobného.

Kit

Re:Dvě podmínky ve while
« Odpověď #115 kdy: 02. 09. 2015, 18:18:43 »
Kód: [Vybrat]
Source lines will be kept to a length of 120 characters or less.
Any one function (or method) will contain no more than 200 logical source lines of code (L-SLOCs).
Samozřejmě to nelze považovat za dogma, tahle si to prostě nastavili. Nicméně je to asi přes limity tvého monitoru  ;)

Tato pravidla mi nevyhovují, protože jsou příliš volná. Má vlastní pravidla jim vyhovují, proto nedělám žádnou chybu, když používám svá (mnohem přísnější) pravidla. Nedělám to z důvodu sebemrskačství, ale proto, abych se ve svých programech vyznal i po mnoha létech a nemusel v nich mít jediný komentář.

Takové stavební bloky se také mnohem snáze recyklují nebo sdílejí ve společných knihovnách. Samozřejmou podmínkou je dodržování OCP, jinak by se mi taková knihovna velmi brzy rozsypala.

U interpretovaných jazyků to přináší další podstatné výhody: 65řádkový modul je v PHP zkompilován mnohem rychleji než 500řádkový. Pokud má aplikace např. 10000 řádek a při každém webovém dotazu potřebuje výběr 5-10 takových modulů, je běh takové správně rozvrstvené aplikace mnohem rychlejší. A to si nevymýšlím, mám to změřeno na produkčních serverech.

PHP není pomalé, jsou jen nešikovní programátoři, kteří to s ním neumí a pletou si ho s C.

Kit

Re:Dvě podmínky ve while
« Odpověď #116 kdy: 02. 09. 2015, 18:26:01 »
No tak to máš zastaralý monitor, dnes máme standard FullHD od $100 a mnoho programátorů má takové dva nebo jeden větší. Jednou za deset let se standard o něco zvětší, začínalo se na pouhých 640*480, možná i méně. Argument postování do fór je zcela mimo mísu. Zalomení na 65 nepřekvapivě způsobí menší přehlednost, způsobí zbytečnou nutnost scrolovat. Dle selského rozumu by dnes bylo zalamování někde na 150-200 znacích.

Nepotřebuji se při práci koukat na filmy. Kdybych měl FullHD, opět bych měl v editoru 40 řádek a asi 135 sloupců.

Jaké scrollování máš na mysli? Horizontální scrollování prostě nesnáším. Ani při zalamování příkazů na 65 znaků nemám bloky delší než ti, kteří zalamují až na 150. pozici. Na řádky to vychází nastejno, navíc ušetřím na šířku. Jsem na tom tedy mnohem lépe.

Kit

Re:Dvě podmínky ve while
« Odpověď #117 kdy: 02. 09. 2015, 18:52:31 »
Odkud se vzalo číslo 65 ještě nevím, ale určitě to bude něco podobného.

To je z českých typografických norem, ale to asi také neznáš.

Tomas Roll

Re:Dvě podmínky ve while
« Odpověď #118 kdy: 02. 09. 2015, 19:59:10 »
65 je normovaný počet úhozů na stránku u psacího stroje standardní velikost (ne perličky).

Kit

Re:Dvě podmínky ve while
« Odpověď #119 kdy: 02. 09. 2015, 20:37:26 »
65 je normovaný počet úhozů na stránku u psacího stroje standardní velikost (ne perličky).

Používá tady snad někdo perličku? Já tedy ne. Na 19" monitoru se mi osvědčilo 14bodové písmo.