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 - BoneFlute

Stran: 1 ... 91 92 [93] 94 95 ... 133
1381
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 13:13:26 »
Stalo se mi, že:

Psal jsem kód, kde se řadil strom (uzel, mající n potomků). Každý prvek v seznamu potomků měl být seřazen. Psal jsem na to testy asi tejden. Vždycky všechno prošlo, dal jsem na review, a poslali mi to zpět, že za těchto a těchto okolností to padá.
Pak jsem se dožral a napsal jsem si generátor všech možností - tedy dle mého chápání něco jako statický typ. Pak to půl hodiny chroupalo, vyhodilo pět chybujících scénářů, ty jsem zohlednil a byl klid.

Psal jsem parser. Unittesty jsou samozřejmě na to jak stvořené. Všechno krásně přímočaré, supr. Pochvaloval jsem si, jak umím krásně psát testy. A pak jsem si uvědomil, že jsem idiot. Kdyžbych napsal jen specifikaci toho formátu, a napsal na to generátor, tak se s tím nemusím tak patlat.

Tak jasně, u typů se musí víc přemýšlet. Ale nerad bych odbočoval do těchto bažin.

Rád bych v tomto vláknu ještě pár ukázek nějakého kódu, kde si typy nabijou hubu. Zatím uvedl Gödel uvedl ty prvočísla. To máme jeden. Napadá vás něco dalšího?

1382
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 13:04:39 »
Statický typový systém nemá s testováním nic společného. Historicky vznikl kvůli tomu, aby kompilátor mohl generovat rychlý kompaktní kód. Na návrh programu má poněkud komplikační dopad - návrh musí být podřízen statickému typování, ale bez něj by byl jednodušší.

Unit testy píšu kvůli testování funkčnosti, ne kvůli ověřování typů. Pokud budu mít kupř. za úkol napsat nějaký grafový algoritmus, tak unit testem zkouším, zda funguje tak jak má, a ne jestli tam jdou "správné" typy. Statická typová kontrola, jak se zdá, v někom vzbuzuje falešný pocit, že je to nějaký test navíc. Ale to není! Statická typová kontrola mi hází při kompilaci chyby, které tam jsou, jen protože se vyžaduje statická typovost. Je to tak trochu začarovaný kruh. Na jednu stranu mě sice zarazí, pokud omylem použiju nějakou proměnnou na něco jiného (samozřejmě tedy jen pokud to má náhodou i jiný typ), ale na druhou stranu mi zase komplikuje práci, když by ta jedna proměnná klidně mohla obsahovat různorodá data.

Nechci hodnotit, co je lepší nebo horší, obojí má podle mě své místo a opodstatnění. Ale statické typování rozhodně žádné unit testování nenahrazuje.
(osobně mi statické typování překáží tím více, na čím vyšší úrovni abstrakce se pohybáváuji; na low-level záležitosti mi připadá jako naprosto perfektní)

Obávám se, že žijem každý úplně v jiném světě.

1383
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 13:03:15 »
Nemůže ovšem garantovat správnost výsledků (v některých případech ano, ale obecně ne).
Dobře. Ale já se táži proč.

1384
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 12:46:02 »
I tak je ale vhodné použít unit testy pro otestování logiky kódu (to typově dost dobře nejde).
Proč?
Protože třeba funkce vracející k n n-té prvočíslo. Prostě logika se typovým systémem v obecnosti otestovat nedá. Se závislostním typovým systémem jde ale podchytit mnoho věcí již během překladu, což je jeho největší výhoda. Čistě teoreticky kontrolu za běhu nelze zcela vyloučit, protože halting problem. Nicméně některé jazyky zaručují i totalitu funkcí.

Rozumím. Prvočísla sou svině.

Ale pokud to chápu dobře, tak zde je problém v tom, že prvočísla se nedají ani otestovat. U typů zase narazím na to, že typ se snaží být ultimátní. Takže bych se přimlouval za plichtu :-) V tomto případě.

1385
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 12:42:21 »
To těžko. Je tam tvrzení, ne vysvětlení. Viz následující komentáře.
Následující komentář je váš dotaz na vysvětlení a hned následující komentář je vysvětlení.

Když by to bylo triviální, tak předvedeš nějaký pěkný kód. Chci snad tak moc?
Vždyť ten kód byl v komentáři odpovídajícím na vaše „Proč?“ Já bych tu funkci akorát jinak nazval, jinak je kód stejný, protože to je první, co každého napadne:

Kód: [Vybrat]
//sečte dvě čísla
int add(int x, int y) {
  return x - y;
}

A následně bylo poukázáno, že toto by šlo: https://forum.root.cz/index.php?topic=18804.msg270160#msg270160

Prosím něco lepšího :-)

1386
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 12:31:05 »
Citace
Tento příklad mi zrovna přijde celkem na pohodu. Nadefinuju si jednotlivé elementy jsonu, serialize to string. Že to dává smysl zkouknu okem, a pak zafixuju ala Elm.
Tomu asi nerozumím - je poměrně jednoduché vytvořit ToJSON a FromJSON tak, aby to navzájem kompatibilní nebylo. Tak, jak jsou ty typeclassy oddělené, nejde typově zajistit, že to kompatibilní je. Je možné vyrobit ty typy jinak. Nicméně parsing obecně typově kontrolovat nejde - ten soulad se specifikací prostě do typu té funkce
Kód: [Vybrat]
Text -> ParsedValue
nenakóduju.

Rozumím.

Kód: [Vybrat]
(toJSON json) -> str == (fromJSON str) -> json 
by nešlo? Kompiler by musel ověřit, zda všechny varianty stromu, když se vygenerují do stringu a pak následně naparsují jsou shodné.

1387
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 12:24:44 »
Kde?

Hned v komentáři #6.
To těžko. Je tam tvrzení, ne vysvětlení. Viz následující komentáře.

Jsem doufal, že se dozvím nějaké inspirativní podněty. Ne, že to prostě jen smeteš ze stolu.
Nesmetl jsem to ze stolu, jenom mi připadá zbytečné opakovat, co už bylo řečeno a je triviální.
Ano, neboli žádné argumenty, jen tvrzení, a smetení ze stolu.

Když by to bylo triviální, tak předvedeš nějaký pěkný kód. Chci snad tak moc?

1388
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 12:20:16 »
Kód: [Vybrat]
foo(i):
   if (Random.double(0, 1) > 0.0000001:
      return i + 1
   else
      return "Life suckz!"

print(1 + foo(1))

V testovani na to nejspis neprijdes, typova kontrola to da na prvni dobrou...

Když tam místo "Life suckz!" dáš třeba 0, což bývá častý případ, tak to typová kontrola také nedá.
To by nebyl problém. Typy by vyžadovali nějakou monádu, nebo effect, a podle toho pokračovali s tím, zda se to počítá dobře.

1389
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 12:18:31 »
Ano, typy nedokáží to, co dokáží testy – to navrhoval jen BoneFlute a myslím, že už to bylo vyvráceno.

Kde?

Jsem doufal, že se dozvím nějaké inspirativní podněty. Ne, že to prostě jen smeteš ze stolu.

Tak ono jaksi uz v principu typy resi (ne nutne dost zevrubnou) kontrolu pro vsechny mozne hodnoty, zatimco testy jenom pro nejake konkretni (at uz zadane nebo v pripade property based testu generovane) hodnoty.

Tohle samozrejme neni realny produkcni kod, ale jenom vydestilovany jeden z moznych problemu (misto toho random si predstav trebas neco, co zavisi na stavu konkretniho stroje, na kterem to bezi, neco, co zavisi na case atp.):

Kód: [Vybrat]
foo(i):
   if (Random.double(0, 1) > 0.0000001:
      return i + 1
   else
      return "Life suckz!"

print(1 + foo(1))

V testovani na to nejspis neprijdes, typova kontrola to da na prvni dobrou...

Ah, tak teď jsem si naběhl. Jsem tu větu pochopil přesně naopak, že Filip Jirsák tvrdí, že bylo vyvráceno, že by typová kontrola nedokázala plně nahradit testy.

1390
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 11:51:27 »
Ano, typy nedokáží to, co dokáží testy – to navrhoval jen BoneFlute a myslím, že už to bylo vyvráceno.

Kde?

Jsem doufal, že se dozvím nějaké inspirativní podněty. Ne, že to prostě jen smeteš ze stolu.

1391
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 11:30:44 »
Prosil bych ukázku použití typového systému, ve které není možné provést náhradu jednotkovými testy.

Jak to souvisí s mojí otázkou?

1392
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 11:28:45 »
Jednotkové testy jsou součástí dokumentace. Jsou zárukou, že jednotka funguje jak má. Tohle typy nedokáží.

Naopak: http://elm-lang.org - elm-package diff elm-lang/core 3.0.0 4.0.0

1393
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 01:51:37 »
I tak je ale vhodné použít unit testy pro otestování logiky kódu (to typově dost dobře nejde).
Proč?

1394
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 01:37:12 »
jednotkové testy nejsou tolik potřeba máte-li kvalitní typový systém

Prosím, toto není námětem mé otázky.

1395
Vývoj / Re:Typový system versus unittesty
« kdy: 18. 06. 2018, 01:30:39 »
Ono záleží na tom, jak jsou ty typy definované. Jeden ze způsobů (v Haskellu hodně využívaný) JSON serializace (aeson) jsou instance FromJSON a ToJSON. Mělo by platit
Kód: [Vybrat]
fromJSON . toJSON = Just
Což jinak než jednotkovými testy zkontrolovat nejde (kontroluje se to typicky přes QuickCheck property). Na druhou stranu je pravda, že lze ten typ serializace vyrobit tak, že se popíše způsob té serializace a ta možnost, že by bylo možné vyrobit vzájemně nekompatibilní FromJSON/ToJSON prostě nebude. I tak je ale typicky potřeba nějak otestovat, že alespoň ta knihovna je korektní.

Jednotkové testy prostě typicky píšu pro parsery. Ono se dost blbě typově popisuje, co má ten parser dělat. Pak třeba pro různé výpočty - jestli to počítá fakt správně. Pak třeba pro nějaké multi-threadované problémy (messagebus), jestli to dělá to, co to má dělat.
Tento příklad mi zrovna přijde celkem na pohodu. Nadefinuju si jednotlivé elementy jsonu, serialize to string. Že to dává smysl zkouknu okem, a pak zafixuju ala Elm.

Stran: 1 ... 91 92 [93] 94 95 ... 133