Java+DDD+BDD+TDD=Sucesso Total

eduardo.bregaida 1,135 views 68 slides Aug 18, 2015
Slide 1
Slide 1 of 68
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68

About This Presentation

Apresentação realizada no Java Meetup 20/08/2015


Slide Content

Quem Sou?
10 anos como Dev Java 6 anos como Scrum Master
Atualmente Aspirante a Piloto Comercial de Avião
@bregaida
[email protected]


Mas o que é DDD?

•DDD?

•DDD? •DDD?

•DDD? •DDD?
•DDD?

•DDD? •DDD?
•DDD? •DDD?

•DDD? •DDD?
•DDD? •DDD?

Havia um grande local cheio de aeronaves de um ricaço que morreu.
James, seu sobrinho, herdou este local e decidiu que queria abrir um negócio.
Uma loja de aeronaves.
E para isso era necessário um sistema...

E aí Bregaida,
beleza?
Estou precisando de sua
ajuda mais uma vez,
preciso de um sistema
para minha loja de
aeronaves.

Domain-Driven Design

Domain-Driven Design

Teremos Tupis,
Cherokees, Aeroboeiros,
Paulistinhas e outras
aeronaves, com diferentes
capacidades e potências.

?

Hum...
Então se eu fizer
CapacidadeTO
estender de
AbstractAeronave,
acho que vai dar
certo

?

Domain
Negócio Complexo
Problema Real
Pessoas
Linguagem de Negócio

Conversa
Sobre o domínio
Para criar um sistema

Conversa
Sobre o domínio
Para criar um sistema
Precisamos falar a mesma língua!

Língua Ubíqua
(Ubiquitous Language)

Temos hangares aqui
no nosso espaço, com
vários aviões
diferentes...

Nosso cliente chegará no Hangar e usará
o sistema para encontrar os melhores
aviões para sua necessidade.

Por exemplo, temos
aviões de diferentes cores
e capacidades.

Normalmente o
cliente também pode
escolher pela empresa
fabricante (Embraer,
Piper, Aviat, etc)

Aviao
-Cor
-Capacidade
- Fabricante
Cor
-Nome
Capacidade
(Potência,
Quantidade
Passageiros)
Fabricante
(Piper, Embraer,
Aviate, Boeing, etc)

Isso mesmo e nossos
aviões possuem um nome
e um prefixo que é sua
identificação no Brasil.

Aviao
-id
-Nome
-Cor
-Capacidade
- Fabricante
Cor
-Nome
Capacidade
(Potência,
Quantidade
Passageiros)
Fabricante
(Airbus, Embraer,
Piper, Boeing, etc)

Exatamente, mas
nosso cliente vai mesmo
querer pesquisar por
Fabricante e nome da
aeronave.

Aviao
-Prefixo
-Nome
-Cor
-Capacidade
- Fabricante
Cor
-Nome
Capacidade
(Potência,
Quantidade
Passageiros)
Repositório de
aviões
buscarPorNome
buscarPorFabricante
Fabricante
(Airbus, Embraer,
Piper, Boeing, etc)

Aliás outra busca que
quero é dado um avião
quero saber quais os
aviões com mesma
potência.

Creio que com esse
nosso repositório fica mais
fácil de saber, né?

Aviao
-Prefixo
-Nome
-Cor
-Capacidade
- Fabricante
-AviõesComMesmaPotência
Cor
-Nome
Capacidade
(Potência,
Quantidade
Passageiros)
Repositório de
aviões
buscarPorNome
buscarPorFabricante
Fabricante
(Airbus, Embraer,
Piper, Boeing, etc)

public class Aviao {
private Long id;
private String nome;
private Fabricante fabricante;
private Cor cor;
private Capacidade capacidade;
}

public class Fabricante {
private String nome;
//getters & setters
}
public class Cor {
private String nome;
//getters & setters
}
public class Capacidade {
private String potencia;
private String quantidadePassageiro ;
//getters & setters
}

Repositório... BD? DAO?
O que nosso cliente quer?

public interface AviaoRepository {
List<Aviao> getTodosAvioes();
List<Aviao> getAvioesPorNome(String nome) ;
List<Aviao> getAvioesPorFabricante(Fabricante fabricante) ;
List<Aviao> getAvioesPorCapacidade(Capacidade capacidade) ;
Aviao getAviaoPorId(Long id) ;
}

Como implementar o
Repositório?

Poxa é
isso mesmo que eu
queria, está ficando
muito bom, porém esqueci
que quero hangarar juntas
as aeronaves com a
mesma potência.

Model
Código

Model
Código

public class Aviao {

//Códigos anteriores...

public boolean possuemMesmaPotencia(Aviao outroAviao) {
return this.capacidade.getPotencia().equals(outroAviao.getPotencia());
}
}

Domain-Driven Design
•Voltado (driven) totalmente ao problema a ser resolvido (domain)
•Ubiquitous Language
•Funciona muito bem com Agile
•Modelos ricos (não anêmicos)
•Nomes importam!

Não importa a tecnologia. O que
importa é o domain.


http://image.slidesharecdn.com/bddextent20111029-111113010328-phpapp01/95/behavior-driven-development-pros-and-cons-5-728.jpg?cb=1321171622


Mas o que é BDD?

O que é BDD?
•Foca no comportamento do sistema;
•Visando desenvolvimento voltado a testes;
•Usam uma linguagem comum como visto no DDD;
•Beneficia os desenvolvedores e os usuários de negócio;
•Comporta vários cenários;
•Não apenas o que uma determinada função deve fazer;
•Possui aspectos do DDD e conceitos fundamentais do TDD.

Como fazer?

Narrativa/Estória: (Nome)

Para ( Valor ao Negócio)

Eu, como (Papel)

Desejo poder realizar (Funcionalidade)

Story: …

In order to …

As a …

I want to …


Narrativa/Estória: Busca Por Aeronaves

Para meu sistema de vendas de aeronaves

Eu, como cliente

Desejo poder realizar buscas por nome das
Aeronaves
Exemplo

O que mais?
•Cenários: (Nome)
•Dado que (Estado inicial do sistema)
•Quando (Ação a ser realizada)
•Então (O que deve fazer após a ação)
• Scenario: …
•Given a …
•And …
•When …
•Then …

Exemplo
•Cenário I: Busca Aeronaves por nome
•Dado que meu cliente digite o nome da Aeronave
•Quando clicar no botão buscar
•Então o sistema deverá retornar todas as aeronaves disponíveis
com aquele nome.

TDD


Mas o que é TDD?

O que é TDD ou Test Driven Development?
•É uma técnica de desenvolvimento de software baseada em um ciclo curto de repetições.
•Escrevendo seus testes antes de escrever o código de produção.
•Ao escrever primeiro os testes:
•Garantimos uma boa qualidade no código (mínimo de sujeira e códigos esquecidos que
nunca serão utilizados).
•Garantimos o funcionamento do que está sendo implementado.
•Não precisamos saber tudo de uma vez, conforme eu desenvolvo um teste, crio e
implemento as classes que serão utilizadas.

TDD - Test Driven Development

Escreva um teste que falhe;

Faça-o passar da maneira mais simples possível;

Refatore o código.

É conhecido como Ciclo Vermelho-Verde-Refatora
(Red - Green - Refactor).

BDD + TDD

Ferramentas
•ASSpec
•BDoc
•BDD para Python
•Behat - PHP
•Bumblebee - Extrai documentação de
testes escritos com JUnit.
•beanSpec - Java
•Calabash - Permite rodar testes em
aplicativos móveis para Android e iOS
•CppSpec - C++
•cfSpec - ColdFusion
•CSpec - C
•dSpec - Delphi
•Concordion - Ferramenta de testes
automatizados em Java para fazer BDD
usando textos em HTML para descrever
comportamentos.
•Cucumber - (Java, .NET, Ruby, Flex ou
qualquer aplicação web através do Watir
ou Selenium)
•easyb - Groovy/Java
•EasySpec - Groovy, usável em Java
• GSpec - Groovy
•Instinct - Java
•JavaStubs - Java - Framework de BDD
com suporte a Mock e Method Stubbing
•JBee - Java
•JBehave - Java
E muitas outras…
https://pt.wikipedia.org/wiki/Behavior_Driven_Development#Ferramentas

Referências

https://en.wikipedia.org/wiki/Behavior-driven_development

http://eduardopires.net.br/2012/06/ddd-tdd-bdd/

http://sobrecodigo.com/wp-content/uploads/2011/03/tdd_bdd.png

http://www.princiweb.com.br/blog/programacao/tdd/tdd-ddd-e-bdd-praticas-de-desenvolvimento.html

http://www.hascode.com/2011/05/oh-jbehave-baby-behaviour-driven-development-using-jbehave/

http://arnauld.github.io/incubation/jbehave-get-started/bdd-cycle-around-tdd-cycles.png

https://anoopjshetty.files.wordpress.com/2012/03/bdd.png

https://pt.wikipedia.org/wiki/Behavior_Driven_Development#Ferramentas

http://www.ianbicking.org/

http://docs.behat.org/en/v2.5/

http://www.agileandart.com/2010/07/16/ddd-introducao-a-domain-driven-design/

http://pt.slideshare.net/engenhariadesoftwareagil/ddd-domain-driven-design-5139191

http://pt.slideshare.net/rponte/entendendo-domaindriven-design?related=1

http://pt.slideshare.net/giovanni.bassi/programando-com-prazer-com-ddd?related=2

http://pt.slideshare.net/eduardo.bregaida/ddd-linguagem?related=3

http://www.infoq.com/br/domain-driven-design

http://martinfowler.com/tags/domain%20driven%20design.html

http://www.methodsandtools.com/archive/archive.php?id=97

Referências II

http://www.infoq.com/br/news/2014/09/dddx-evans-challenging

https://skillsmatter.com/conferences/1776-ddd-exchange-2014

https://en.wikipedia.org/wiki/Domain-driven_design

http://martinfowler.com/bliki/UbiquitousLanguage.html

http://www.buscape.com.br/domain-driven-design-atacando-as-complexidades-no-coracao-do-software-2-ed-2011-eric-
evans-8576085046.html#precos

http://javawora.blogspot.com.br/2012/05/tdd-test-driven-development.html

https://pt.wikipedia.org/wiki/Test_Driven_Development

http://www.devmedia.com.br/test-driven-development-tdd-simples-e-pratico/18533

http://tdd.caelum.com.br/

http://tableless.com.br/tdd-por-que-usar/

http://blog.thiagobelem.net/aprendendo-tdd-ou-desenvolvimento-orientado-a-testes/

http://www.casadocodigo.com.br/products/livro-tdd

http://agiledata.org/essays/tdd.html

http://www.desenvolvimentoagil.com.br/xp/praticas/tdd/

http://imasters.com.br/artigo/24242/desenvolvimento/principios-de-test-driven-development-tdd/

http://www.johnidouglas.com.br/wp-content/uploads/2014/02/tdd-post.png

http://pt.slideshare.net/IosifItkin/behavior-driven-development-pros-and-cons

https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTAodyDP0DbiRihtiJcWt_slpWtYj4ynHENiYutmBWyXIA4HUSm

Dúvidas?

Eduardo Bregaida - @bregaida
[email protected]
http://javawora.blogspot.com.br Obrigado!