¿Cómo es?
Para la composición se aplica el sistema de tipos algebraicos (componible). Para ello, solo es posible si el comportamiento está separado de los datos.
Para construir types “más grandes/complejos” se empieza desde types más simples/pequeños por medio de:
- Composición con “AND” (record)
- es una agrupación de types en un objeto, record, struct…
- Composición con “OR” (choice)
- Es una elección entre diferentes opciones. una forma de hacerlo es usando enums
¿Por qué es interesante?
Esto permite generar una documentación que es ejecutable. Desde la declaración de types, su composición se puede inferir la definición de los elementos del negocio que están en juego y como se relacionan. Además al ser ligero, en un mismo fichero es fácil de inferir todo más directo
¿Cómo nombramos a los types?
Pueden ser sustantivos (valores) o verbos (funciones)
Ejemplo
Caso de uso:
Aceptamos tres formas de pago
Cash
,Paypal
oCreditCard
ParaCash
no se necesita información adicional ParaPaypal
se necesita un correo electrónico ParaCreditCard
necesitamos saber el tipo de card y el card number
Implementación:
type EmailAddress = string // primite type
type CardNumber = string // primite type
type CardType = Visa | MasterCard // choice type (usando 2OR")
type CreditCardInfo = { // Record Type (usando "AND")
CardNumber: CardNumber
CardType: CardType
}
type PaymentMethod = // choice type (usando "OR")
| Cash
| Paypal of EmailAddres
| Card of CreditCardInfo
type PaymentAmount = decimal // primitive type
type Currency = EUR | USD | RUB // choice type (usando "OR")
type Payment = { // record type (usando "AND")
Amount: PaymentAmount
Currency: Currency
Method; PaymentMethod
}