SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
Repository Pattern
Un buon design al servizio della testabilità
Mi presento
Christian Nastasi
Software Architect & Technical Coach
Sviluppo Software dal 1999
Esperienza di quasi 2 anni a Londra
Email: christian.nastasi@gmail.com
Linkedin: /in/cnastasi/
Disclaimer
● Non possiedo la verità assoluta, questo è solo uno dei
tanti approcci possibili
● Fra 1 anno probabilmente scriverò codice in maniera
completamente differente
Programma della serata
- Cenni teorici: Breve introduzione del Repository Pattern e di altri pattern che
verranno utilizzati nella sessione.
- Sessione di live coding: Partendo da codice pseudo-legacy, attraverso una serie di
refactoring, si giunge all’implementazione del Repository Pattern
A Repository mediates between the domain and
data mapping layers, acting like an in-memory
domain object collection.
Client objects construct query specifications
declaratively and submit them to Repository for
satisfaction.
Objects can be added to and removed from the
Repository, as they can from a simple collection of
objects, and the mapping code encapsulated by the
Repository will carry out the appropriate
operations behind the scenes.
Martin Fowler
Repository Pattern: Definizione
Un Repository fa da intermediario tra il dominio
(business logic) ed il layer di persistenza, agendo come
una collezione di oggetti di dominio, salvati in
memoria.
Gli oggetti “cliente” costruiscono le query
dichiarativamente e le inviano al Repository per essere
eseguite.
Gli oggetti possono essere aggiunti e rimossi nello
stesso modo in cui viene fatto per una collezione di
oggetti. Il codice relativo alla persistenza è incapsulato
all’interno del repository, che si occuperà di eseguire le
operazioni appropriate “dietro le quinte”
Martino Cacciatore di uccelli
Repository Pattern: Definizione
Un Repository è un’astrazione che ci permette di separare i dati
da come vengono utilizzati a come vengono memorizzati.
L’astrazione è quella della collezione di oggetti con interfaccia
CRUD.
Repository Pattern: Definizione
Le query vanno scritte in modo dichiarativo: significa che
dobbiamo indicare soltanto cosa vogliamo ottenere.
Il come è compito del Repository, che incapsula al suo interno le
logiche di persistenza.
Repository Pattern: Esempio di interfaccia
interface EntityRepository
{
public function get (int $id):?Entity;
public function getBy (Criteria $criteria):Iterator;
public function getAll():Iterator;
public function save (Entity $entity);
public function delete (Entity $entity);
public function exists (Entity $entity):bool;
}
Repository Pattern: Repository vs DAO
DAO
E’ un’astrazione della
persistenza.
E’ più vicino ai database, ed è
spesso incentrato sulle tabelle.
Repository
E’ un’astrazione di una
collezione di oggetti.
E’ più vicino al dominio,
avendo a che fare solamento
con gli aggregati.
Single Responsibility Principle
“Ogni elemento di un programma (classe, metodo, variabile) deve avere una sola
responsabilità.
Tale responsabilità debba deve interamente incapsulata dall'elemento stesso.
Tutti i servizi offerti dall'elemento dovrebbero essere strettamente allineati a tale
responsabilità.”
Wikipedia
Open / Closed principle
“Le entità (classi, moduli, funzioni, ecc.) software dovrebbero essere aperte
all'estensione, ma chiuse alle modifiche; in maniera tale che un'entità possa permettere
che il suo comportamento sia modificato senza alterare il suo codice sorgente.
In particolare, una volta completata l'implementazione di un'entità, questa non
dovrebbe essere più modificata, eccetto che per eliminare errori di programmazione.
L'introduzione di nuove caratteristiche o la modifica di quelle esistenti dovrebbe
richiedere la creazione di nuove entità.”
Wikipedia
Liskov substitution principle
Gli oggetti dovrebbero poter essere sostituiti con dei loro
sottotipi, senza alterare il comportamento del programma che li
utilizza. (vedi anche Design by Contracts)
Interface segregation principle
Sarebbero preferibili più interfacce specifiche, che una singola
generica.
Wikipedia
Dependency inversion Principle
Una classe dovrebbe dipendere dalle astrazioni, non da classi
concrete.
Wikipedia
In poche parole...
SOLID
Caso di studio: Blog MVP
- As a user I want to publish a post
- As a user I want to see all my posts
- As a user I want to publish a comment on a post
- As a user I want to see all the comments of a post
Step 0: Codice Monolitico
- Classe monolitica
- Logica e persistenza mischiate nello
stesso posto
- Non si possono usare i mock
- Necessità di un database di test
Entità
Un’entità è un modello che rappresenta un oggetto di dominio e che può
essere identificato univocamente attraverso un id.
Istanze differenti dello stesso oggetto ma con un id identico rappresentano la
stessa entità e sono pertanto uguali.
Vantaggi
+ Si può mutare il layer di persistenza senza incidere sul funzionamento
della logica
+ Utilizzando un Repository In-memory i tempi per eseguire i test di unità
si accorciano e non c’è bisogno di ripulire il DB ogni volta.
+ Incoraggia un design DRY (don’t repeat yourself)
+ Il layer di persistenza potrebbe essere di qualsiasi natura, anche remoto
(Utile in una logica a microservices)
Grazie!
Commenti o domande? Contattatemi
christian.nastasi@gmail.com

Mais conteúdo relacionado

Semelhante a Repository pattern slides v1.1

Actionscript 3 Design Pattern
Actionscript 3 Design PatternActionscript 3 Design Pattern
Actionscript 3 Design Pattern
luca mezzalira
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capture
fcospito
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capture
fcospito
 

Semelhante a Repository pattern slides v1.1 (20)

Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernate
 
Modelli applicativi per il Cloud Computing - Part 1 - Edition 2014
Modelli applicativi per il Cloud Computing - Part 1 - Edition 2014Modelli applicativi per il Cloud Computing - Part 1 - Edition 2014
Modelli applicativi per il Cloud Computing - Part 1 - Edition 2014
 
C#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivereC#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivere
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRS
 
Xe One Day - Adaptive Code
Xe One Day - Adaptive CodeXe One Day - Adaptive Code
Xe One Day - Adaptive Code
 
Sviluppare app native per iOS
Sviluppare app native per iOSSviluppare app native per iOS
Sviluppare app native per iOS
 
Sviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto DigitaleSviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto Digitale
 
Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1
 
Slide evento Code Refactoring JavaScript
Slide evento Code Refactoring JavaScriptSlide evento Code Refactoring JavaScript
Slide evento Code Refactoring JavaScript
 
MongoDB
MongoDBMongoDB
MongoDB
 
ORM - Introduzione
ORM - IntroduzioneORM - Introduzione
ORM - Introduzione
 
Actionscript 3 Design Pattern
Actionscript 3 Design PatternActionscript 3 Design Pattern
Actionscript 3 Design Pattern
 
Kotlin hexagonal-architecture
Kotlin hexagonal-architectureKotlin hexagonal-architecture
Kotlin hexagonal-architecture
 
Never Mind the Bollocks: here's the Domain Driven Design
Never Mind the Bollocks: here's the Domain Driven DesignNever Mind the Bollocks: here's the Domain Driven Design
Never Mind the Bollocks: here's the Domain Driven Design
 
OOP with C#
OOP with C#OOP with C#
OOP with C#
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capture
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capture
 
Build a LINQ-enabled Repository
Build a LINQ-enabled RepositoryBuild a LINQ-enabled Repository
Build a LINQ-enabled Repository
 
Hadoop SAR
Hadoop SARHadoop SAR
Hadoop SAR
 
Hadoop [software architecture recovery]
Hadoop [software architecture recovery]Hadoop [software architecture recovery]
Hadoop [software architecture recovery]
 

Repository pattern slides v1.1

  • 1. Repository Pattern Un buon design al servizio della testabilità
  • 2. Mi presento Christian Nastasi Software Architect & Technical Coach Sviluppo Software dal 1999 Esperienza di quasi 2 anni a Londra Email: christian.nastasi@gmail.com Linkedin: /in/cnastasi/
  • 3. Disclaimer ● Non possiedo la verità assoluta, questo è solo uno dei tanti approcci possibili ● Fra 1 anno probabilmente scriverò codice in maniera completamente differente
  • 4. Programma della serata - Cenni teorici: Breve introduzione del Repository Pattern e di altri pattern che verranno utilizzati nella sessione. - Sessione di live coding: Partendo da codice pseudo-legacy, attraverso una serie di refactoring, si giunge all’implementazione del Repository Pattern
  • 5. A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection. Client objects construct query specifications declaratively and submit them to Repository for satisfaction. Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code encapsulated by the Repository will carry out the appropriate operations behind the scenes. Martin Fowler Repository Pattern: Definizione Un Repository fa da intermediario tra il dominio (business logic) ed il layer di persistenza, agendo come una collezione di oggetti di dominio, salvati in memoria. Gli oggetti “cliente” costruiscono le query dichiarativamente e le inviano al Repository per essere eseguite. Gli oggetti possono essere aggiunti e rimossi nello stesso modo in cui viene fatto per una collezione di oggetti. Il codice relativo alla persistenza è incapsulato all’interno del repository, che si occuperà di eseguire le operazioni appropriate “dietro le quinte” Martino Cacciatore di uccelli
  • 6. Repository Pattern: Definizione Un Repository è un’astrazione che ci permette di separare i dati da come vengono utilizzati a come vengono memorizzati. L’astrazione è quella della collezione di oggetti con interfaccia CRUD.
  • 7. Repository Pattern: Definizione Le query vanno scritte in modo dichiarativo: significa che dobbiamo indicare soltanto cosa vogliamo ottenere. Il come è compito del Repository, che incapsula al suo interno le logiche di persistenza.
  • 8. Repository Pattern: Esempio di interfaccia interface EntityRepository { public function get (int $id):?Entity; public function getBy (Criteria $criteria):Iterator; public function getAll():Iterator; public function save (Entity $entity); public function delete (Entity $entity); public function exists (Entity $entity):bool; }
  • 9. Repository Pattern: Repository vs DAO DAO E’ un’astrazione della persistenza. E’ più vicino ai database, ed è spesso incentrato sulle tabelle. Repository E’ un’astrazione di una collezione di oggetti. E’ più vicino al dominio, avendo a che fare solamento con gli aggregati.
  • 10. Single Responsibility Principle “Ogni elemento di un programma (classe, metodo, variabile) deve avere una sola responsabilità. Tale responsabilità debba deve interamente incapsulata dall'elemento stesso. Tutti i servizi offerti dall'elemento dovrebbero essere strettamente allineati a tale responsabilità.” Wikipedia
  • 11. Open / Closed principle “Le entità (classi, moduli, funzioni, ecc.) software dovrebbero essere aperte all'estensione, ma chiuse alle modifiche; in maniera tale che un'entità possa permettere che il suo comportamento sia modificato senza alterare il suo codice sorgente. In particolare, una volta completata l'implementazione di un'entità, questa non dovrebbe essere più modificata, eccetto che per eliminare errori di programmazione. L'introduzione di nuove caratteristiche o la modifica di quelle esistenti dovrebbe richiedere la creazione di nuove entità.” Wikipedia
  • 12. Liskov substitution principle Gli oggetti dovrebbero poter essere sostituiti con dei loro sottotipi, senza alterare il comportamento del programma che li utilizza. (vedi anche Design by Contracts)
  • 13. Interface segregation principle Sarebbero preferibili più interfacce specifiche, che una singola generica. Wikipedia
  • 14. Dependency inversion Principle Una classe dovrebbe dipendere dalle astrazioni, non da classi concrete. Wikipedia
  • 16. Caso di studio: Blog MVP - As a user I want to publish a post - As a user I want to see all my posts - As a user I want to publish a comment on a post - As a user I want to see all the comments of a post
  • 17. Step 0: Codice Monolitico - Classe monolitica - Logica e persistenza mischiate nello stesso posto - Non si possono usare i mock - Necessità di un database di test
  • 18. Entità Un’entità è un modello che rappresenta un oggetto di dominio e che può essere identificato univocamente attraverso un id. Istanze differenti dello stesso oggetto ma con un id identico rappresentano la stessa entità e sono pertanto uguali.
  • 19. Vantaggi + Si può mutare il layer di persistenza senza incidere sul funzionamento della logica + Utilizzando un Repository In-memory i tempi per eseguire i test di unità si accorciano e non c’è bisogno di ripulire il DB ogni volta. + Incoraggia un design DRY (don’t repeat yourself) + Il layer di persistenza potrebbe essere di qualsiasi natura, anche remoto (Utile in una logica a microservices)
  • 20. Grazie! Commenti o domande? Contattatemi christian.nastasi@gmail.com