Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e .net per sviluppatori...
-
Upload
marco-parenzan -
Category
Technology
-
view
355 -
download
1
description
Transcript of Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e .net per sviluppatori...
Lo sai che si può fare DDD in Javascript grazie a Typescript?Visual Studio e .NET per sviluppatori DDD
Marco Parenzan
Click icon to add picture
Marco ParenzanFormazione & Divulgazione con 1nn0va
Formazione & Progettazione con ITS Kennedy
Ricerca e Innovazione con Servizi Cgn
www.slideshare.net/marco.parenzan
marco [dot] parenzan [at] libero/live [dot] it
www.innovazionefvg.net
Developer e Architect in .NET e Web
Cloud (Candidate) Developer
Loves functional programming
Some videogames for fun
Click icon to add picture
Can three hack programmers,three MVPs,
and a bunch of good programming principlessave new softwares
writing them without database scaffolding?
Not without your help!
And the Alien Database
Alcuni incubi
Sviluppare (web) applications
Pensando solo alla trasformazione dei dati
Attraverso i (infamous three) tiers
Step 1. Ubiquious Language
Mettiamoci d’accordo su cosa fa il sistema, non su quali dati tratta
Non partiamo dal Database…
…e quindi da dove?
Nel gioco ZakDDD compie delle azioni, ben definite (è la prima generazione delle avventure punta e clicca) espresse in termini di verbi
Verbi che servono per interagire con le cose e gli altri personaggi
UL per programmatori
Ubiquitous Language è un insieme di concetti condivisi
Condivisi tra coloro che interagiscono con il Dominio
Ognuno esprime i concetti nella lingua più congeniale
Il programmatore usa i linguaggi di programmazione…il buon vecchio OOP
Obiettivo è quello di definire un Domain Specific Language
Se usiamo il C# e le fluent interfaces avremo un DSL interno
Object are King but ORM are «anemic»
OOP: incapsulamento, ereditarietà e polimorfismo
Design Patterns: creational, singleton, strategy, ….
DDD: Aggregates, Value Types, DTOs, Entities
Step 2. Bounded Context
Zak Mc Kracken è il secondo gioco di una famiglia nata con Maniac Mansion
Tutti i giochi di questa prima generazione di avventure hanno un runtime comune: lo SCUMM(System Creation Utility for Maniac Mansion)
Ogni gioco è composto quindi da due parti: il runtime e la parte specifica del gioco
Se ci volete giocare ancora oggi: http://scummvm.org/
Bounded Context in un progetto .NET
È convezione assegnare un bounded context ad una «unità di distribuzione» In .NET un assembly, un namespace
In Visual Studio un progetto
I BC hanno ruoli diversi I Core Context sono quelli più affini al
problema di business che stiamo modellando
Altri «context» posso modellare soluzioni più «infrastrutturali»
No more rectangles
Quando sviluppo ad oggetti l’obiettivo è scrivere codice «di valore»
«Look Json, no state »
Senza stato non serializzo….
…automaticamente!
Perché serializzo? Perché devo passare tra i tier, …
Step 3. Aggregates
Gli aggregati sono oggetti responsabili in toto della vita dell’oggetto
Affinchè «evolva», all’oggetto non devo modificare proprietà, ma specificare le azioni….che modificano lo stato
Quindi un aggregato, tipicamente, non ha proprietà pubbliche
Ma, se dovessi inviare questo oggetto attraverso i tier?
Step 4. Read Model
Chiedo all’oggetto di fornirmi «informazioni» sul suo stato
Ma nessuno dice che quello che ho è lo stato dell’oggetto
È un insieme di informazioni utili a qualche scopo, e dello stato è solo una parte
Ci possono essere tanti oggetti R/M per descrivere tante situazioni diverse
Ogni Aggregate è responsabile del proprio stato (interno)
Non deve fare alcuna assunzione, se non strettamente contrattualizzata, minimizzando le dipendenze
Delega al vero responsabile la richiesta dei dati, non si prende la briga di prenderseli da sé
No more triangles
Quando sviluppo ad oggetti l’obiettivo è scrivere codice «di valore»
Ma GetScript non ha una equivalente SetScript!
Bravo, te ne sei accorto! Certo che no! Mica puoi modificare lo stato dell’aggregato dandogli un ReadModel! Lo stato «evolve» perché compio azioni sull’aggregato
«Quindi se con quell’oggetto, in presentation ti fai una form, quei dati non ti servono a niente!!!»
E allora che me ne faccio?
Quello che vuoi! Ad esempio ti aiutano a scegliere un’altra azione da fare.
Sicuramente con il ReadModel non ti puoi costruire automaticamente una maschera
Devi costruire un modello «by hand» nella presentation
Step 5. Model in Presentation = ViewModel
Quale è il miglior modo per creare un modello?
La programmazione OOP
Ma se il modello è nella Presentation?
La programmazione OOP
Ma se l’applicazione è Web e la presentation è HTML 5/CSS3 e Javascript?
La programmazione OOP
E tu vorresti farmi scrivere OOP in Javascript? Ma non ci sono le classi!
A parte il fatto che si possono scrivere oggetti anche in Javascript (è solo il modello di
riferimento che è diverso – prototyping) adesso c’è un’alternativa…
Typescript
Large scale JavaScript development is hard.
A language for large scale JavaScript development.
A typed superset of JavaScript that compiles to plain JavaScript.
Any browser. Any host. Any OS.
Open Source.
Le più recenti presentazioni alla Build 2014 http://channel9.msdn.com/Events/Build/2014/3-576
http://channel9.msdn.com/Events/Build/2014/3-583
Type System
Structural typing and type inference In practice very few type annotations are necessary
Generics Increases accuracy and expressiveness of type system
Works with existing JavaScript libraries Declaration files can be written and maintained separately
Types enable tooling Provide verification and assistance, but not hard guarantees
An accurate static representation of JavaScript’s dynamic run-time type system
Classes, Interfaces, Modules
Scalable application structuring Classes, interfaces, and modules enable clear contracts in code
Aligned with emerging standards Class and lambda syntax aligns with ECMAScript 6 proposals
Supports popular module systems CommonJS and AMD modules in any ECMAScript 3 environment
Step 6. CQRS
Ma se il ReadModel non si spedisce indietro al Servizio, cosa invio?Comandi! Ovvero richieste di compiere azioni sul dominio!
Questo è il principio base del CQRS (Command Query Responsibility
Segregation)
E il ViewModel non è un adattamento dei dati alla presentation ma un meccanismo
per comporre comandi!
Quindi è tutto un model da scrivere, non una «bella copia» del model dei dati nel
server
Step 7. One Way WebApi
Quando il comando è pronto faccio una chiamata Ajax?
Sì
Dato che tutto il codice è in Javascript oppure negli Aggregates nel server rimane ben poco
Già
Tanto vale usare le Web Api più che MVC
Già
Cosa mi aspetto come risposta?
Niente!
Come niente?
Beh, un metodo dell’Aggregate non restituisce niente…
E allora cosa mando a fare un comando?
Il comando non restituisce niente, ma non ho detto che tu non vieni a sapere niente, non «in (a)sincrono» con la
chiamata post
Step 8. (il ritorno degli) eventi
Un sistema in generale non evolve solo perché l’utente comanda l’azione Il sistema potrebbe autonomamente
evolvere (processi schedulati)
Il sistema è multiutente (qualche altro utente agisce su un aggregato e tu devi venire a saperto)
Un sistema di eventi (publisher/subscriber) nasce proprio per questo
Step 9. Web Sockets/SignalR
Ah ah! Divertente! E adesso che hai sollevato l’evento, chi lo ascolta? Io che sono sul client?
Certo!
E come mi raggiungi, se io non faccio una chiamata HTTP?
Non mi serve l’HTTP, c’è altro
Ah!
Domanda. E il mio amato Database?
Intanto, hai notato quando ne abbiamo parlato? Eppure l’applicazione, funziona per la maggior parte senza il Dabatase?
Te gà rason
Bene a questo punto ricordati che: Parliamo di Repository per gli aggregati
Nascono assieme all’aggregato (lo conoscono bene – internals)
E poi…
E poi?
E poi, a questo punto, comunque ti potresti essere liberato del DB
AAAAAARRGH!!!!
Io voglio bene a SQL Server, ma non c’è solo SQL Server
DDD dice: «Ogni BC ha diritto di organizzare i dati come meglio gli aggrada»
Quindi puoi usare anche cache, NoSQL, files
E tu tratterai questa selta come una scelta consapevole, un tuo requisito e non un vincolo
Conclusioni
Conclusioni
Mi hai cambiato la vita!
Certo!
Tocca studiare!
Certo!
MI fai scrivere più codice!
Sembra a te, ma comunque tutto quello che scrivi è di valore, mica solo «mapping»
Tu invece ti sei accorto del regalo?
Quale?
Ti ho ridato l’OOPe quindi puoi modellare meglio la tua applicazione
e non sei vittima e schiavo di Entity Framework e Linq
È vero!
E poi…
E poi?
Step 10. Scaling Out
Un sistema basato sui comandi è molto tracciabile
Un sistema basato sugli aggregati gestisce molto bene lo stato (1 aggregato 1 stato, facile controllare la statefullness/statelessness)
Un sistema basato sugli eventi è facilmente asyncronizzabile grazie all’inserimento delle code
UN sistema DDD/CQRS è naturalmente un sistema pronto per il Cloud Computing
Click icon to add picture
Q & A
www.slideshare.net/marco.parenzan
https://github.com/marcoparenzan/dddmckracken
marco [dot] parenzan [at] libero/live [dot] it
www.innovazionefvg.net
Eventstorming & DDDHandsOn
…con @ziobrando e @amelchiori, presto su questi schermi…