Modelagem de Domínio Funcional e Reativa (FRDM)
-
Upload
edson-patricio -
Category
Software
-
view
71 -
download
2
Transcript of Modelagem de Domínio Funcional e Reativa (FRDM)
O DDD COM DEVERIA SER
FUNCTIONAL AND REACTIVEDOMAIN MODELING (FRDM)
ÉDSON PATRÍCIO
Verde Tecnologia
Programação Funcional Reativa
Visão Computacional
Inteligência Artificial
Blitz InteligenteMOBILIDADE URBANA
MOBILIDADE URBANA
SigAnalyzer
WhereletMOBILIDADE URBANA
QUEMSOUEU?
E, se sou, quantos
sou?
Édson Patrício Co-Fundador, Diretor Técnicoe meme “challenge accepted”
2010 Artigo na Java Magazine
2011 Java Funcionale Scala a sério
2013 Primeiro projeto reativo e FP "puro"
2008 Descoberta de Scala e scala-br
2012 Primeiro grande projeto (WhereLet) com Scala
2009 Fenômeno FP e algumas contribuições
2015 ValetWay
2014 SmartFix
FRDM
Tem experiência profissional em Java?
E usando DDD?
Perguntas Expressivas
DDD
DDDBounded Context
Entities Value Objects
Services
Factories
Aggregates Repositories
Ubiquitous Language
DDD
State
Domain constraints (laws: rules)
(Problem Domain)
behavior
FRDMDebasish Ghosh
Functional in the Small, OO in the Large
FRDM
State ➜Entities ➜ Set of types
Domain constraints (laws: rules)
(Solution Domain)
Behavior ➜Functions
➜ Algebra
FRDM
1. Design da algebra da sua API
2. Definir a algebra como um serviço do domínio
3. Definir padrão de ciclo de vida do modelo do domíno
(Solution Domain)
trait AccountService[Account, Amount, Balance] {
def open(no: String, name: String, openingDate: Option[Date]): Try[Account]
def close(account: Account, closeDate: Option[Date]): Try[Account]
def debit(account: Account, amount: Amount): Try[Account]
def credit(account: Account, amount: Amount): Try[Account]
def balance(account: Account): Try[Balance]
def transfer(from: Account, to: Account, amount: Amount): Try[(Account, Account, Amount)] = for { a <- debit(from, amount) b <- credit(to, amount) } yield (a, b, amount)}
sealed trait AccountTypecase object Checking extends AccountTypecase object Savings extends AccountType
trait AccountService[Account, Amount, Balance] { type AccountOperation[A] = Kleisli[Valid, AccountRepository, A]
def open(no: String, name: String, rate: Option[BigDecimal], openingDate: Option[Date], accountType: AccountType): AccountOperation[Account]
def close(no: String, closeDate: Option[Date]): AccountOperation[Account]
def debit(no: String, amount: Amount): AccountOperation[Account]
def credit(no: String, amount: Amount): AccountOperation[Account]
def balance(no: String): AccountOperation[Balance]
def transfer(from: String, to: String, amount: Amount): AccountOperation[(Account, Account)] = for { a <- debit(from, amount) b <- credit(to, amount) } yield ((a, b))}
Algebra Algebra como contrato
Não precisa se manter entre os Bounded Contexts
Desacopla espaço e tempo
Vocabulário separado
A menor abstração que resolve o problema
Saiba mais…https://github.com/debasishg/frdomain
http://debasishg.blogspot.com.br
Functional Patterns in Domain Modeling - Anemic Models and Compositional Domain Behaviors:
http://debasishg.blogspot.com.br/2014/05/functional-patterns-in-domain-modeling.html
FRDMFUNCTIONAL AND REACTIVE DOMAIN MODELING
ÉDSON PATRÍCIO
Muito Obrigado