Lo sai che si può fare DDD in Javascript
grazie a Typescript?
Visual Studio e .NET per sviluppatori DDD
Marco Parenzan
Marco Parenzan
Formazione & Divulgazione con 1nn0va
Formazione & Progettazione con ITS Kennedy
Ricerca e Innovazione con S...
Can three hack programmers,
three MVPs,
and a bunch of good programming principles
save new softwares
writing them
without...
And the Alien Database
Alcuni incubi
 Sviluppare (web) applications
 Pensando solo alla trasformazione dei
dati
 Attraverso i (infamous three)...
Step 1. Ubiquious Language
 Mettiamoci d’accordo su cosa fa il
sistema, non su quali dati tratta
 Non partiamo dal Datab...
UL per programmatori
 Ubiquitous Language è un insieme di
concetti condivisi
 Condivisi tra coloro che interagiscono con...
Object are King but ORM are «anemic»
 OOP: incapsulamento, ereditarietà e polimorfismo
 Design Patterns: creational, sin...
Step 2. Bounded Context
 Zak Mc Kracken è il secondo gioco di una famiglia nata con Maniac Mansion
 Tutti i giochi di qu...
Bounded Context in un progetto .NET
 È convezione assegnare un bounded
context ad una «unità di distribuzione»
 In .NET ...
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 ...
Step 3. Aggregates
 Gli aggregati sono oggetti responsabili in
toto della vita dell’oggetto
 Affinchè «evolva», all’ogge...
Step 4. Read Model
 Chiedo all’oggetto di fornirmi
«informazioni» sul suo stato
 Ma nessuno dice che quello che ho è lo
...
Ogni Aggregate è responsabile del proprio stato (interno)
 Non deve fare alcuna assunzione, se non strettamente contrattu...
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 d...
Step 5. Model in Presentation = ViewModel
 Quale è il miglior modo per creare un modello?
 La programmazione OOP
 Ma se...
Typescript
 Large scale JavaScript development is hard.
 A language for large scale JavaScript development.
 A typed su...
Type System
 Structural typing and type inference
 In practice very few type annotations are necessary
 Generics
 Incr...
Classes, Interfaces, Modules
 Scalable application structuring
 Classes, interfaces, and modules enable clear contracts ...
Step 6. CQRS
 Ma se il ReadModel non si spedisce indietro
al Servizio, cosa invio?Comandi! Ovvero
richieste di compiere a...
Step 7. One Way WebApi
 Quando il comando è pronto faccio una chiamata Ajax?
 Sì
 Dato che tutto il codice è in Javascr...
Step 8. (il ritorno degli) eventi
 Un sistema in generale non evolve solo
perché l’utente comanda l’azione
 Il sistema p...
Step 9. Web Sockets/SignalR
 Ah ah! Divertente! E adesso che hai
sollevato l’evento, chi lo ascolta? Io che
sono sul clie...
Domanda. E il mio amato Database?
 Intanto, hai notato quando ne abbiamo parlato? Eppure
l’applicazione, funziona per la ...
Conclusioni
Conclusioni
 Mi hai cambiato la vita!
 Certo!
 Tocca studiare!
 Certo!
 MI fai scrivere più codice!
 Sembra a te, ma...
Step 10. Scaling Out
 Un sistema basato sui comandi è molto tracciabile
 Un sistema basato sugli aggregati gestisce molt...
Q & A
www.slideshare.net/marco.parenzan
https://github.com/marcoparenzan/dddmckracken
marco [dot] parenzan [at] libero/liv...
Eventstorming & DDDHandsOn
…con @ziobrando e @amelchiori, presto su questi schermi…
Upcoming SlideShare
Loading in …5
×

Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e .net per sviluppatori DDD

607 views

Published on

Scrivere Object Oriented è ora possibile anche in Javascript con Typescript. E in generale bisogna concentrarsi nello scrivere codice di valore e non "autogenerato" dallo scaffolding. Capiamo come si fa riscrivendo un vecchio gioco della Licasfilm!

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
607
On SlideShare
0
From Embeds
0
Number of Embeds
24
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e .net per sviluppatori DDD

  1. 1. Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e .NET per sviluppatori DDD Marco Parenzan
  2. 2. Marco Parenzan Formazione & 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
  3. 3. Can three hack programmers, three MVPs, and a bunch of good programming principles save new softwares writing them without database scaffolding? Not without your help!
  4. 4. And the Alien Database
  5. 5. Alcuni incubi  Sviluppare (web) applications  Pensando solo alla trasformazione dei dati  Attraverso i (infamous three) tiers
  6. 6. 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
  7. 7. 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
  8. 8. Object are King but ORM are «anemic»  OOP: incapsulamento, ereditarietà e polimorfismo  Design Patterns: creational, singleton, strategy, ….  DDD: Aggregates, Value Types, DTOs, Entities
  9. 9. 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/
  10. 10. 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»
  11. 11. No more rectangles  Quando sviluppo ad oggetti l’obiettivo è scrivere codice «di valore»
  12. 12. «Look Json, no state »  Senza stato non serializzo….  …automaticamente!  Perché serializzo? Perché devo passare tra i tier, …
  13. 13. 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?
  14. 14. 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
  15. 15. 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é
  16. 16. No more triangles  Quando sviluppo ad oggetti l’obiettivo è scrivere codice «di valore»
  17. 17. 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
  18. 18. 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…
  19. 19. 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
  20. 20. 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
  21. 21. 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
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. 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!
  26. 26. 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
  27. 27. Conclusioni
  28. 28. 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’OOP e quindi puoi modellare meglio la tua applicazione e non sei vittima e schiavo di Entity Framework e Linq  È vero!  E poi…  E poi?
  29. 29. 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
  30. 30. Q & A www.slideshare.net/marco.parenzan https://github.com/marcoparenzan/dddmckracken marco [dot] parenzan [at] libero/live [dot] it www.innovazionefvg.net
  31. 31. Eventstorming & DDDHandsOn …con @ziobrando e @amelchiori, presto su questi schermi…

×