in source code » Présent dans certains langages pour les types « composés » Tableau, Structure associative (map, vecteur, objet, etc.) Présent dans tous les langages pour les types « scalaire » Entier, Flottant, Booléen, String, Caractère
1st recipient of the Turing Award For other « Perlism »: http://www.cs.yale.edu/quotes.html « It is better to have 100 functions operate on 1 data structure than 10 functions on 10 data structures »
a des sous-nœuds ? ⇒ fonction qui retourne un booléen Comment récupérer la structure de données des sous-nœuds ? => fonction qui retourne la structure des sous-nœuds
simple, un Tree Literal avec un tableau de tableau La fonction tree-seq de Clojure permet de structurer cet arbre et de le parcourir avec clojure.walk Viz fait avec github.com/ztellman/rhizome
particulière Ex : Le compte bancaire n° 30003 02367 000593287642 13, La carte de crédit 8644 7023 0531 105 Le ticket EventBrite pour SoftShake Domain-Driven Design Objet immutable qui représente un concept dont l’égalité est basé sur l’ensemble de ses attributs et non sur une identité particulière Ex : Le montant 42 CHF L’UUID f4fbe22a-9d53-4359- adbb-57f7d21ed549 L’instant 21 octobre 2015 à 16:29 La distance 53 m Value Object Entity
participe passé qui a une signification statique et stable (commande payée, utilisateur connecté, etc.) Influence le comportement de l’objet Implique que des transformations de données ont lieu durant une transition d’état, déclenché par un événement Est associé avec une identité, ils forment alors une entité, qui représente dans le temps les différents états et les transitions qui ont eu lieu Un état est la relation entre une entité et les valeurs qu’elle possède à un instant t ; cet état peut changer
State 3 Function Function Event triggers Event triggers • value 1a • value 1b • value 1c • value 1a • value 1b • value 1c • value 2a • value 2b • value 1a • value 1b • value 1c • value 2a • value 2b • value 3a Publish Internal Event Publish Internal Event ... Time
Paid Shipped pay ship Payment details from Payment Gateway received Carrier data q Customer Data q Product Lines (product + qty) q Shipping Data States checkout q Customer Data q Product Lines (product + qty) q Shipping Data q Payment Data q Customer Data q Product Lines (product + qty) q Shipping Data q Payment Data q Carrier Data Front website form submitted Order submitted event Order paid event Order shipped event Time
d’états d’une Entity Identity State 1 State 2 State 3 Function Function • value 1a • value 1b • value 1c • value 1a • value 1b • value 1c • value 2a • value 2b • value 1a • value 1b • value 1c • value 2a • value 2b • value 3a ... Time States
» de l’état de l’entity à un instant t peut être affiché avec un Data Literal Un diff permet de visualiser les différences entre le prevState et le nextState fourni par la fonction function(input): output! function(prevState, event): nextState!
peuvent être exprimé sous forme tabulaire suivant la grammaire Gherkin Certains framework permettent de rentrer directement un Data Literal : cf framework BDD Spexec See speakerdeck.com/jgrodziski/anatomy-of-a-bdd-execution-library-in-clojure
fonction ou un namespace entier et de logguer les entrées/sorties de fonctions Combiné avec aprint (Awesome Print) cela fait des miracles… quasiment plus besoin de debugger
arguments quelque soit le nombre d’appels (idempotent) Ne cause aucun effet de bord observable (safe) Transparence référentiel : le temps n’affecte pas le résultat d’une fonction, la fonction est transparente par rapport au temps Permet la « memoization », la composition et augmente la testabilité
de valeurs et le retour de nouvelles valeurs depuis les fonctions La structure de données original n’est jamais modifiée Clojure fournit une implémentation efficace avec le Structural Sharing des Persistent Data Structures (partage des valeurs entre ancienne et nouvelle version de la structure)
bord (Safe and Idempotent) • Transformations des données • Forme des structures de données (ex : map -> list) • Valeurs (transcodage) • Création de nouvelles données (ex : Calcul) • Décision : autorisation, résultat Fonctions Impures avec effet de bord (Non Safe ou Non Idempotent) • Safe, Non Idempotent : Enrichissement des données depuis une source externe « mutable » (ex : lecture issues de BdD) • Non Safe, Non Idempotent : Persistence (insert, update), Messagerie
To Internal Enrich from external DataSource Validate Transform Transform Transform Operate (Persistence, Messaging) Fonctions Pures Get Data Fonctions Non Pures Fonctions Non Pures Les fonctions non pures sont repoussées aux extrémités du pipeline
structure de données de type List dont la forme est : (verb a b)! Clojure est lui même un Data Literal ! Permet une méta-programmation très puissante « Code is Data, Data is Code » from homo - the same - and icon - representation -
d’états d’une application comme une suite d’événements Le Replay est donc built-in…mais est fortement dépendant de la version du code source qui a traité l’événement à un instant t Peut-on stocker le code même qui a traité l’événement en même temps que celui ci ?
un notebook permettent d’interagir directement avec les Data Literals Et surtout de rentrer « dans la Zone », d’être dans le « Flow » où la productivité est très forte cf Mihály Csíkszentmihályi
Elles expriment votre DOMAINE Vos Data Literals sont votre argile, vos fonctions sont vos mains qui les façonnent Rendez vos fonctions composables Isolez les effets de bords