Implementação, design ou arquitetura?

Post on 01-Jul-2015

199 views 1 download

description

Uma discussão sobre as diferentes facetas de um software

Transcript of Implementação, design ou arquitetura?

Implementação, design ou arquitetura?

Desenhar sistemas é uma tarefa difícil

E, ainda fazer com que sejam escaláveis e performáticos, mantendo uma alta qualidade interna e externa, é um desafio!

“Você deve enfrentar suas batalhas de design, sejam elas no nível macroarquitetural ou no humilde campo das instâncias” Craig Larman

Qual é a diferença de design e arquitetura de software?

design é feito em cima do que foi decidido pela arquitetura

por isso o que faz parte

da arquitetura é mais difícil de mudar

“Alguns padrões podem ser chamados arquiteturais, já que representam decisões importantes sobre essas partes; outros são

mais sobre design e o ajudam a implementar essa arquitetura”

Martin Fowler

“Alguns padrões podem ser chamados arquiteturais, já que representam decisões importantes sobre essas partes; outros são

mais sobre design e o ajudam a implementar essa arquitetura”

Martin Fowler

“Não faço nenhuma forte tentativa de separar esses dois, uma vez que aquilo que é arquitetural ou não é subjetivo”

'

“o termo arquitetura envolve a noção dos principais elementos do sistema, as peças que são mais

difíceis de mudar”

Arquiteturas são as decisões que gostaríamos de ter tomado no começo do projeto

Ralph Johnson (do GoF)

Uma vez que somente implementações são concretas,

todo tipo de mudança implica em conhecer a implementação!

public class Conta {

private BigDecimal saldo = BigDecimal.ZERO; private BigDecimal limite = BigDecimal.ZERO; private Cliente titular; private int numero; private Calendar dataAbertura; public void setNumero(int numero) { this.numero = numero; } public void setDataAbertura(Calendar dataAbertura) { this.dataAbertura = dataAbertura; }

public int getNumero() {

return numero; } public Calendar getDataAbertura() { return dataAbertura; }

public class Conta {

private BigDecimal saldo = BigDecimal.ZERO; private BigDecimal limite = BigDecimal.ZERO; private Cliente titular; private int numero; private Calendar dataAbertura; public Conta(int numero, Calendar dataAbertura) { setNumero(numero); setDataAbertura(dataAbertura); } private void setNumero(int numero) { this.numero = numero; } private void setDataAbertura(Calendar dataAbertura) { this.dataAbertura = dataAbertura; }

public int getNumero() {

return numero; }

public class Conta {

private BigDecimal saldo = BigDecimal.ZERO; private BigDecimal limite = BigDecimal.ZERO; private Cliente titular; private int numero; private Calendar dataAbertura; public Conta(int numero, Calendar dataAbertura, BigDecimal saldoInicial,

MaisUmMonteDeParametros... ) { setNumero(numero); setDataAbertura(dataAbertura);

setSaldo(saldoInicial); …

} private void setNumero(int numero) { this.numero = numero; } private void setDataAbertura(Calendar dataAbertura) { this.dataAbertura = dataAbertura; }

public class TestaBuilder {

public static void main(String[] args) { Conta conta = ContaBuilder.novaConta() .comNumero(456) .comDataDeAbertura(2012, 04, 20) .eDepositoInicial("100") .toConta();

conta.saca(new BigDecimal("50")); System.out.println(conta.getSaldo()); }

}

Uma boa implementação, design ou arquitetura:

É aquela que permite modificações causando somente um impacto

considerado justo a outras partes do sistema

Conhecer profundamente as ferramentas é o primeiro passo para poder fazer as perguntas corretas ao enfrentar o cenário

de uma nova aplicação

Por onde começar?

Boas práticas de OO TDD – Test-Driven Design

“Vale lembrar que precisamos de mais de 10 mil horas, ou 10 anos,

para dominar uma linguagem”

Peter Norvig