DCI com PHP

69
Flávio Gomes da Silva Lisboa www.fgsl.eti.br @fgsl

description

Palestra sobre os conceitos de DCI (Data Context Interaction) aplicados em PHP.

Transcript of DCI com PHP

Page 1: DCI com PHP

Flávio Gomes da Silva Lisboa www.fgsl.eti.br @fgsl

Page 2: DCI com PHP

Livre reprodução, desde que citada a fonte. www.fgsl.eti.br @fgsl

Quem sou eu

Autor

Instrutor

Arquiteto e DesenvolvedorCertificado

Page 3: DCI com PHP

Livre reprodução, desde que citada a fonte. www.fgsl.eti.br @fgsl

Consultor

Page 4: DCI com PHP

Livre reprodução, desde que citada a fonte. www.fgsl.eti.br @fgsl

Consultor

Page 5: DCI com PHP

Livre reprodução, desde que citada a fonte. www.fgsl.eti.br @fgsl

Consultor

Page 6: DCI com PHP

Livre reprodução, desde que citada a fonte. www.fgsl.eti.br @fgsl

Especialista em história em quadrinhos http://perse.doneit.com.br

romocavaleirodoespaco.blogspot.com

Page 7: DCI com PHP

Arquitetura de Software

Arquitetura é a essência da estrutura: é a forma A estrutura ofusca a forma

Arquitetura Enxuta: entrega sob demanda de funcionalidades, o que realmente gera valor.

Arquitetura Ágil: a que suporta mudança, interação com o usuário final, descoberta e fácil compreensão (de funcionalidades)

Page 8: DCI com PHP

Lean Architecture“Arquitetura Enxuta”

Page 9: DCI com PHP

Lean Architecture“Arquitetura Enxuta”

O “Pensamento Enxuto” (Lean Thinking), surgiu no final dos anos 80 do século XX, em um projeto do MIT sobre a indústria automobilística mundial.

A pesquisa mostrou que a Toyota havia desenvolvido um novo paradigma de gestão nas principais dimensões dos negócios.

Em 2009, a Toyota tornou-se a maior em volume de vendas, mostrando as vantagens e benefícios do sistema que desenvolveu.

Page 10: DCI com PHP

Lean Architecture“Arquitetura Enxuta”

O “Pensamento Enxuto” é uma estratégia de negócios para aumentar a satisfação dos clientes através da melhor utilização dos recursos.

O foco da implementaçao deve estar nas reais necessidades dos negócios.

Page 11: DCI com PHP

Qual o valor da arquitetura?

A arquitetura suporta “o que acontece lá”. Código habitável – pelas pessoas que

desenvolvem e pelas pessoas que o usam. A arquitetura é o que faz o código parecer

familiar. Uma boa arquitetura reduz lixo e inconsistência

Menos retrabalho Consistência do sistema

Page 12: DCI com PHP

Arquitetura e Orientação a Objetos

Orientação a Objetos (OO) é um paradigma – um modo de falar sobre a forma.

Fundamentos de OO: capturar o modelo mental do usuário final no código.

OO captura As entidades (objetos) que os usuários conhecem As classes que servem como conjuntos de tais

objetos.

Page 13: DCI com PHP

MVC

O que é isso? Algum mnemômico para Twitter?

Page 14: DCI com PHP

Model View Controller

Model

Controller

View

Page 15: DCI com PHP

Model View Controller

View Model

Controller

Page 16: DCI com PHP

Projeto MVC

Page 17: DCI com PHP

Projeto MVC

<?phpnamespace Mvc\Controller;

abstract class Controller{

}

<?phpnamespace Mvc\View;

abstract class View{

}

<?phpnamespace Mvc\Model;

abstract class Model{

}

Page 18: DCI com PHP

Não ficou claro...

Então vamos recorrer às analogias.

Page 19: DCI com PHP

Modelo

Page 20: DCI com PHP

Visão

Page 21: DCI com PHP

Controlador

Page 22: DCI com PHP

Capitão Marvel

Page 23: DCI com PHP

Capitão Marvel

Page 24: DCI com PHP

Remember, remember...

Um mesmo nome identifica duas entidades distintas.

O nome por si só, não tem nenhum significado. O nome é apenas um dado. Mas o dado, dentro de um contexto, traz

informação para o receptor.

Page 25: DCI com PHP

Contexto

Page 26: DCI com PHP

MVC é a encarnação da visão OO

O modelo mental do usuário é introduzido no código.

O objetivo das visões é a manipulação direta – a interação com o usuário.

O objetivo do controlador é coordenar múltiplas visões. Os dados do modelo podem ser apresentados de várias formas.

Page 27: DCI com PHP

Como nasceu o MVC

O cientista norueguês Trygve Reenskaug estava desencantado com a arquitetura das linguagens Simula e Smalltalk.

Em 1978, ele apresentou um padrão de projeto chamado Model-View-Controller-User.

Page 28: DCI com PHP

MVCU?Mas onde foi parar o U?

Page 29: DCI com PHP

Os objetivos do MVCU

Deixar que os usuários interagissem diretamente com o código que foi projetado como uma reflexão de seus próprios modelos mentais. É pra isso que serve a visão.

Permitir que o usuário coordene várias visões simultâneas do mesmo modelo. É pra isso que serve o controlador.

Isso é baseado na hipótese de que basta modelar a noção que o usuário final tem sobre o sistema de objetos.

Page 30: DCI com PHP

Mas arquitetura é mais do que isso

A forma do domínio de negócio O que o sistema é. Modelo de Domínio (como no MVC). Com o que o programador se preocupa.

A forma das interações do sistema O que o sistema faz. Modelos de papéis: OORAM (Object Oriented Role

Analysis and Modeling). Com o que o usuário se preocupa.

Page 31: DCI com PHP

Análise e Modelagem de Papéis Orientada a Objetos

Precursora da UML

Papel

Casode Uso

Responsabilidade

Page 32: DCI com PHP

Análise e Modelagem de Papéis Orientada a Objetos

<?phpnamespace Arquitetura\OORAM;

class Papel{ public function responsabilidade() { }}

Page 33: DCI com PHP

De volta a OO: Outras formas na cabeça do usuário final

Usuários pensam mais sobre os papéis manipulados por objetos do que nos objetos.

O que o sistema faz, novamente! Dinheiro transferido de uma conta bancária: os

papéis são a conta de origem e a conta de destino. Os objetos poupança, conta de investimento

podem todos fazer uso desses papéis.

As associações de papéis para objetos, para um dado caso de uso, também é parte do modelo do usuário final.

Page 34: DCI com PHP

Ainda mais formas!

E o algoritmo? O algoritmo também tem forma na cabeça do

usuário. Inicia a transação. Debita a conta de origem. Credita a conta de destino. Finaliza a transação.

Page 35: DCI com PHP

De volta a OO: Outras formas na cabeça do usuário final

O usuário está mais preocupado com as responsabilidades que são carregadas no sistema.

A orientação a objetos tem servido aos programadores (o processo de descoberta, a arquitetura) mas não aos usuários e clientes – e muito menos à qualidade do software.

Page 36: DCI com PHP

Operações de Sistema: Separação de Interesses

Computadores podem: Armazenar e recuperar dados Transformar dados Comunicarem-se!!!

A comunicação torna-se cidadã de primeira classe na computação.

Programação orientada a classes: noodles DCI: Separação de interesses:

Cada tarefa codificada separadamente.

Page 37: DCI com PHP

Operações de Sistema: Separação de Interesses

Execução de tarefas em um sistema

Contexto

Operação

Mensagem

Page 38: DCI com PHP

Operações de Sistema: Executadas por Contexto

Execução de tarefas em um sistema

<?phpclass Context{

}

Page 39: DCI com PHP

Operações de Sistema: Executadas por Contexto

Execução de tarefas em um sistema

public function executarAtividade1(){ $this->outroContexto->executarAtividade2();}

Page 40: DCI com PHP

Operações de Sistema: Executadas por Contexto

Execução de tarefas em um sistema

Page 41: DCI com PHP

Operações de Sistema: Executadas por Contexto

Execução de tarefas em um sistema

Page 42: DCI com PHP

Operações de Sistema: Executadas por Contextos

Um Contexto (uma instância de uma classe de contexto).

Recebe uma mensagem. É responsável por uma operação de sistema. Dispara um método no primeiro papel. A execução continua como especificado nos

métodos do papel.

Page 43: DCI com PHP

Essas formas trazem uma nova arquitetura

Papéis repletos de métodos (responsabilidades)

Cla

sses

de

Do m

íni o Casos de Uso

Ident ificad ores e papé is se m

todos

cc

Page 44: DCI com PHP

Essas formas trazem uma nova arquitetura

A proposta de Trygve para uma nova arquitetura é suportar a visão do usuário dos casos de uso e localizar algoritmos em um papel encapsulado.

Page 45: DCI com PHP

Essas formas trazem uma nova arquitetura

Uma das formas maioreis dessa arquitetura, chamada forma (ou arquitetura), comportamental) básica, definida apenas em termos de protocolos de papéis. Esses são os papéis sem métodos.

Compromissos.

Contratos.

Responsabilidades.

Page 46: DCI com PHP

Essas formas trazem uma nova arquitetura

<?phpinterface Compromisso{public function cumprir();}

<?phpinterface Contrato{public function respeitar();}

<?phpinterface Responsabilidade{public function ter();}

Page 47: DCI com PHP

Essas formas trazem uma nova arquitetura

O que Trygve adiciona são os papéis com métodos. Esses papéis podem invocar métodos próprios ou de outro papel.

Page 48: DCI com PHP

Papéis com Métodos

Esses papéis são implementados como classes.

Cada papel com métodos é injetado dentro de uma classe cujos objetos manipulam aquele papel em algum momento de seu tempo de vida.

A injeção é um tipo de operação de “colagem”, onde a lógica dos papéis com métodos é adicionada à lógica das classes.

Cada classe se comportará de acordo com os métodos dos papéis que foram “copiados” para dentro dele.

Page 49: DCI com PHP

Casos de Uso

Cada cenário de caso de uso é implementado como uma interação de algoritmos entre papéis.

Isso é um tipo de decomposição funcional, pois muitos usuários decompõem tarefas complexas em subtarefas.

Em tempo de execução, associamos um papel sem métodos com um objeto que pode suportar os contratos, compromissos, daquele papel e deixamos o cenário ocorrer.

Page 50: DCI com PHP

Composição de Classes

Precisamos compor algoritmos genéricos (pense em trechos de código), de papéis com métodos com as classes cujos objetos manipulam esses papéis.

Estamos falando de colar pedaços de código, e não classes inteiras.

Entramos em um problema que não é resolvido pela mecanismo fundamental de reuso da orientação a objetos, a herança.

Page 51: DCI com PHP

Composição de Classes

Um objeto pode ter papéis variáveis de acordo com o contexto em que está operando.

Um objeto pode adquirir responsabilidades em tempo de execução.

Como atribuir poderes para um objeto que não foram definidos previamente?

Como estabelecer a dependência entre objetos em tempo de execução?

Page 52: DCI com PHP

Palavras-chave

Herança, Reuso, Lean Archicteture

Dependência, Composição, Contexto

Page 53: DCI com PHP

Palavras-chave

Acoplamento

X

Desacoplamento

Page 54: DCI com PHP

É hora de conhecer DCI

O que é isso? Um mnemônico para mensagens instantâneas?

“DCI pra gente tomar um café!”

Page 55: DCI com PHP

Data Context Interaction

Data

Context

Interaction

Page 56: DCI com PHP

Data Context Interaction

InteractionData

Context

Page 57: DCI com PHP

Projeto DCI

<?phpnamespace Dci\Context;

abstract class Context{

}

<?phpnamespace Dci\Interaction;

abstract class Interaction{

}

<?phpnamespace Dci\Data;

abstract class Data{

}

Page 58: DCI com PHP

Data Context Interaction

Quando estudamos um negócio, também devemos ter esse tipo de preocupação. Separamos a Visão da Estrutura da Visão dos Processos, cientes da maior complexidade e volatilidade da segunda. Costumo dizer em meus treinamentos que a Visão dos Processos ocupará, no mínimo, 70% do tempo de um analista de negócios. Acontece que a aplicação tradicional ou indisciplinada de conceitos OO, em determinado momento, mistura tudo. Através do padrão DCI essa separação é sempre respeitada. Entre a estrutura (Data, o D de DCI) e o-que-o-sistema-FAZ (Interaction), sempre há um Contexto. E um Contexto é uma representação fiel de… um Caso de Uso!

Paulo Vasconcelos, Finito Consultoria

Page 59: DCI com PHP

Dados

Page 60: DCI com PHP

Contexto

Page 61: DCI com PHP

Interação

Page 62: DCI com PHP

Como nasceu o DCI?

Podemos considerar a publicação do artigo “The DCI Architecture: A New Vision of Object-Oriented Programming”, de James O'Coplien e … Trygve Reenskaug, em 2009

The Brave and The Bold

Page 63: DCI com PHP

Solução para os problemas de composição

Traits Injeção de dependências

Page 64: DCI com PHP

Traits

Traits: Composing Classes from Behavioral Building Blocks

Dissertação de Nathanael Scharli. Apresentada na Philosophisch-

naturwissenschaftlichen Fakultat der Universitat Bern em 2005.

Um simples modelo composicional que estende a herança simples.

Page 65: DCI com PHP

PHP >= 5.4

trait [nome] {

[bloco de código]

}

class [nome] extends [nome] {

use [nome];

}

Page 66: DCI com PHP

namespace Tomarre\Helper;class Url{public function __construct(Request $request){$this->request = $request;}public function setRouter(Router $router){$this->router = $router;}}

Injeção de dependências

c

Page 67: DCI com PHP

Injeção de dependências

use Zend\Di\Definition,Zend\Di\Reference;$mongo = new Definition('Mongo');$mongoDB = new Definition('MongoDB');$mongoDB->setParam('conn', new Reference('mongo')) ->setParam('name', 'test');$coll = new Definition('MongoCollection');$coll->setParam('db', new Reference('mongodb')) ->setParam('name', 'resource');$di->setDefinitions(array( 'mongo'=> $mongo, 'mongodb' => $mongoDB, 'resource' => $coll,));$resource = $di->get('resource');

2

Page 68: DCI com PHP

Ou seja...

Muita gente fala de MVC, mas poucos o implementam direito. Exemplo disso é a proliferação de modelos magros e controladores gordos.

DCI não substitui MVC, apenas o complementa.

Page 69: DCI com PHP

Livre reprodução, desde que citada a fonte. www.fgsl.eti.br @fgsl

Obrigado!

Flávio Gomes da Silva Lisboa

www.fgsl.eti.br

[email protected]