Typový system versus unittesty

Re:Typový system versus unittesty
« Odpověď #660 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?


Bacsa

Re:Typový system versus unittesty
« Odpověď #661 kdy: 19. 08. 2018, 16:29:23 »
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?
Ne, Alois Jirásek nic takového nedefinoval.

Re:Typový system versus unittesty
« Odpověď #662 kdy: 19. 08. 2018, 16:42:09 »
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.

Re:Typový system versus unittesty
« Odpověď #663 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?

Re:Typový system versus unittesty
« Odpověď #664 kdy: 19. 08. 2018, 18:00:29 »
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?
API má obvykle více funkcí, my řešíme jednu funkci z toho API. Podpis by podle mne bylo horší slovo, protože podpis evokuje nějakou identitu. A to je právě něco jiného – API znamená, že mám nějaké definované chování, a zbytek chování, který je pro mne nepodstatný, definovaný není. Takže to API pak může být implementováno různými způsoby, různými identitami – všechny musí mít stejné to dohodnuté chování, ale chování, které dohodnuté není, může být libovolné. Třeba jako u té funkce sum, kterou jsem uváděl, by nejspíš bylo dohodnuté, že ta funkce vrací součet všech hodnot v poli. Ve většině případů by ale už asi nebylo dohodnuté, jakým způsobem má ta funkce pole procházet – jestli od začátku do konce, od konce do začátku nebo třeba paralelně. Ale v některých případech může být dohodnuté i tohle. Proto je API věcí dohody, která může být částečně vyjádřena ve zdrojovém kódu (třeba pomocí typů), 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.


Re:Typový system versus unittesty
« Odpověď #665 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?

Re:Typový system versus unittesty
« Odpověď #666 kdy: 19. 08. 2018, 20:24:11 »
A muzes teda uvest priklad zavazku, ktery formalne vyjadrit nelze?
Třeba spousta her napsaných v Turbo Pascalu měla na novějších platformách potíže s rychlostí – byly příliš rychlé a nedaly se hrát. Protože rychlost závisela na něčem, co záviselo na rychlosti procesoru. Takže tam by ten závazek zněl nějak jako „časovač musí běžet tak rychle, aby normální lidé mohli tu hru hrát“. Případně by se mohl ten požadavek změnit a formalizovat na „trvání funkce musí být v rozmezí x až y ms“. Což se třeba dá zapsat formálně, ale překladač to nemůže zkontrolovat, protože netuší, na jaké cílové platformě ten kód poběží.

BoneFlute

  • *****
  • 1 842
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #667 kdy: 19. 08. 2018, 20:30:04 »
jak by tedy vypadaly ty funkce v Elmu?

Ha, omlouvám se! Zde jsem se extrémně nešťastně vyjádřil.

Elm samozřejmě neumí to všechno, o čem jsem hovořil. Elm umí ošetřit právě tu změnu kontraktu na úrovni API. Tedy uvedl jsem ho jako příklad pro použití, kdy testy hlídají, zda se něco změnilo, a abych si toho byl schopen všimnout.

To, že změním chování nějaké funkce, ale vnější signatura (vstup a výstup) zůstane stejná, to by zase mohli podchytit závislostní typy. (Případně se tu objevili příspěvky o dalších technikách.)

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.

BoneFlute

  • *****
  • 1 842
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #668 kdy: 19. 08. 2018, 20:42:40 »
Ty vycházíš z předpokladu, že API a implementace jsou od sebe rozdílné.
To není předpoklad, to je definice API.

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.

BoneFlute

  • *****
  • 1 842
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #669 kdy: 19. 08. 2018, 20:46:05 »
Případně by se mohl ten požadavek změnit a formalizovat na „trvání funkce musí být v rozmezí x až y ms“. Což se třeba dá zapsat formálně, ale překladač to nemůže zkontrolovat, protože netuší, na jaké cílové platformě ten kód poběží.

Jak nemůže? Proč by nemohl? Ať je platforma jakákoliv, tak čas bude všude stejný ne? Této argumentaci nerozumím.

v

Re:Typový system versus unittesty
« Odpověď #670 kdy: 19. 08. 2018, 20:50:18 »
Případně by se mohl ten požadavek změnit a formalizovat na „trvání funkce musí být v rozmezí x až y ms“. Což se třeba dá zapsat formálně, ale překladač to nemůže zkontrolovat, protože netuší, na jaké cílové platformě ten kód poběží.

Jak nemůže? Proč by nemohl? Ať je platforma jakákoliv, tak čas bude všude stejný ne? Této argumentaci nerozumím.
překladač nezná frekvenci hodin cílového CPU, ta se navíc může za běhu měnit, to nemusí až tak moc vadit, pokud bychom se zabývali jenom nejhorším možným případem

BoneFlute

  • *****
  • 1 842
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #671 kdy: 19. 08. 2018, 20:53:02 »
Případně by se mohl ten požadavek změnit a formalizovat na „trvání funkce musí být v rozmezí x až y ms“. Což se třeba dá zapsat formálně, ale překladač to nemůže zkontrolovat, protože netuší, na jaké cílové platformě ten kód poběží.

Jak nemůže? Proč by nemohl? Ať je platforma jakákoliv, tak čas bude všude stejný ne? Této argumentaci nerozumím.
překladač nezná frekvenci hodin cílového CPU, ta se navíc může za běhu měnit, to nemusí až tak moc vadit, pokud bychom se zabývali jenom nejhorším možným případem
Já tam vidím "ms", takže na frekvenci CPU nezáleží.

Ostatně, to, že rychlost funkce závisela na rychlosti procesoru je pradávná historie. Dneska když se píše hra, tak se určitě nebude opírat o frekvenci CPU, ale o hodiny.

v

Re:Typový system versus unittesty
« Odpověď #672 kdy: 19. 08. 2018, 21:07:40 »
Případně by se mohl ten požadavek změnit a formalizovat na „trvání funkce musí být v rozmezí x až y ms“. Což se třeba dá zapsat formálně, ale překladač to nemůže zkontrolovat, protože netuší, na jaké cílové platformě ten kód poběží.

Jak nemůže? Proč by nemohl? Ať je platforma jakákoliv, tak čas bude všude stejný ne? Této argumentaci nerozumím.
překladač nezná frekvenci hodin cílového CPU, ta se navíc může za běhu měnit, to nemusí až tak moc vadit, pokud bychom se zabývali jenom nejhorším možným případem
Já tam vidím "ms", takže na frekvenci CPU nezáleží.

Ostatně, to, že rychlost funkce závisela na rychlosti procesoru je pradávná historie. Dneska když se píše hra, tak se určitě nebude opírat o frekvenci CPU, ale o hodiny.
kde byste vzal dobu trvání fragmentu kódu?

BoneFlute

  • *****
  • 1 842
    • Zobrazit profil
Re:Typový system versus unittesty
« Odpověď #673 kdy: 19. 08. 2018, 21:17:05 »
Případně by se mohl ten požadavek změnit a formalizovat na „trvání funkce musí být v rozmezí x až y ms“. Což se třeba dá zapsat formálně, ale překladač to nemůže zkontrolovat, protože netuší, na jaké cílové platformě ten kód poběží.

Jak nemůže? Proč by nemohl? Ať je platforma jakákoliv, tak čas bude všude stejný ne? Této argumentaci nerozumím.
překladač nezná frekvenci hodin cílového CPU, ta se navíc může za běhu měnit, to nemusí až tak moc vadit, pokud bychom se zabývali jenom nejhorším možným případem
Já tam vidím "ms", takže na frekvenci CPU nezáleží.

Ostatně, to, že rychlost funkce závisela na rychlosti procesoru je pradávná historie. Dneska když se píše hra, tak se určitě nebude opírat o frekvenci CPU, ale o hodiny.
kde byste vzal dobu trvání fragmentu kódu?

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.

Trader

Re:Typový system versus unittesty
« Odpověď #674 kdy: 19. 08. 2018, 21:36:28 »
jak by tedy vypadaly ty funkce v Elmu?
To, že změním chování nějaké funkce, ale vnější signatura (vstup a výstup) zůstane stejná, to by zase mohli podchytit závislostní typy.
Ano, ty jsou mocné, docela rád bych tu viděl nějaké příklady problémů, které záv. typy řeší.