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

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

description

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!

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

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

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

Marco Parenzan

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

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

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

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!

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

And the Alien Database

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

Alcuni incubi

Sviluppare (web) applications

Pensando solo alla trasformazione dei dati

Attraverso i (infamous three) tiers

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

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

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

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

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

Object are King but ORM are «anemic»

OOP: incapsulamento, ereditarietà e polimorfismo

Design Patterns: creational, singleton, strategy, ….

DDD: Aggregates, Value Types, DTOs, Entities

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

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/

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

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»

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

No more rectangles

Quando sviluppo ad oggetti l’obiettivo è scrivere codice «di valore»

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

«Look Json, no state »

Senza stato non serializzo….

…automaticamente!

Perché serializzo? Perché devo passare tra i tier, …

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

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?

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

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

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

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é

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

No more triangles

Quando sviluppo ad oggetti l’obiettivo è scrivere codice «di valore»

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

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

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

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…

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

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

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

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

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

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

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

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

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

Step 7. One Way WebApi

Quando il comando è pronto faccio una chiamata Ajax?

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

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

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

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

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!

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

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

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

Conclusioni

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

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?

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

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

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

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

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

Eventstorming & DDDHandsOn

…con @ziobrando e @amelchiori, presto su questi schermi…