SlideShare a Scribd company logo
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
● Questo talk era stato ideato sotto forma di workshop,
per questioni di tempistiche è stato ridotto e certe
tematiche potrebbero essere incomplete.
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;
}
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
Step 1: Dividiamo le responsabilità
+ Codice suddiviso logicamente
- Logica e persistenza mischiate nello
stesso posto
- Non si possono usare i mock
- Necessità di un database di test
Step 2: Separiamo la logica dalla persistenza
+ Codice suddiviso logicamente
+ Logica e persistenza separate
- Non si possono usare i mock
- Necessità di un database di test
Step 3: Incapsuliamo i dati in modelli
+ Codice suddiviso logicamente
+ Logica e persistenza separate
+ 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.
Step 4: Refactoring dei Manager
+ Codice suddiviso logicamente
+ Logica e persistenza separate
+ Si possono usare i mock
- Necessità di un database di test
Step 5: Refactoring dei Repository
+ Codice suddiviso logicamente
+ Logica e persistenza separate
+ Si possono usare i mock
+ Necessità di un database di test
Step 5: Refactoring dei Repository
Step 5: Refactoring dei Repository
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

More Related Content

PDF
Grokking TechTalk #33: High Concurrency Architecture at TIKI
PPTX
Introduction to C# Programming
PPTX
Kafka pub sub demo
PPTX
HTML5 Real Time and WebSocket Code Lab (SFHTML5, GTUGSF)
PPTX
XLnet RoBERTa Reformer
PPT
Bit Torrent Protocol
PPTX
Mutual Exclusion using Peterson's Algorithm
PDF
Implementing Cloud-native apps on OCI
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Introduction to C# Programming
Kafka pub sub demo
HTML5 Real Time and WebSocket Code Lab (SFHTML5, GTUGSF)
XLnet RoBERTa Reformer
Bit Torrent Protocol
Mutual Exclusion using Peterson's Algorithm
Implementing Cloud-native apps on OCI

Similar to Repository pattern (20)

PDF
Repository pattern slides v1.1
PDF
Code Contracts and Generics: implementing a LINQ-enabled Repository
PDF
Approccio Pratico al Domain Driven Design
PPTX
Build a LINQ-enabled Repository
PPT
Loosely Coupled Complexity - Unleash the power of your domain model
PPSX
Entity Framework 4.0 vs NHibernate
PPTX
Design Pattern Creazionali
PPTX
Il web 2.0
PDF
Architetttura Della Soluzione
PDF
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
PDF
Modulo 6 Spring Framework Core E Aop
PDF
Axon Framework - Dal monolite ai microservizi con un approccio evolutivo
PDF
Lezione 8: Design Pattern Comportamentali
PDF
How I did it (in .NET): idiomatic Domain Driven Design
PPTX
NHibernate in Action (Parte 2)
PPTX
Introduzione al Domain Driven Design (DDD)
PDF
iOS_Course_13
PDF
Come scrivere software SOLID(O)
PDF
Come scrivere software SOLID(O)
PDF
TesiEtta
Repository pattern slides v1.1
Code Contracts and Generics: implementing a LINQ-enabled Repository
Approccio Pratico al Domain Driven Design
Build a LINQ-enabled Repository
Loosely Coupled Complexity - Unleash the power of your domain model
Entity Framework 4.0 vs NHibernate
Design Pattern Creazionali
Il web 2.0
Architetttura Della Soluzione
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
Modulo 6 Spring Framework Core E Aop
Axon Framework - Dal monolite ai microservizi con un approccio evolutivo
Lezione 8: Design Pattern Comportamentali
How I did it (in .NET): idiomatic Domain Driven Design
NHibernate in Action (Parte 2)
Introduzione al Domain Driven Design (DDD)
iOS_Course_13
Come scrivere software SOLID(O)
Come scrivere software SOLID(O)
TesiEtta
Ad

Repository pattern

  • 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 ● Questo talk era stato ideato sotto forma di workshop, per questioni di tempistiche è stato ridotto e certe tematiche potrebbero essere incomplete.
  • 4. 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
  • 5. 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.
  • 6. 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.
  • 7. 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; }
  • 8. 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
  • 9. 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
  • 10. Step 1: Dividiamo le responsabilità + Codice suddiviso logicamente - Logica e persistenza mischiate nello stesso posto - Non si possono usare i mock - Necessità di un database di test
  • 11. Step 2: Separiamo la logica dalla persistenza + Codice suddiviso logicamente + Logica e persistenza separate - Non si possono usare i mock - Necessità di un database di test
  • 12. Step 3: Incapsuliamo i dati in modelli + Codice suddiviso logicamente + Logica e persistenza separate + Si possono usare i mock - Necessità di un database di test
  • 13. 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.
  • 14. Step 4: Refactoring dei Manager + Codice suddiviso logicamente + Logica e persistenza separate + Si possono usare i mock - Necessità di un database di test
  • 15. Step 5: Refactoring dei Repository + Codice suddiviso logicamente + Logica e persistenza separate + Si possono usare i mock + Necessità di un database di test
  • 16. Step 5: Refactoring dei Repository
  • 17. Step 5: Refactoring dei Repository
  • 18. 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)
  • 19. Grazie! Commenti o domande? Contattatemi christian.nastasi@gmail.com