781
Vývoj / Re:Investor pro C++ IDE
« kdy: 19. 09. 2021, 10:34:00 »Zajímavý příklad. U takovýchto zadání je vždy otázka, co ještě řešit v době překladu. Někdy je lepší nechat kontrolu na runtime, než učit juniory závislostní typy.Testy dělají to, co typy nesvedou. Typy obvykle nezabrání abych do proměnné měsíc nevložil hodnotu 14, aby se do indexu nedostala hodnota mimo rozsah pole.Na to jsou enumy a závislostní typy. Důležité jsou typy i testy, vzájemně se doplňují a pokrývají jiná rizika (typy symbolicky, testy ošetřením typických případů).
To s tím indexem mě zaujalo. Zkusil jsem se zamyslet, a uvažovat jak by se dal řešit nějaký jednoduchý příklad s kolekcí.
Postavil jsem to na jednom reálném zadání z práce:
U položky evidujeme 0, 1 nebo 2 záznamy, přičemž buď může být jeden záznam draft, nebo jeden accepted, nebo jeden draft a jeden accepted. Budeme to řešit jako kolekci/pole.
Takže celkem přímočaře si z toho udělám čtyři varianty (pseudokód):Kód: [Vybrat]type State = Draft | Accepted
type Choices
= []
| [(State)]
| [(Draft), (Accepted)]
-- Funkce pro přidání:
add :: Choices -> State -> Choices
add xs@[] x = [x]
add xs@[Draft] x@Accepted = [xs : x]
add xs@[Accepted] x@Draft = [xs : x]
Je to trochu humpolácky napsané, příklad je ne úplně reprezentativní, ale berme to jako výhodu.
V podobném duchu si dokážu snadno představit třeba pole o maximální velikosti 42 prvků. Ale už by to asi chtělo nějaký cukr, nebo něco, aby to bylo příjemné.
