Obávám se, že takto statické typování nefunguje. Všechny příklady tebou naznačného spektra možností mohu řešit. A statické typování mi bude hodně pomáhat. (A nemusím to dělat ručně.)
Zkusme být konkrétní. Bylo tu uvedeno parsování JSONu. Řešil bych to určitě staticky. Rozhodování zpracování podle typu dat? Staticky. Rozhodnování podle dat - to si nejsem jist, co myslíš. Jak se mohu rozhodovat podle dat? Čeho se mohu chytnout? Můžeš uvést příklad?
Netvrdím, že to nejde. Kdyby to nešlo, tak by většina praktických problémů byla neřešitelná staticky typovanými jazyky. Jenže to, co vnímáš jako cosi, co ti bude hodně pomáhat, já často vnímám jako klacky motající se pod nohama.
Takže něco takového jako když já po milióntý prvý pouštím celou aplikaci, a píšu druhou miliardu testů, aby to pokrylo alespoň 5procent všech možnejch chyb? :-)
Toto asi už bude o pocitech, takže to nerozebírejme. Zajímají mě tedy asi spíše nějaké racionálnější argumenty.
Jaká miliarda testů? Používám jak jazyky staticky typované, tak dynamicky a nepozoruji, že by programy v těch druhých padaly nějak častěji.
Rozhodování podle dat, tím myslím IF size > 5 cm THEN ...
Rozhodování podle typu, tím myslím IF (x hasMagnitude) THEN ...
Rozhodování bez ohledu na typ, tím myslím IF x > 5 THEN ..., bez ohledu na to, co to "x" je, protože mě zajímá jen odpověď na otázku, zda "to" je větší než 5.
Rozumím. Tak první bude nějaká funkce. Druhé bude pattern matching na typ. A třetí se řeší třídou/interfacem. Viz odpověď dále.
A v dynamicky typovaném Smalltalku se to vše vyřeší jedním a tím samým mechanismem.
Viděl jsi často, že by hostinský točil pivo do papírové krabice, přestože mu v tom nic nebrání? Jistě by šlo zařídit, aby se pípa odjistila jen v případě, že pod sebou detekuje konkrétně určený značkový půllitr. Mě by popadl rapl a ta pípa by letěla na smetiště hned v okamžiku, kdy by mi odmítala pustit pivo do džbánku.
Smysl statických typů je zajistit, aby se něco takového nestalo. Když zůstaneme u přirovnání, tak ty budeš muset hostinského zaškolit, a ještě nainstalovat kameru, aby si ho sledoval, zda nečepuje pivo přímo do pusy. A stejně ho neuhlídáš. Zatímco já tam budu moct dát cedulku "samoobslužná pípa".
Každopádně ve statickém jazyce zajistím, že ta pípa se odjistí jen v případě, kdy je do čeho načepovat. Džbánek ano, papírová krabice ne.
V případě dynamických typů ten problém máš samozřejmě taky. Ale buď ho neřešíš, a doufáš, že všechno dobře dopadne. Nebo testuješ jak blbej, a pak doufáš, že všechno dobře dopadne.
Ale to je často zbytečně defenzivní přístup. Velké komplikace kvůli něčemu, čemu se dá předejít i jinak - prakticky tak, že pípu obsluhuje jedině personál k tomu kompetentní. Podobně je jednodušší namalovat na silnici plnou čáru než všude stavět svodidla.
Co je na tašce na rohlíky tak provokativního? Do datového typu rohlík dám jen rohlík a seznam rohlíků není nic jiného než taška na rohlíky. V době překladu vím, že mám datový typ, do kterého můžu naskládat jedině rohlíky. Jistě, mohu vytvořit i datový typ, do něhož jdou sázet rohlíky a housky. Ale i tuto situaci musím předvídat v době překladu.
Ano, musím to předvídat v době překladu. To je jediné, v čem máš pravdu. Jinak fakt neuvažuju, tak jak popisuješ.
Kontainer na rohlíky bych dělal v případě, kdy chci jen rohlíky. Takže to bude třeba recept na jednohubky. Protože ten dělám zásadně z rohlíků.
Ale když budu brát do krámu nějakou tašku, tak bych byl idiot se omezovat takhle, ne. Budu definovat jiná omezení. Ta, která budou užitečná.
Akorát jsi přidal nicneříkající přívlastek ke slovu "omezení", abys ho nějak ospravedlnil. Která to jsou a proč? Opět - pro mě často zbytečně restriktivní způsob myšlení.
Neznám moc jazyků, které by obsahovaly "rohlík" jako jeden ze základních typů.
Taky nás nic takového nezajímá. Doba typování ala jazyk C je naštěstí už dávno pryč.
A jaká je tedy dnes doba?
Budu-li chtít modelovat nákupní tašku, tak jako nejjednodušší případ mě napadá nějaká kolekce, třeba seznam. Ale pořád mi tu BoneFlute nevysvětlil, seznam čeho by to optimálně měl být a jakou by to mělo výhodu oproti obecné dynamicky typované kolekci.
Toho, čeho potřebuješ. To přirovnání je debilní, ale tak můžeš mít nákupní tašku na pečivo. Takže obecný typ pro pečivo. Nebo typ TuháHmota, aby si tam nečepoval to pivo. Atd.
Pak samozřejmě můžeš dojít k závěru, že nevíš, a že tam chceš dát cokoliv. Tak dáš typ *, a budeš tam moct uložit opravdu cokoliv.
A proč? Když tu kolekci využívá nějaký modul, který už má na jiném místě zajištěno, že tam přijde jen patřičný typ objektů, tak není důvod to opět někde specifikovat a kontrolovat. Dokonce to bude komplikace, když se změní protokol na vyšší úrovni. Zatímco u nespecifikovaného typu by nebylo nutné zasahovat do daného modulu vůbec, v tomto případě se tím vše úplně zbytečně rozbije.
Trošku bych to přeformuloval:
Statickej jazyk: "hele, čím víc mi řekneš podrobností předem, tím líp ti pomůžu".
Dynamickej jazyk: "hele, mě to nezajímá, cpi si tam co chceš, stejně si to budeš hlídat ty, já ti nepomůžu, ani mě nenapadne".
Naprosto v pořádku. Úplně stejně argumentují známí, kteří sympatizují s levicovými stranami. A nedokážou pochopit, když jim říkám, že nechci, aby mě stát vodil za ručičku, protože se umím vodit sám. Ale chtěl bych zdůraznit, že jsem prvotně reagoval na odpověď na Kitův komentář, v němž výslovně zmiňoval objektové jazyky. Nikdo tam po překladači nechce, aby něco takového hlídal, protože to je plně v kompetenci objektu.
- V dynamickém typování ti aplikace furt padá (ideálně na produkci), protože jsi nevychytal všechny chyby (nic ti nepomáhá).
Podobné předsudky jsem taky míval, dokud jsem v tom nezačal dělat. A, světe div se, žádné neustálé padání se nekoná. Přiznám se, že mě to samotného překvapilo, ale v dynamicky typovaných jazycích se vyvíjí trošku jinak - musíš u toho trochu změnit způsob uvažování. Ze začátku má člověk nutkání dopisovat typovou kontrolu ručně, ale to je ve skutečnosti antipattern. To platí třeba i v Pythonu (viz Idiomatic Python), ale třeba v takovém objektovém Smalltalku je to přímo do očí bijící. Prostě typová kontrola je také kompetence objektů. A ono to funguje, a velmi dobře!