Never Mind the Bollocks: here's the Domain Driven DesignAndrea Saltarello
La lettura del Blue Book può generare reazioni che vanno dal "Cargo cult" (a.k.a. "non avrai altro Modello all’infuori di me") a "’sta roba non mi serve: io faccio gestionali, non applicazioni che lanciano i razzi sulla Luna".
Previa una attualizzazione dei concetti del Blue Book, che ha ormai compiuto 10 anni, in questa sessione affronteremo leggende metropolitane e falsi miti e implementeremo DDD mostrando poche slide e tanto codice.
Quando un'entità può essere considerata valida? Come effettuare la validazione? Lo scopo della sessione è quello di illustrare e condividere alcune considerazioni relative a diversi approcci, facendo distinzione tra validazione "costante", quindi strettamente legata alle entità, e quelle che invece sono le validazioni appartenenti ad un contesto specifico. Verrà presentato l'approccio "always-valid" e messo a confronto con il classico metodo "IsValid()".
Generic Repository Pattern with ASP.NET MVC and EF provides a concise overview of the generic repository pattern and its implementation with ASP.NET MVC and Entity Framework. The generic repository pattern allows a single repository to be used for data access across all models by abstracting data logic into a shared repository interface. This reduces redundant code, promotes code reuse, and makes the solution easier to maintain and develop quickly. The document outlines the steps to implement this pattern in an ASP.NET MVC application using EF for data access and data modeling.
The world of enterprise solution development with asp.net and C#Md. Mahedee Hasan
This document discusses enterprise software development using ASP.NET and C#. It provides an overview of enterprise applications, describing them as complex, scalable, distributed systems that are mission critical. It also outlines considerations for enterprise application design like meeting business goals, performance, and security. Additionally, it presents current trends in enterprise development like microservices and tools like Visual Studio and .NET for building these applications.
Dependency Injection in Scala - Beyond the Cake PatternDebasish Ghosh
The document discusses dependency injection and different approaches to implement it in Scala code. It presents a trade service that depends on a trade repository interface. It shows how to inject a Redis implementation of the repository by partially applying the service functions. It also discusses using the Reader monad to delay injection of dependencies like the trade object. Finally, it proposes a typeclass based approach to dependency injection.
A presentation at Twitter's official developer conference, Chirp, about why we use the Scala programming language and how we build services in it. Provides a tour of a number of libraries and tools, both developed at Twitter and otherwise.
This document discusses functional patterns in domain modeling, with examples from the financial domain. It begins by defining what a domain model is. It then discusses rich domain models using classes versus lean domain models using algebraic data types and functions. Some common patterns for domain modeling are described, including using algebraic data types to represent entities and functions to represent behaviors. The document provides examples of modeling a financial domain around trading using types and functions. It discusses how this functional approach leads to an algebraic API design that can organically evolve. Overall the document advocates for applying functional programming concepts and patterns to domain modeling.
This document provides an overview of a training course on RDF, SPARQL and semantic repositories. The training course took place in August 2010 in Montreal as part of the 3rd GATE training course. The document outlines the modules covered in the course, including introductions to RDF/S and OWL semantics, querying RDF data with SPARQL, semantic repositories and benchmarking triplestores.
Step by step guide to basic web dynpro abapKranthi Kumar
This document provides a step-by-step guide to developing a basic Web Dynpro ABAP application. It introduces Web Dynpro, its architecture including components, views, controllers and context. It then outlines the process for creating a Web Dynpro component and views, defining navigation between views using plugs, and developing the application functionality.
Introduzione al Domain Driven Design (DDD)DotNetMarche
In questa sessione si approfondirà il concetto di Domain Driven Design, un principio di progettazione che può essere visto come una “forma-mentis” per aiutare a concepire e modellare applicazioni enterprise che fanno un forte uso del Domain Model. Questa metodologia, introdotta da Eric Evans, mette in risalto il dominio applicativo di un progetto, costituendo quindi il collante tra il modello analitico e il modello implementativo e trovando la sua naturale applicazione in ambienti di sviluppo agili come Extreme Programming. Come completamento della sessione verranno esaminate alcune tecniche di Layering e pattern architetturali che ben si sposano con questa tecnica.
AreaMVC: un'architettura software basata sulla semplicitàGiulio Destri
Come usare il pattern MVC per creare una architettura semplice e flessibile con cui ottenere software manutenibile e facilmente adattabile a nuove esigenze. Usabile in .NET e Java.
SPRING - MAVEN - REST API (ITA - Luglio 2017)Valerio Radice
Introduzione al framework Java Spring e Maven per realizzare API REST.
Breve introduzione all'uso di Maven per configurare un progetto SpringBoot e realizzare un server REST.
Disponibile il codice dimostrativo su github (link nelle slide, attenzione alle branch).
Valerio Radice (valix85)
Luglio 2017
XeDotNet meeting del 5 Marzo 2013
In questa sessione vedremo come Knockout.js permetta di scrivere codice JavaScript in modo pulito e organizzato, semplificando la scrittura del codice e la sua manutenzione. Come lo si utilizza KO? Quali vantaggi ci offre? Quali librerie ci vengono in aiuto? Quali sarebbe meglio evitare?
Generic Repository Pattern with ASP.NET MVC and EF provides a concise overview of the generic repository pattern and its implementation with ASP.NET MVC and Entity Framework. The generic repository pattern allows a single repository to be used for data access across all models by abstracting data logic into a shared repository interface. This reduces redundant code, promotes code reuse, and makes the solution easier to maintain and develop quickly. The document outlines the steps to implement this pattern in an ASP.NET MVC application using EF for data access and data modeling.
The world of enterprise solution development with asp.net and C#Md. Mahedee Hasan
This document discusses enterprise software development using ASP.NET and C#. It provides an overview of enterprise applications, describing them as complex, scalable, distributed systems that are mission critical. It also outlines considerations for enterprise application design like meeting business goals, performance, and security. Additionally, it presents current trends in enterprise development like microservices and tools like Visual Studio and .NET for building these applications.
Dependency Injection in Scala - Beyond the Cake PatternDebasish Ghosh
The document discusses dependency injection and different approaches to implement it in Scala code. It presents a trade service that depends on a trade repository interface. It shows how to inject a Redis implementation of the repository by partially applying the service functions. It also discusses using the Reader monad to delay injection of dependencies like the trade object. Finally, it proposes a typeclass based approach to dependency injection.
A presentation at Twitter's official developer conference, Chirp, about why we use the Scala programming language and how we build services in it. Provides a tour of a number of libraries and tools, both developed at Twitter and otherwise.
This document discusses functional patterns in domain modeling, with examples from the financial domain. It begins by defining what a domain model is. It then discusses rich domain models using classes versus lean domain models using algebraic data types and functions. Some common patterns for domain modeling are described, including using algebraic data types to represent entities and functions to represent behaviors. The document provides examples of modeling a financial domain around trading using types and functions. It discusses how this functional approach leads to an algebraic API design that can organically evolve. Overall the document advocates for applying functional programming concepts and patterns to domain modeling.
This document provides an overview of a training course on RDF, SPARQL and semantic repositories. The training course took place in August 2010 in Montreal as part of the 3rd GATE training course. The document outlines the modules covered in the course, including introductions to RDF/S and OWL semantics, querying RDF data with SPARQL, semantic repositories and benchmarking triplestores.
Step by step guide to basic web dynpro abapKranthi Kumar
This document provides a step-by-step guide to developing a basic Web Dynpro ABAP application. It introduces Web Dynpro, its architecture including components, views, controllers and context. It then outlines the process for creating a Web Dynpro component and views, defining navigation between views using plugs, and developing the application functionality.
Introduzione al Domain Driven Design (DDD)DotNetMarche
In questa sessione si approfondirà il concetto di Domain Driven Design, un principio di progettazione che può essere visto come una “forma-mentis” per aiutare a concepire e modellare applicazioni enterprise che fanno un forte uso del Domain Model. Questa metodologia, introdotta da Eric Evans, mette in risalto il dominio applicativo di un progetto, costituendo quindi il collante tra il modello analitico e il modello implementativo e trovando la sua naturale applicazione in ambienti di sviluppo agili come Extreme Programming. Come completamento della sessione verranno esaminate alcune tecniche di Layering e pattern architetturali che ben si sposano con questa tecnica.
AreaMVC: un'architettura software basata sulla semplicitàGiulio Destri
Come usare il pattern MVC per creare una architettura semplice e flessibile con cui ottenere software manutenibile e facilmente adattabile a nuove esigenze. Usabile in .NET e Java.
SPRING - MAVEN - REST API (ITA - Luglio 2017)Valerio Radice
Introduzione al framework Java Spring e Maven per realizzare API REST.
Breve introduzione all'uso di Maven per configurare un progetto SpringBoot e realizzare un server REST.
Disponibile il codice dimostrativo su github (link nelle slide, attenzione alle branch).
Valerio Radice (valix85)
Luglio 2017
XeDotNet meeting del 5 Marzo 2013
In questa sessione vedremo come Knockout.js permetta di scrivere codice JavaScript in modo pulito e organizzato, semplificando la scrittura del codice e la sua manutenzione. Come lo si utilizza KO? Quali vantaggi ci offre? Quali librerie ci vengono in aiuto? Quali sarebbe meglio evitare?
Repository Pattern: Un buon design al servizio della testabilità.
Le slides si riferiscono al talk tenuto in Mikamai Milano durante i TDD Meetup di Milano, il 02/05/2017
Code Contracts and Generics: implementing a LINQ-enabled RepositoryAndrea Saltarello
In questa sessione vedremo come implementare il Repository pattern in modo da creare un Data Access Layer interrogabile mediante query LINQ, delegando l'effettiva esecuzione delle stesse ad O/RM quali Entity Framework e/o NHibernate.
Design pattern architetturali Model View Controller, MVP e MVVMRiccardo Cardin
This presentation talks about model view controller, model view presenter and model view viewmodel patterns. These are architectural design patterns for implementing user interfaces. They divide a given software application into three interconnected parts, so as to separate internal representations of information from the ways that information is presented to or accepted from the user. Also, they promote separation of concerns. As examples, some frameworks are reported, such as:
- Spring MVC
- BackboneJS
- AngularJS
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
The Fine Art of Time Travelling: implementing Event SourcingAndrea Saltarello
If there is a common practice in architecting software systems, it is to have them store the last known state of business entities in a relational database: this practice trades the easiness of implementation with the cost of losing the history of such entities. Event Sourcing provides a pivotal solution to this problem, giving systems the capability of restoring the state they had at any given point in time. Furthermore, injecting mock-up events and having them replayed by the business logic allows for an easy implementation of simulations and “what if” scenarios.
This document discusses implementing event sourcing in .NET. It provides an overview of event sourcing and CQRS, noting that events capture past occurrences that affect the domain. A demo is shown of a sample event sourcing application using NServiceBus for messaging. The document recommends buying rather than building event store and messaging toolkit components, and lists options for each including SQL Server, MongoDB, RavenDB, MSMQ, NEventStore, and NServiceBus.
Applying DDD and CQRS can not only make the resulting design of our system simpler and more effective but, freeing us from the burdenof the “one model fits all” approach, also allows architects to adopt different strategies when it comes to business logic modeling. Though lot has been written about DDD and CQRS, missing working code publicly available seems to be the elephant in the room: in this talk, we’ll find out how to implement the “Command side of the Force” by means of a proper Domain Model and getting to the point of switching from an entity based modeling to an event based one.
Learn how to design a web solution that exploits the ASP.NET stack: in this talk we’ll find out how to set up an effective, idiomatic design that take advantage of both “out of the box” tools (e.g. MVC, Entity Framework) and bleeding edge, third party ones. Needing a SPA? We’ll understand how to take advantage of existing toolkits. Responsive design? Let’s talk Bootstrap looking at how it provides a useful and highly customizable taxonomy for UI elements. Having troubles implementing an efficient data access layer due to a lot of business rules? We’ll learn how to use LINQ as a mean to decompose those rules in simpler ones that can be composed in a flexible and efficient way. Are you concerned about performance and scalability issues? We’ll see how to implement CQRS in order to take advantage of ad hoc data models and introduce a service bus so to decouple front-end systems from back-end ones.
CQRS, ovvero: 2 stack, uno per "leggere" e l'altro per "scrivere". Se per "scrivere" abbiamo l'imbarazzo della scelta (Domain Model, Command, Event Sourcing, ...) per leggere, invece, apparentemente c'è poco da dire. "Apparentemente", appunto. Parliamone :-)
A prima vista, MVC “is all about the presentation layer”. In realtà, per trarre il massimo giovamento da questo toolkit è necessario progettare l’intera soluzione utilizzando criteri ad hoc.
In questa sessione vedremo come realizzare un Data Access Layer basato su una implementazione del Repository pattern ed in grado di essere interrogabile mediante query LINQ, eventualmente delegate ad O/RM quali Entity Framework e/o NHibernate. Vedremo inoltre come fare utilizzo dei Code Contracts del FX4 per specificare "una tantum" le regole comuni a tutti i repository di un Domain Model.
Layered Expression Trees: una terza via (idiomatica) verso il DDDAndrea Saltarello
Abbiamo il nostro splendido Domain Model, e possiamo passare la vita a definire DTO per usarlo in modo “sostenibile”. Oppure possiamo metterlo (un po’) in disparte ed adottare CQRS, ammesso che non ci venga mai da dire: “che spreco”. Oppure possiamo optare per una terza via idiomatica: Layered Expression Trees. Parliamone.
The document discusses the history and concepts behind object-relational mapping (ORM) and ORMs. It begins by describing the mismatch between the object-oriented and relational models. It then covers early work on object-relational mapping to bridge this gap. This led to the development of ORM tools that allow defining object-relational mappings and querying object graphs that are persisted to databases. Key concepts discussed include object identity, object shadows, query objects, repositories, partitioning query results, the unit of work pattern, and identity maps. Code examples demonstrate these concepts using NHibernate and LINQ.
2. DDD
Domain Driven Design:
• è un approccio alla realizzazione del
software pensato per contenere la
complessità
• Non è un silver bullet
3. Ubiquitous Language
E’ il linguaggio utilizzato nelle
discussioni tra tutti i partecipanti al
progetto, nei diagrammi, nella
documentazione e nel codice,
diventando così comune a tutti gli attori
che partecipano alla realizzazione del
software
Attenzione ai dialetti!
4. Ubiquitous Language: falsi positivi
Nella sua definizione di segno linguistico,
Ferdinand de Saussure distingue:
• un elemento formale, o esterno,
costituito dal significante,
• e un elemento intrinseco, concettuale,
costituito dal significato.
Qualsiasi segno esiste solo grazie alla
relazione tra significante e significato. In
altre parole, il significante è la forma,
fonica o grafica, utilizzata per richiamare
l'immagine che, nella nostra mente, è
associata a un determinato concetto, o
significato.
5. Bounded Context
Un Bounded Context è un contesto
all’interno del quale è valido uno
specifico ubiquitous language
Un sistema può quindi essere una
composizione di contesti differenti (es:
web store, accountability,
delivery&shipment …), comunicanti tra
di loro mediante una Context Map
Ogni bounded context è (quasi) un
sistema a sè
7. Architettura di DDD
è una layered architecture
i layer Presentation e
Infrastructure compaiono «per
sport» nel diagramma
i layer Application e Domain
costituiscono quella che tipicamente
chiamiamo «business logic»
Domain: logica invariante per i casi
d’uso
Application: logica specifica ai casi d’uso
9. Domain Layer: Key Concepts
Il Domain Layer contiene la domain
logic ed è composto da
Model: Entità (identità e stato) e Valori
(solo stato)
Servizi
Entità e Valori a runtime formano dei
grafi di oggetti. I grafi dotati di
“dignità propria” sono chiamati
Aggregate e il sistema (es: i
Repository) si “impegna” a gestirli
correttamente ed atomicamente
Le istanze di entità/aggregate sono
costruite da Factory
10. Domain Model: precisazioni
Non stiamo
modellando la
realtà assoluta,
bensì un modello
funzionale
all’interno di un
bounded context
11. Da 0 ad Aggregate
E' un insieme di elementi raggruppati in
un’unità logica, quindi un grafo di oggetti
Ha come radice l'entità principale
dell'aggregato
La radice è l’unico elemento che può essere
referenziato fuori dai confini dell’aggregato
Non è possibile agire direttamente sugli
elementi senza passare dalla radice
dell'aggregato
L’aggregate ha la responsabilità di
implementare la propria logica
13. Repository pattern
Mediates between the domain and data mapping layers
using a collection-like interface for accessing domain
objects.
Ricapitolando:
• Interfaccia “collection like”
• Gestisce la persistenza degli Aggregate
• LINQ! (siamo dei buongustai )
17. Application Layer: in teoria
Application Layer: defines the jobs the
software is supposed to do and directs the
expressive domain objects to work out
problems. The tasks this layer is
responsible for are meaningful to the
business or necessary for interaction with
the application layers of other systems.
This layer is kept thin. It does not contain
business rules or knowledge, but only
coordinates tasks and delegates work to
collaborations of domain objects in the
next layer down. It does not have state
reflecting the business situation, but it can
have state that reflects the progress of a
task for the user or the program.
18. Application Layer: in pratica
E’ un catalogo di servizi in grado di
effettuare il mesh della logica presente
nel domain layer esponendola alla
applicazione (es: presentation layer) in
una forma ad… alta digeribilità
20. Presentation Layer vs. DDD
Avere a disposizione un domain layer
«smart» è bello, ma costoso:
Materializzazione degli oggetti
Mesh della business logic
Tipicamente, si finisce per passare la vita
a «fare DTO»:
Domain Layer <-> Application Layer
Application Layer <-> Presentation Layer
21. MVC - Model View Controller
Update state Set state
Model
View Change view Controller
User action
View e Controller conoscono Model
Solo Controller agisce verso Model
View è passiva
Model è indipendente da View e Controller
22. MVC: Falsi miti
Lo scopo del Controller non è di
separare la View dal Model.
La responsabilità del Controller è di
fare da mediatore tra l'utente e
l'applicazione, non tra la View e il
Model.
Nella “web suburbia” si dice MVC, ma
si intende Model 2 [JSP specs]
23. Model 2
In a Model 2 application, requests from the
client browser are passed to the controller,
which is a servlet. The controller decides
which view (JSP) it will pass the request to.
The view then invokes methods in a
JavaBean (which may access a database)
and returns the Response object to the
Web container, which is then passed on to
the client browser. [Wikipedia]
Legenda:
• Servlet->HttpHandler->Front Controller [P
of EAA, 344]
• JSP->Controller->Page Controller [P of EAA,
333]
24. MVC @ Managed Designs
In bottega usiamo ASP.NET MVC dalle
prime CTP della v1, ed abbiamo
raggiunto una struttura
«standardizzata» dei progetti:
Model 3
Layered Expression Trees
25. MVC goes Model 3
Model 2 separa il Controller in:
Front Controller
Page Controller
Model 3 separa il Model in:
View Model: rappresenta i dati che la
view si impegna a presentare all’utente
Worker Service: è la façade verso il
Domain Layer che il page controller
utilizza per produrre il View Model
(Application Layer in DDD)
27. Layered Expression Trees (LET idiom)
Facciamo un gioco: invece di definire un
«botto» di DTO, facciamo che layer e servizi si
scambino degli
IQueryable<YourFavouriteDomainEntity>,
facendo «emergere» la query e specificando la
proiezione solo all’ultimo momento?
L’espressione «Capra e cavoli» vi dice niente?
29. MVVM Presentation Model
Represent the state and behavior of the
presentation independently of the GUI
controls used in the interface
The Presentation Model coordinates with
the domain layer and provides an
interface to the view that minimizes
decision making in the view.
30. MVVM vs. DDD
• WPF: il ViewModel può consumare il
domain layer senza limitazioni
• Silverlight: il ViewModel non ha
accesso al model
31. MVVM vs. Bottega51
• WPF: il ViewModel può consumare il
domain layer senza limitazioni
• Silverlight: il ViewModel non ha
accesso al model
32. Conclusioni
DDD permette di «concepire» ed
«organizzare» un sistema in modo
efficace
IQueryable<T> supporta DDD
abbassando il costo della
materializzazione degli oggetti
ASP.NET MVC rocks!
34. Cosa è l’Architettura?
Secondo la definizione ISO/IEC 42010:
“L’organizzazione basilare di un sistema,
rappresentato dalle sue componenti, dalle
relazioni che esistono tra di loro e con
l’ambiente circostante, e dai principi che
governano la sua progettazione e evoluzione."
35. ISO/IEC 42010 fact sheet
Titolo: IEEE Recommended Practice for Architectural
Description of Software-Intensive Systems
Scope: This recommended practice addresses the architectural
description of software-intensive systems. A software-
intensive system is any system where software contributes
essential influences to the design, construction, deployment,
and evolution of the system as a whole.
architect: The person, team, or organization responsible for
systems architecture.
architecting: The activities of defining, documenting,
maintaining, improving, and certifying properimplementation
of an architecture.
architecture: The fundamental organization of a system
embodied in its components, their relationships to each
other, and to the environment, and the principles guiding its
design and evolution.
36. Architettura: cosa?
L’architettura di un sistema *è*
definita durante la fase di
progettazione.
L’architettura *non è* parte
dell’analisi:
l’analisi si concentra su cosa debba fare il
sistema
La progettazione si concentra su come
debba farlo
37. Architetto: le responsabilità
L’architetto:
Recepisce i requisiti funzionali (emersi durante
l’analisi) e quelli non funzionali (es: HA,
scalabilità, security …)
Suddivide i grandi sistemi in (layer di) sottosistemi
individualmente assegnabili ad uno sviluppatore o
ad un gruppo di lavoro
Effettua una analisi del rapporto costi/benefici per
determinare il miglior modo di soddisfare i
requisiti, eventualmente ricorrendo a componenti
commerciali o comunque già sviluppati
Genera “specifiche”: sketch, modelli o prototipi per
comunicare al gruppo di lavoro le modalità di
realizzazione
38. Architettura: luoghi comuni
Architetto != Analista
Architetto != Project Manager
Architettura != Design
Al limite… Design Architettura
39. Architettura: rappresentazione
L’architettura si rappresenta mediante
le view, che sono la rappresentazione
del sistema osservato da un certo
view point.
Tutto fa brodo, ma ISO 19501 (UML)
offre alcuni view point “significativi”
espressi con una notazione
*standard*
40. Requisito: una definizione
1. Condizione o capacità che occorre
all’utente per risolvere un problema
o raggiungere un obiettivo
2. Condizione o capacità che deve
essere raggiunta o posseduta dal
sistema per soddisfare un
contratto, standard, specifica o
altro documento formale
3. La rappresentazione
documentata di una condizione o
capacità (1 o 2)
41. Requisiti: la teoria
La norma ISO9126, pubblicata nella
sua prima versione nel 1991, ha
definito il modello dei requisiti
qualitativi del software.
Secondo tale modello i requisiti sono
raggruppabili in 6 "caratteristiche" e
in 21 "sottocaratteristiche“, distinte
fra caratteristiche esterne (orientate
all’utente) e caratteristiche interne
(orientate allo sviluppo e
manutenzione).
42. Funzionalità
Capacità di soddisfare esigenze
esplicite od implicite.
Idoneità = funzionalità appropriate per
specificati compiti
Accuratezza = precisione dei risultati
Interoperabilità = capacità di interagire
con altre applicazioni
Sicurezza = protezione da utilizzi non
autorizzati
Concordanza = aderenza a standard o
regolamentazioni legislative
43. Disponibilità
Capacità di fornire una continuità di
servizio
Maturità = mancanza di interruzioni per
malfunzionamenti
Tolleranza = ridotto degrado in caso di
malfunzionamenti
Recupero = capacità e velocità di
ripristino dopo interruzioni
44. Usabilità
Facilità di utilizzo da parte degli utenti
Comprensione = acquisizione di
adeguato livello di conoscenza
Apprendimento = velocità di
familiarizzazione
Utilizzabilità = facilità di uso e controllo
Attrattiva = livello di gradimento
nell’utilizzo
45. Efficienza
Capacità di fornire prestazioni adeguate
Tempo Risposta = reattività agli stimoli
dell’utente
Utilizzo risorse = utilizzo adeguato delle
risorse del sistema
46. Manutenibilità
Facilità di manutenzione correttiva e
evolutiva
Analizzabilità = facilità di diagnosi e
identificazione componenti
Modificabilità = facilità di inserimento di
modifiche
Stabilità = limitazione di effetti
indesiderati derivanti da modifiche
Collaudabilità = facilità di testare le
modifiche apportate
47. Portabilità
Trasferibilità da un ambiente all’altro
Adattabilità = facilità di adeguamento
ad un nuovo ambiente
Installabilità = velocità e completezza di
installazione
Coesistenza = capacità di risiedere con
altre applicazioni nello stesso ambiente
Sostituibilità = capacità di rimpiazzare
un’altra applicazione con simili
funzionalità
48. Recepire i requisiti
La mancanza di requisiti o la
mancanza della loro gestione sono
tra le cause principali del fallimento
dei progetti
Recepire i requisiti significa
circoscrivere il problema
Strumenti utilizzati in bottega:
• Use case
• User story