Modelagem de Domínio Funcional e Reativa (FRDM)

Post on 09-Jan-2017

71 views 2 download

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