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 - Filip Jirsák

Stran: 1 ... 213 214 [215] 216 217 ... 375
3211
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 17:14:26 »
Když tu tak čtu tu diskusi (a některým věcem nerozumím), tak mě napadá, že by asi šlo testy nahradit nějakým typovým systémem, ale jeho složitost by byla extrémní. Z praktického hlediska testy vyměňují obecnost (kategorie) či případnou složitost typového systému za svoji neúplnost (testování diskrétních hodnot) - diskrétní hodnoty by musely být nahrazeny mnoha specifickými třídami vedoucími na výraznou složitost typového systému. Uvažuju správně?
Nešlo by takto nahradit ani zdaleka všechny testy. Vycházíte z toho, že test pokryje jenom některé možné vstupy, a nějakým typovým systémem byste omezil typy tak, aby byly možné jenom ty vstupy, které dávají správné výstupy. Jenomže tím se dostáváte do cyklu, protože to, zda jsou výstupy správné, není vlastností toho typového systému, ale je to arbitrární vlastnost – něco, co tomu přisuzujeme z venku. A k tomu právě slouží ty testy, abychom ověřili, že implementace (libovolná, klidně jako „typový systém“) odpovídá těm námi stanoveným pravidlům.

Jinak řečeno – o nějakém algoritmu ani typu nelze říci, zda je nebo není správně (sám o sobě). Jestli je nebo není správně závisí na tom, k čemu ho chceme použít. A to právě dělají testy – dají dohromady implementaci (algoritmus) a způsob použití a testují, zda daný algoritmus je správný pro daný způsob použití.

Typový systém nás může omezit, abychom něco nemohli použít způsobem, který pravděpodobně nikdy nebude správně. Ale už nás nemůže omezovat ve způsobu použití, který někdy správně je ale jindy správně není.

3212
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 15:36:36 »
Limit typů jsou časová náročnost. Limit testů zase neúplnost. Dokážete si někdo představit, že by se dal uělat nějaký kompromis, omezit ultimátnost typů, aby to otestování proběhlo v kontrolovaném čase. Nebo optimalizovat compiler, aby si dokázal domyslet některé věci a nepočítal to hrubou silou?
Samozřejmě si představuju spíš otázku konfigurace, kdy při vývoji budu mět méně striktní režim, a pak při buildu dám kompilovat třeba tejden.
Problém je, že hodně zjednodušujete, a pak vyvozujete něco z nepřesností toho zjednodušení. Protože problém neúplnosti testů znamená, že mohou existovat vstupy, pro které dává testovaná jednotka chybný výsledek – přičemž taková kombinace není pokrytá testem. To je ale úplně jiná neúplnost, než „úplnost“ typů.

Formální dokazatelnost má smysl řešit u jednoduchých a kritických úloh typu zabezpečovací zařízení na železnici. U komplexních systémů typu ERP, bankovní systémy, webové prohlížeče apod. nemá vůbec smysl řešit rychlost případného kompilátoru, protože to je ten nejmenší problém – skutečný problém je v tom, že nikdo tak komplexní systém nedokáže správně formálně vyjádřit.

3213
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 15:27:42 »
tak zrovna to sčítání řeší
„To sčítání“ možná řeší. Ale to je nějaký váš problém, který tu neřešíme. My tu řešíme problém, že programátor měl použít sčítání a použil odčítání. Tohle neřeší žádný typový systém (tedy kromě takového, který odčítání vůbec nedovolí, což ale bude pro většinu programů nepoužitelné).

3214
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 15:08:31 »
co si vlastně představujete pod pojmem "silný typový systém"? já přinejmenším ten implementovaný v GHC
Pro účely této diskuse si pod tím představuji ten nejsilnější teoreticky možný typový systém. Podstatou této diskuse je totiž to, že velká část problémů, které jsou podchycené jednotkovými testy, není řešitelná žádnými formálními mechanismy – protože formálně jsou přípustní všechny možnosti, ale pro řešení daného problému je přípustná jen jedna možnost.

3215
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 14:50:43 »
Proč @v dokázal pochopit, že se táži na limity toho typového systému vůči unittestům, zatímco jiní se mě pokouší přesvědčit že jsem idiot a ani nejsou schopni uvést zajímavé argumenty?
Vy jste se na nic netázal, vy jste konstatoval, že jednotkové testy nejsou při použití kvalitního typového systému potřeba (protože typový systém zajistí to, co jinak zajišťují jednotkové testy). Což není pravda, jak už zde bylo opakovaně dokázáno. Akorát to někteří nechápou a neustále navrhují různé typové systémy, které ovšem neodhalí chybu, která zde byla několikrát uvedena jako příklad, a kterou jednotkový test odhalí.

Pokud se příště budete chtít na něco dotázat, doporučuji zeptat se na to a ne tvrdit zjevný nesmysl.

3216
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 14:18:41 »
já jsem ale o opakování implementace nic nepsal, pokud špatně pochopíte problém, můžete napsat test, který od funkce chce pro zadané vstupy jiné výstupy, než ty správné (z hlediska řešeného problému)
To je možné, ale je to spíše výjimečné. Daleko častější je případ, kdy ví správně, jaký výstup má být pro daný vstup, ale špatně to implementuje. Jednotkové testy řeší tenhle případ, a to silným typovým systémem nejde nahradit.

3217
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 13:32:45 »
tak když někdo špatně pochopí problém, tak mu taky nic nezabrání napsat chybný test
To je ale nepochopení testů. Testy nemají opakovat implementaci, testy mají kontrolovat, zda pro zadaný vstup dostanu očekávaný výstup.

Nikdo netvrdil, že testy jsou dokonalé a že nemůže být chyba i v testu. Pouze vyvracíme tvrzení, že jednotkové testy lze plně nahradit silným typovým systémem. Vyvráceno to bylo triviálním příkladem, kdy programátor použije odčítání místo sčítání, a tomu žádný typový systém z logiky věci nemůže zabránit.

3218
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 13:27:46 »
s použitím techniky o které jsem mluvil by se takový kód nepřeložil, že má třeba 1 a 2 jiný datový typ není nic až tak zvláštního
Jak zabráníte tomu, aby programátor nepoužil špatný typ? Místo typu pro „sčítání“ použije typ pro „odčítání“.

3219
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 13:25:01 »
používá to peanovu aritmetiku na typové úrovni pro vynucení vlastností operací s vektorama (ve smyslu datové struktury), např. tahle funkce je vlastně to stejné jako sčítání:
append :: Vector a n -> Vector a m -> Vector a (n :+ m)
délka výsledného vektoru je součet délek vstupních vektorů (a typový systém to opravdu na implementaci vynutí)
Stále se míjíte s podstatou problému. V mém příkladu bylo záměrně sčítání a odčítání. Abyste si uvědomil, že v běžném programu budu potřebovat obojí, a žádný typový systém neohlídá to, že nepoužiju odčítání tam, kde z logiky věci má být sčítání.

3220
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 12:25:02 »
V tom případě by to asi chtělo ten příklad rozvést a ukázat, jak je zabráněné tomu, abych místo typu „n-tý následník„ použil typ „n-tý předchůdce“, nebo „n-tý následník“ s -n místo n.

Konkrétně už tu byl uveden tento slabě typový pseudokód:
Kód: [Vybrat]
int add(int a, int b) {
  return a + b;
}

int sub(int a, int b) {
  return a - b;
}

Jak by vypadal tentýž kód, který by pomocí silnějších typů zabránil tomu, aby někdo místo sčítání použil odčítání?

Podle mne je tedy nesmyslné vůbec se pokoušet nějaké takové typy vytvořit, protože to, jestli se má použít sčítání nebo odčítání, je vlastností řešené domény – tudíž musí programátor pochopit řešený problém, uvědomit si, zda použije sčítání nebo odčítání (případně něco úplně jiného), a pak použije vhodné prostředky programovacího jazyka. Tohle za programátora nevyřeší žádný typový systém, protože kompilátor neví nic o tom, zda se má např. částka přičíst nebo odečíst, když firma zaplatí fakturu.

3221
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 11:42:18 »
myslím, že žádný takový předpoklad tam není
má to být náhrada, dá se předpokládat, že i s některými vlastnostmi původního řešení
Jednotkové testy se používají pro odhalení určitého typu chyb. Náhrada by musela alespoň odhalit stejný typ chyb, jinak to není náhrada.

původní dotaz se zabývá tím (moje interpretace), jestli se testy dají teoreticky nahradit typovým systémem a já si vzhledem k tomu co jsem o tématu četl, myslím, že ano, dále mě zajímají praktické limity tohoto přístupu, protože z vlastní praxe ho považuju za extrémně užitečný
A mohl byste tedy uvést konkrétní příklad? Zatím tady máme opakovaně příklad, kdy programátor omylem místo sčítání použije odčítání. Triviální jednotkový test takovou chybu odhalí. A zatím tady nebyl uveden žádný příklad typového systému, který by takové chybě zabránil. Viděli jsme jen příklady, že je možné operátor sčítání nahradit typem „výsledek součtu“, což ale neřeší ten problém, protože stejně, jako může programátor použít špatný operátor, může použít špatný typ.

Aby bylo jasno, já souhlasím s tím, že silnější typový systém znamená, že není potřeba psát některé jednotkové testy. Ale v žádném případě to neznamená, že dostatečně silný typový systém by znamenal, že nebudou potřeba žádné jednotkové testy (jak tvrdil BoneFlute), protože by vše, co se kontroluje jednotkovými testy, kontroloval typový systém.

3222
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 10:50:32 »
že se v tom dá udělat chyba? no jistě, to jde všude
Jenže celá diskuse začala tvrzením, že s propracovaným typovým systémem nejsou potřeba jednotkové testy – kde je skrytý předpoklad, že se při použití propracovaného typového systému chyba udělat nedá.

Nebo-li v této diskusi se vyskytují dvě skupiny diskutujících – jedním připadá samozřejmé, že je možné chybu udělat všude, zatímco druzí tomu, že je možné udělat chybu všude, nevěří.

3223
Vývoj / Re:Typový system versus unittesty
« kdy: 19. 06. 2018, 10:28:58 »
Diskusi jsem nečetl - má to po výše uvedeném ještě smysl číst?
Záleží na tom. Ten váš příklad je v diskusi uveden několikrát, ale nepomohlo to…

3224
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 22:10:50 »
Nejsme ve sporu.
Jste. Vy jste napsal nesmysl, že v jednotkových testech něco implementujete znovu, JSH vám to správně vyvracel, že implementovat něco v jednotkovém testu znova je obvykle velmi špatně.

Mám vyhrabat nějaký unittesty? :)
Ano, myslím, že už je na čase.

3225
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 17:31:58 »
Ale těch hranic se nedokážu dopátrat :-)
Tak si zkuste nadefinovat typ pro datum používané v Evropě a Severní Americe v období uplynulých pěti set let. Ne nějakou abstrakci, ale typ, který bude odpovídat tomu, co se v různých dobách a na různých územích skutečně používalo.

Stran: 1 ... 213 214 [215] 216 217 ... 375