Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - listoper

Stran: 1 ... 41 42 [43] 44 45 46
631
Vývoj / Re:Typový system versus unittesty
« kdy: 20. 08. 2018, 12:19:24 »
Kdyz bude mit funkce na vstupu iterator misto kolekce tak ten implementacni detail je tak trochu vynuceny v tom API, nemyslis?
Jenže se implementace tím API zbytečně omezuje a nemusí být optimální.
Podle me to prave pruznejsi. A optimalizaci prochazeni kolekce to nepotrebuje. Tu zajisti ten iterator.

Mam pocit, ze tohle uz taky neni tak uplne o unit testech, teda pokud nemam takovy test napsany na (skoro) kazdou funkci v cele aplikaci. Neco podobneho resil kolega tusim pomoci AOP a myslim, ze slo spis o performance testy nez o unit testy.
Je to pořád jednotkový test, nebo možná funkční test. Neřeší se výkon, ale to, že ta aplikace je za určité situace nepoužitelná nebo padá na chybu.
Unit test by podle me mel byt platfomne nezavisli.
Ale i tak:
BoneFlute uz tu popisoval jak to zaridit pri kompilaci na te 486.
Namitka byla pokud vim, ze 486 neni v dobe prekladu k dispozici.
Takze kdyz zjistim, ze mam pozadavek aby to bezelo na 486 tak si nejakou sezenu a zkusim to na ni zkompilovat.
Stejne jako u toho testu, ktery zkusim na nejake pustit.

632
Vývoj / Re:Typový system versus unittesty
« kdy: 20. 08. 2018, 11:37:17 »
Jakoze abych mel kompletni API tak potrebuju osetrit pripad ze mi kozel sezere procesor?
Víceméně. V tomhle případě to asi bude zbytečné řešit, protože bez procesoru nebude na čem ten kód spouštět. Ale jinak je to přesně ono – co všechno se má ještě zahrnout do definice API. Je jasné, že substr bude všichni volat s nezáporným indexem, a nebo je potřeba nadefinovat i to, jak se má chovat, když někdo použije záporný index? A co když ho někdo zavolá s délkou větší, než je dostupná délka řetězce? A co když někdo závisí i na tom, jak dlouho ta funkce trvá? Jsou to všechno stále méně a méně pravděpodobné věci. Ale to je přesně to, na co si BoneFlute na začátku stěžoval, že testy se píší jenom na ty pravděpodobnější chyby a méně pravděpodobné chyby se ignorují – do té doby, než se ukáže, že je to pravděpodobnější, než si někdo myslel. BoneFlute řešil, jak podchytit všechny případy – tedy i ty málo pravděpodobné, jako že kozel sežere procesor.
Myslim, ze BoneFlute bude spokojeny uz kdyz ten typovy system dokaze pokryt to co unit testy. Dokud neuvidim unit test na kozla pozirajiciho procesor tak bych tyhle pripady nechal stranou.

A optimalni zpusob iterace by mel prave spis zaridit ten iterator nez funkce co ho bude pouzivat. Protoze kdyz budu mit 1000 funkci iterujicich stejnou kolekci tak optimalizace bude potreba na 1000 mistech. S iteratorem jen na jednom...
Jenže to, že budete pro sčítání prvků iterovat přes jednotlivé prvky, je implementační detail. Ta sumace může být implementovaná i jinak.
Kdyz bude mit funkce na vstupu iterator misto kolekce tak ten implementacni detail je tak trochu vynuceny v tom API, nemyslis?

Tak kdy se teda ty testy budou na te skolakove 486 poustet?
Když se s tím bude počítat předem jako s prostředím, kde je potřeba to testovat, bude se to tam spouštět třeba v rámci buildu. Když se takový požadavek objeví až dodatečně, spustí se ty testy tehdy, až se ten požadavek objeví – a díky testům bude snazší zjistit, jestli to na té 486 bude fungovat a co případně opravit. S dokonalým typovým systémem byste tu 486 musel řešit, i když by nikdo neočekával, že se ta aplikace na 486 někdy bude spouštět.
Mam pocit, ze tohle uz taky neni tak uplne o unit testech, teda pokud nemam takovy test napsany na (skoro) kazdou funkci v cele aplikaci. Neco podobneho resil kolega tusim pomoci AOP a myslim, ze slo spis o performance testy nez o unit testy.

633
Vývoj / Re:Typový system versus unittesty
« kdy: 20. 08. 2018, 09:54:47 »
To ze se nekdo rozhodl, ze nebude formalizovat veskere pozadavky na funkci, a ze neco jen popise v dokumentaci, neni proto, ze by to neslo, ale proto ze se mu nechtelo.
Nikoli, je to proto, že to nejde. Abyste popsal opravdu vše, musel byste v důsledku popsat celý vesmír.
Jakoze abych mel kompletni API tak potrebuju osetrit pripad ze mi kozel sezere procesor?

BoneFluteovi se chce.
Ne, jemu se chce jenom teoretizovat. Kdyby se mu chtělo to opravdu popisovat, nemusí čekat na žádný formální jazyk a může začít tím, že funkci přesně naspecifikuje v jazyce českém.
Hmmm

Kdyz se zamyslim nad tim prikladem se sumaci tak mi prijde, ze to neni idealni. Tim rikam, ze bude ta funkce pracovat jen s nejakou linearni kolekci a dost se tim omezuji.
Je to příklad, který můžete potkat v praxi. Byl by celkem k ničemu dokonalý typový systém, ve kterém by se daly psát jen ideální programy, ale reálné programy nikoli.
Nechtel jsem primo rict, ze to smrdi tak jsem pouzil sugar coating "neni idealni"


Kdyby byl na vstupu misto toho iterator tak dosahnu vetsi znovupouzitelnosti. A jen tak mimochoddem ziskam to, ze smer iterace bude dany tim iteratorem a ne zakodovany v implementaci te sumy.
A nebo taky ne. Iterátor definuje pořadí, sečíst můžete ale i prvky, které žádné pořadí nemají. A může být výhodnější prvky sčítat jinak, než v pořadí určeném iterátorem. Navíc to, že směr iterace bude daný iterátorem, je nevýhoda – ty dva příklady se lišily tím, že v některých případech mohl být jeden přístup efektivnější než druhý, o čemž by měl vědět autor implementace té sumační funkce, ale vůbec to nemá zajímat jejího uživatele. To je právě součást API – že schovává implementační detaily.
No prave ze ten Iterator schova jeste vic implementacnich detailu. A muzu ho snad snadno napsat i pro "veci" co sami od sebe poradi nemaji. Efektivita scitani snad bude stejna pri obou smerech iterace. A optimalni zpusob iterace by mel prave spis zaridit ten iterator nez funkce co ho bude pouzivat. Protoze kdyz budu mit 1000 funkci iterujicich stejnou kolekci tak optimalizace bude potreba na 1000 mistech. S iteratorem jen na jednom...

By me zajimalo jestli v Turbo pascalu sli vubec napsat hodiny, nebo treba stopky...
Šly.
Asi si prehlidl ten odkaz. Byla to ironicka poznamka...

Takze az napisu tu hru a budu ji prodavat skolakum tak je slusne poprosim, aby mi na svem stroji napred pustili testy z diskety 2?
Chápete rozdíl mezi „prevencí“ a „až po té, co k chybě došlo“?
Tak kdy se teda ty testy budou na te skolakove 486 poustet?

634
Vývoj / Re:Typový system versus unittesty
« kdy: 20. 08. 2018, 08:31:46 »
A když se to spojí, tak máme ten hypotetický jazyk, který by dokázal nahradit testy v případech užití, které byly uváděny.
Uváděn byl příklad dvou funkcí pro sumaci. Nějak ho stále přehlížíte.

Obávám se, že to není nijak podstatné.

Byly časy, kdy API funkce (říkejme tomu spíše signatura) vypadala nějak takto:

function substr(String str, Int start, Int len) : String

A v praxi jsme pak museli ošetřit testem, co se stane, když zavoláme substr("abc", 6, -2). Někde uvnitř té funkce bylo definováno, že to má vyhodit výjimku, prázdný řetězec, nebo něco takového. Podstatné ale je, že signatura funkce o této nesmyslnosti nic nevěděla.

Dnes už máme typy na takové úrovni, že dokážeme zohlednit, že substr("abc", 6, -2) nepůjde vůbec přeložit. A myslím, že nikoho nijak zvlášť nezajímá, že kdysi dávno se tvrdilo, že ošetření těchto nesmyslných vstupů je otázka implementace, a nikoliv API/Signatury.

Takže pokud trváš na tom, že API/Signatura a implemnetace/chování jsou dva oddělené světy, tak já ti tvůj názor přeji, ale v takovém případě nám nejde o stejnou věc.
Ale já nepíšu o signatuře, píšu o API. A součástí API té funkce substr je, že někde v dokumentaci, např. v manuálové stránce, je napsáno, co ta funkce má dělat, a v lepším případě i jaké jsou možné parametry a co to bude dělat, pokud budou parametry mimo rozsah. V horším případě tam zejména ty chybové stavy moc dobře popsané nebudou , a pak nastává ten případ, o kterém jsem také psal, že se mohou lišit názory na to, jaké je vlastně přesné API té funkce.
To ze se nekdo rozhodl, ze nebude formalizovat veskere pozadavky na funkci, a ze neco jen popise v dokumentaci, neni proto, ze by to neslo, ale proto ze se mu nechtelo.
BoneFluteovi se chce.

Že API a implementace jsou dva oddělené světy jsem uváděl na tom příkladu se sumací, který raději ignorujete. Mimochodem, je to uváděné jako základní vlastnost API, že odstíní uživatele od konkrétní implementace, takže implementace se může měnit, aniž by se o tom uživatel dozvěděl. Znáte třeba POSIX?
Kdyz se zamyslim nad tim prikladem se sumaci tak mi prijde, ze to neni idealni. Tim rikam, ze bude ta funkce pracovat jen s nejakou linearni kolekci a dost se tim omezuji.
Kdyby byl na vstupu misto toho iterator tak dosahnu vetsi znovupouzitelnosti. A jen tak mimochoddem ziskam to, ze smer iterace bude dany tim iteratorem a ne zakodovany v implementaci te sumy.

Jak nemůže? Proč by nemohl? Ať je platforma jakákoliv, tak čas bude všude stejný ne? Této argumentaci nerozumím.
Nechcete doufám tvrdit, že stejný kód poběží stejně rychle na 386 a na dnešních výkonných procesorech? Že poběží stejně rychle na Raspberry Pi, na chytrém telefonu i na pracovní stanici?
By me zajimalo jestli v Turbo pascalu sli vubec napsat hodiny, nebo treba stopky...
http://computer-programming-forum.com/29-pascal/c1fd619ca94be881.htm

Jen si to představ. Vezmeš nějakou hru a dáš ji přeložit pod 486kou, a ono ti to odmítne, protože nejde zaručit potřebnou rychlost. Horní mez je sranda, to stačí jen oříznout.

Tak samozřejmě se můžeme bavit o tom, jak to zjistit, jak moc to jde zaručit, ale je třeba myslet na kontext tohoto vlákna. Porovnáváme to s testy. Pokud to nezvládneš ani testy, tak není nutné řešit jak to udělat typy.
Jak přeložit pod 486? Vy jí máte k dispozici? A máte k dispozici i budoucí procesory? Navíc rychlost té funkce by přece musela být zakódovaná v tom typu.

Testy se tohle řeší snadno. Napíše se test, který bude měřit dobu běhu té funkce a zkontroluje, že je v daném rozmezí. Že ten test odhalí chybu, až když ho spustím na příslušném zařízení? Ano, to je vlastností testů, že nejsou prevencí chyb, ale umožňují chyby rychle nalézat po té, co k chybě došlo.
Takze az napisu tu hru a budu ji prodavat skolakum tak je slusne poprosim, aby mi na svem stroji napred pustili testy z diskety 2?

Že testy nepokrývají všechny případy? Ano, i to je vlastností testů, a to umožňuje, aby se testy vůbec v reálném světě používaly. Protože programování je stále založené na tom, že se vybírají ty podstatné věci, které se vyjádří v programu, a všechny ostatní nepodstatné se ignorují. Takže se třeba v definici API ignorují záporné hodnoty indexu funkce substr, protože přece nikdo soudný nebude předávat záporný index.
Co kdyz se si zvykl na negativni indexovani v pythonu? Nejsem soudny?

635
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 08. 2018, 18:24:45 »
... ale některé závazky API prostě nijak formálně vyjádřit nelze. A proto ani nelze automaticky zjistit, jestli změna implementace změnila nebo nezměnila API.

A muzes teda uvest priklad zavazku, ktery formalne vyjadrit nelze?

636
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 08. 2018, 17:27:19 »
To není předpoklad, to je definice API.
Je to Jiraskova definice? Nebo muzes postnout nejaky odkaz?
Klidně můžu postnout odkaz. API. Nebo vám to můžu i rovnou napsat. „API“ je zkratka pro „Application programming interface“. „Interface“ je „rozhraní“, vrstva mezi implementací a volajícím kódem, která zajišťuje jejich částečné oddělení, určitou abstrakci implementace.

Podle toho co sem si tam precetl tak API je velice nevhodny termin pro to co tim tady nazyvame.
Tam se mluvi o systemech a aplikacich. My resime jednotlive funkce (aspon doufam).

Mozna pro nas ucel je lepsi pouzivat slovo podpis?

637
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 08. 2018, 15:48:07 »
Ty vycházíš z předpokladu, že API a implementace jsou od sebe rozdílné.
To není předpoklad, to je definice API.
Je to Jiraskova definice? Nebo muzes postnout nejaky odkaz?

638
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 08. 2018, 16:52:15 »
A už po několikáté se vám snažím vysvětlit, že ne každá nekompatibilní změna implementace znamená i nekompatibilní změnu API.
A ja uz se po nekolikate snazim rict, ze to nemusi byt pravda. Kdyz budu mit vhodny typovy system a budu chtit, tak muzu zaridit aby kazda nekompatibilni zmena implementace nutne znamenala zmenu API.

Pokud taková změna, která nezpůsobuje nekompatibilní změnu API, vyvolá konflikt (chybu překladu v extra silném typovém systému, selhání testu u slabších typových systémů), je to špatně. Protože pak bude muset programátor neustále řešit tyhle neexistující chyby, bude to dělat automaticky a udělá to i tehdy, když změna vyvolá nekompatibilní změnu API.
Chyba kompilace mi neprijde jako neexistujici chyba.

Mimochodem, to, jestli daná změna je nebo není nekompatibilní změnou API, je v mnoha případech věcí názoru. Takže to opravdu žádný typový systém nevyřeší, protože dva typy nemohou být navzájem kompatibilní u jednoho programátora, a nekompatibilní u jiného, který na to má jiný názor.
To rekne kompilator co je kompatibilni a co je nekompatibilni. To nemuze byt vec nazoru.

639
Vývoj / Re:Typový system versus unittesty
« kdy: 17. 08. 2018, 21:59:09 »
Jak už jsem několikrát psal, naposledy v komentáři, na který reagujete, ne každá nekompatibilní změna algoritmu je nekompatibilní i z hlediska API.
A to prave nemusi byt pravda.
Asi jste můj komentář špatně přečetl. Psal jsem, že existují takové nekompatibilní změny implementace, které nemění API. Tvrzení o existenci se vyvrací tvrzením, že neexistuje žádný takový případ. Tedy žádné „nemusí“, ale „nemůže existovat“.

Nezapomínejte na to, že definice API nemusí být jenom to, co je v kódu, ale mohou to být další podmínky nebo omezení popsané třeba v dokumentaci. A tu si žádný kompilátor nepřečte.

Ja nechci vyvracet to tvrzeni, ze takove zmeny existuji. To je samozrejme, jelikoz existuji jazyky se slabym typovym systemem.
Ja se snazim jenom rict, ze kdyz budu mit silny typovy system tam muzu napsat funkci tak, ze kazda nekompatibilni zmena nutne zmeni API.




640
Vývoj / Re:Typový system versus unittesty
« kdy: 17. 08. 2018, 21:35:50 »
Jen doplním, že ten Elm si zjistí, zda došlo k nekompatabilní změně algoritmu, a tuto změnu propíše do API jako tu major verzi.
Jak už jsem několikrát psal, naposledy v komentáři, na který reagujete, ne každá nekompatibilní změna algoritmu je nekompatibilní i z hlediska API.
A to prave nemusi byt pravda.

641
Vývoj / Re:Typový system versus unittesty
« kdy: 17. 08. 2018, 20:33:04 »
Pro jistotu ještě explicitně uvedu, že „nemění používané API“ neznamená, že se nijak nezmění chování té funkce navenek. Např. pokud se ta funkce používala jen pro vstupní hodnoty 1–10, když se změní výsledek, který vrací pro 11, není to změna používaného API.
Pokud je vstupni typ funkce integer 1 - 10 tak aby zacala vracet i pro 11 budu muset zmenit typ vstupu. Takze API.

642
Vývoj / Re:Typový system versus unittesty
« kdy: 17. 08. 2018, 19:32:05 »
Kdyz bude funkce ochranena typem tam nepujde ohnout aniz by se zmenil ten typ a tudiz kompilator stejne zarve protoze tam kde ji volam ja bude typ nekompatibilni.
Nechápu, proč to píšete jako reakci na můj komentář, když jste jen znovu napsal to, na co jsem já reagoval. Já jsem psal o opačném případu, kdy používané API funkce zůstane stejné, ale implementace se změní (což nemusí nutně znamenat, že nová implementace bude ekvivalentní té původní – nesmí se změnit API, ale vlastnosti, na kterých nic nezávisí, se změnit mohou).

Mozna proto, ze ten typovy system muze zajistit, ze (breaking) zmena  implementace nepujde udelat beze zmeny API?

643
Vývoj / Re:Typový system versus unittesty
« kdy: 17. 08. 2018, 17:01:50 »
Například jazyk Elm by toto mohl dát. Jakmile někdo vezme funkci, a ohne si ji, tak se změní major verze té funkce a už nepůjde napasovat, a celé to nepůjde zkompilovat. Což je IMHO právě ta ochrana (ochrana rozhodně užitečná), o které mluvíš.
Při popisu toho, proč se používají testy, jste popsal jenom jednu možnou změnu. Druhá možná změna je, že někdo vezme funkci, zachová její API na kterém závisí ostatní a které testují testy, ale upraví její implementaci (např. funkci optimalizuje). Užitečnost ochrany testy spočívá i v tom, že testy dále úspěšně procházejí, přestože se implementace změnila. Testy nejsou určené k tomu, aby nacházely změny, ale aby nacházely takové změny, které něco rozbijí.

Ale ne. On ma BoneFlute zase pravdu. Uz mi to doslo.
Kdyz bude funkce ochranena typem tam nepujde ohnout aniz by se zmenil ten typ a tudiz kompilator stejne zarve protoze tam kde ji volam ja bude typ nekompatibilni.

644
Vývoj / Re:Typový system versus unittesty
« kdy: 17. 08. 2018, 15:24:52 »
Nedavno jsem zmenil projekt a po trech mesicich na tom novem mi doslo k cemu vlastne jsou unit testy a vzpomel sem si na tohle vlakno. Rikal jsem si, ze ho doplnim.
Tak pro me je hlavni duvod proc pisu unit testy:
"Ochrana meho kodu pred neuvazenymi zmenami ostatnich"

Kdekdo mi hrabe do "mych" funkci a ohyba si je pro svuj use case a je mu jedno, ze tim rozbije ten muj.
Kdyz nenapisu testy tak mi pristanou defekty a ja budu slozite hledat kde,kdo a co rozbil.

Kdyz testy mam tak "ohybac" musi zmenit i ty testy aby prosel build a tim padem se snad lepe zamysli.
A kdyz se nezamysli (jako treba ze cele vnitrky testu zakomentuje) tak mam aspon dukazy jakej to je lempl...

Myslim, ze tohle typovy system nedokaze podchytit.

645
Podle me ty eFormulare maji stejne kopyto. V nekterych mozna bude ten script ktery definuje vucInit pribaleny, v nekterych ne, protoze neni vzdy potreba.
To muze byt jeden z duvodu proc se to volani obaluje kontrolou existence.
V tomoto pripade proste neni pribaleno, protoze neni potreba.

Stran: 1 ... 41 42 [43] 44 45 46