Abstraktní Wikipedie/Aktualizace/2022-01-28
◀ | Aktualizace Abstraktní Wikipedie | ▶ |
Od začátku projektu jsme zveřejnili funkční model Wikifunkcí, ale popis je spíše technický a nezáživný. V těchto bulletinech jsme již dříve popsali části funkčního modelu přístupnějším způsobem: co je objekt, k čemu jsou funkce dobré, značky a dokumentace, co jsou generické typy a proč umožňujeme více implementací jedné funkce.
Dnes se ponoříme do základního problému: jak reprezentujeme funkci?
Co je to funkce? Pojem "funkce" se používá v různých oborech a anglická Wikipedie nabízí články o funkcích v počítačové vědě, matematice, jazykovědě, biologii, strojírenství a sociologii. Všechny tyto pojmy spolu souvisejí a jsou zajímavé, a pro Wikifunkce používáme následující specifickou definici: funkce přijímá nějaký vstup a odpovídá výstupem. Vstup ovlivňuje výstup předvídatelným způsobem.
K čemu jsou funkce dobré? Již dříve jsme hovořili o obecné motivaci pro užití funkcí: funkce odpovídají na otázky a zodpovídání otázek je důležitou součástí toho, aby měl každý přístup k souhrnu všech znalostí. Funkce budou ústředním typem objektů ve Wikifunkcích. Uživatelé Wikifunkcí budou moci "volat" nebo používat funkce k zodpovězení svých otázek. Editoři Wikifunkcí budou moci definovat nové funkce a vytvářet související podpůrné objekty.
Jak reprezentujeme funkci? Zde je přehled toho, jak je ve Wikifunkcích reprezentována funkce a související objekty, které ji podporují (podrobněji se jim budeme věnovat níže): funkce má popisy, aliasy, dokumentaci, návratový typ a seznam parametrů, seznam testerů, seznam implementací a identitu. (Identitou se dnes zabývat nebudeme, protože je to spíše technická záležitost).
Štítky. Funkci definujeme tak, že jí dáme štítek čili jméno. Označení závisí na jazyce: funkce, která sčítá dvě čísla, se může jmenovat "Addition" v angličtině, "Zbrajanje" v chorvatštině, "Сложе́ние" v ruštině, "যোগ" v bangladéštině atd. Může mít také aliasy, které lidem pomohou najít správnou funkci: "Add", "Sum" nebo "Plus" mohou být dobré aliasy v angličtině, "прибавле́ние" může být alias v ruštině a "+" může být alias, který funguje v mnoha jazycích.
Dokumentace. Funkce má často také dokumentaci - text, který popisuje, co funkce dělá a jak to dělá. To by mělo lidem pomoci s odlišením funkce od podobných funkcí a pro umožnění uživatelům pochopit, co bude výsledkem volání funkce a jak to odpovídá na jejich otázky. Již dříve jsme se zabývali štítky, aliasy a dokumentací.
Návratový typ. Návratový typ nám říká, jaký typ objektu bude odpovědí funkce. Například: "číslo", "boolean" pro true/false, "string" pro slova atd. To může být užitečné v mnoha ohledech: může to pomoci při procházení dostupných funkcí, protože někdy víme, že naší odpovědí bude číslo; může to pomoci při kombinování funkcí dohromady, protože víme, že argument může přijímat pouze určitý typ a že ho můžeme zkombinovat s funkcí, která vrací požadovaný typ. Návratový typ nám také může pomoci s pochopením funkce a toho, co přesně vrací. U dvou níže uvedených funkcí "dělit" jedna vrátí číslo a druhá seznam řetězců. I když v našem jazyce nemáme k dispozici žádnou dokumentaci k dané funkci, poskytne nám to silnou nápovědu, co by mohla dělat.
Seznam parametrů. Funkce přijímá nějaký vstup. Vstup je zadán jako jeden nebo více parametrů. Každý parametr může mít popis/název (opět uvedený v každém z podporovaných jazyků) a typ objektu, který od tohoto parametru očekáváme. Typ je důležitý: řekněme, že máte funkci s názvem "dělit", která přijímá řetězec a číslo a dělí daný řetězec na stejně velké části. Zavoláte tedy "rozděl "Wikipedie" na 3 části" a funkce odpoví "Wik", "ipe" a "die". Samostatně existuje další funkce, rovněž nazvaná "rozděl", která přijímá dvě čísla a určuje, kolikrát se první z nich dostane do druhého. Jedná se o dvě velmi odlišné funkce a výsledkem "divide(333, 3)" může být buď 111, nebo 3, 3 a 3 - podle toho, kterou funkci jste si vybrali a jaké typy hodnot měly.
Funkce číselného dělení také ilustruje potřebu názvů argumentů: v tomto případě je důležité, který argument je číslo, jímž dělíme, a který je číslo, kterým dělíme. V jiných případech jsou jména argumentů méně důležitá: u funkce "rozděl řetězec na stejné části" stačí typy, abychom věděli, který argument co dělá.
Seznam testerů. Testery budou ve Wikifunkcích hrát klíčovou roli, a to nejen tím, že budou plnit standardní úlohu testů. Tradičně je cílem testu poskytnout uživateli určitou jistotu, že funkce skutečně vrátí správnou odpověď. Pokud funkce projde testy, je pravděpodobné, že funkce vrátí správnou odpověď i pro ostatní argumenty. Dobře navržená sada testů může zkoumat "okrajové případy" toho, co se očekává při volání funkce s překvapivým vstupem.
Ve Wikifunkcích toho ale testery zvládnou mnohem víc! Když editor vytvoří funkci, která rozdělí řetězec na stejně dlouhé části, může okamžitě uvést příklady toho, co zamýšlel: může vytvořit tester, který vzhledem k tomu, že chceme "Wikipedii" rozdělit na tři stejně dlouhé části, chce získat výsledek, který je seznamem tří řetězců: "Wik", "ipe" a "die". Bez ohledu na to, jakým jazykem mluví, každý další přispěvatel vidí očekávané výsledky přesně definovaným způsobem a může pomoci s vytvořením implementace, která testery projde.
Testery slouží jako prostředek k dosažení dohody mezi editory do Wikifunkcí o tom, co přesně daná funkce dělá, bez ohledu na jazyk, kterým mluví. Testery jsou místem, kde lze zjistit okrajové případy (a způsob jejich řešení) a odsouhlasit je nebo zamítnout. Testery v konečném důsledku omezují to, jaké jsou "správné" implementace funkce, a tedy přesně to, co má funkce dělat.
To také znamená, že testery jsou určitou formou dokumentace nezávislé na jazyce, protože poskytují příklady toho, jak se funkce volá a jaké výsledky se očekávají. Takže i když ve vašem jazyce není k dispozici žádná dokumentace, testery vám mohou umožnit odhadnout, co funkce dělá, a produktivně ji použít.
Seznam implementací. Implementace umožňuje skutečné spuštění funkce na zadaných argumentech a vytvoření výsledku, který je odpovědí na volání funkce. Ve Wikifunkcích mohou být implementace uvedeny třemi různými způsoby: buď jako vestavěná funkce, nebo jako kód v konkrétním programovacím jazyce, nebo jako kompozice jiných funkcí. O nich jsme již hovořili dříve a diskutovali jsme o tom, proč jdeme neobvyklým způsobem umožňujícím více implementací pro jednu funkci.
Doufáme, že to pomůže lépe pochopit funkce, testery a implementace.