SlideShare una empresa de Scribd logo
1 de 160
Descargar para leer sin conexión
Vamos falar de Clean
Code, Refatoração e
TDD mais uma vez
Domingos Teruel
Zend Certified Engineer
Domingos Teruel
Zend Certified Engineer PHP 5.3

Tecnólogo em Processamento de dados e
Gestão da Tecnologia da Informação,
especialista em interfaces de sistemas,
atuando no desenvolvimento e
implementação de sistemas web com
software livre e Governo Eletrônico.
Sobre o que vamos falar?
Profissionalismo e felicidade
Insatisfação com o fracasso
Existe diferença?
Insatisfação no trabalho
Você se sente profissional?
Você se sente profissional?
Você se sente profissional?
Poderia ser mais produtivo?
Sensação de impotência
Se sente um peão de obra, trabalho braçal
Se sente um peão de obra, trabalho braçal
e desgastante!
e desgastante!
Qual a diferença entre cansaço e
Já teve aquele
sentimento de largar
tudo?
O que mais motiva um
desenvolvedor?
“Quem trabalha apenas pelo
salário, ganhe o que for, será
sempre mal pago.”
(Autor desconhecido)
“Qual é a sua obra?
obra
Quando você se for, o
vai restar?”
(Mario Cortella)
Afinal, quanto custa a
Afinal, quanto custa a
bagunça para a empresa?
bagunça para a empresa?
Alta rotatividade
Demora no lançamento de novas
Demora no lançamento de novas
funcionalidades
funcionalidades
Dificuldade na hora de realizar
qualquer modificação...
Alta incidência de bugs?
Quanto custa a falta deconfiança do
seu cliente?
Quanto tempo você perde tentando
Quanto tempo você perde tentando
entender o código para corrigir um
entender o código para corrigir um
bug?
bug?
Conclusão: Passamos a maior parte
Conclusão: Passamos a maior parte
do tempo lendo o código!
do tempo lendo o código!
Evolução da Produtividade
Clean code, o que é?
Você teria medo de tomar o
remédio?
Código feito com
cuidado
Que revela
intenção
simples
Fácil de entender
“Qualquer tolo consegue
escrever código que um
computador entenda.
Bons programadores escrevem
código que humanos possam
entender.”
(Martin Fowler)
Funcionar é o
mínimo que se
espera.
Qualidade Externa x Interna
Qualidade externa é aquela
que você percebe logo de
cara. Se ausabilidade da
interface
for
ruim,
aperformance for sofrível e
defeitos acontecem com
frequência, a pessoa logo
percebe e sequer compra o
software.
Qualidade interna é aquela que você
só
percebe
com
o
tempo.
Infelizmente o comercial não vende
esse tipo de qualidade. Noentanto, é
ela que atrasa o negócio e mata a
empresa aos poucos, sufoca e
aumenta os custos. É ela que gera
custos
boa parte da rotatividade.
Como medir a qualidade do
código?
• Linhas de código?
• Número de métodos?
•

Número de classes?

•

Linhas de código por método?

•

Complexidade ciclomática?

•

Número de estruturas de decisão?

?
WTF
WTF

WTF
WTF

WTF

WTF
dificuldade de entender
nivel máximo de sujeira
Debate: Até que ponto vale apena
continuar mantendo um projeto
vivo?
Falar é fácil
O desafio é criar código de
qualidade!
No entanto, falar é o primeiro passo rumo a
No entanto, falar é o primeiro passo rumo a
melhoria!
melhoria!
Quatro estágios
necessários para
adquirir novos
hábitos
Estágio 1
“Inconsciente e sem
habilidade”
Ignoramos o
comportamento e o
hábito
Estágio 2
“Consciente e sem
habilidade”
Conhecemos o
comportamento mas
ainda não temos o
hábito de aplicá-lo”
Estágio 3
“Consciente e
habilidoso”
Nos sentimos confortáveis
com pela prática que vamos
adquirindo com o tempo
Estágio 4
“Inconsciente e
habilidoso”
O hábito se torna uma coisa
natural
Escrever código limpo requer muita
Escrever código limpo requer muita
prática e habilidade!
prática e habilidade!
Començando a treinar
Nomes estranhos
Limitação histórica
1.
2.
3.
4.
5.
6.
7.
8.
9.

READ INPUT TAPE A1, B1, C1;
501 FORMAT A1;
IF (A1) 777, 777, 777
IF (B1) 888, 888, 888
IF (C1) 999, 999, 999
STOP 1
799 S = FLOATF(A1 + B1 + C1) / 2.0
WRITE TO TAPE S
END PROCESS

As linguagens não
ajudavam muito
Os ambientes não
ajudavam
Nem os computadores
Deixaram essa herança
maldita!
Aprendendo com os
mestres
1.
2.
3.
4.
5.
6.
7.
8.

// Descrição da maquina
$m_desc;
// Resultado parcial da soma
$s1;
// Cor dos olhos
$cOlhos;
// Valor do índice temporário
$aux;
revela a intenção
1.
2.
3.
4.
5.
6.
7.
8.

// Descrição da maquina
$m_desc;
// Resultado parcial da soma
$s1;
// Cor dos olhos
$cOlhos;
// Valor do índice temporário
$aux;
1.
2.
3.
4.
5.
6.
7.
8.

// Descrição da maquina
$descricaoDaMaquina;
// Resultado parcial da soma
$resultadoParcialSoma;
// Cor dos olhos
$corDosOlhos;
// Valor do índice temporário
$valorDoIndiceTemporario;
1.
2.
3.
4.
5.
6.
7.
8.

$descricaoDaMaquina;
$resultadoParcialSoma;
$corDosOlhos;
$valorDoIndiceTemporario;
1.$descricaoDaMaquina;
2.$resultadoParcialSoma;
3.$corDosOlhos;
4.$valorDoIndiceTemporario;
Não seja genérico
1.
2.
3.
4.
5.
6.
7.
8.

// Processa folha de pagamento
processa();
processa()
// Calcula o imposto de renda ret.
calcula();
// Renderiza o relatório de alunos
renderiza();
// Totaliza as estatísticas da ligação
totaliza();
totaliza()
1.
2.
3.
4.
5.
6.
7.
8.

// Processa folha de pagamento
processaFolhaPagamento();
processaFolhaPagamento()
// Calcula o imposto de renda ret.
calculaImpostoRetido();
calculaImpostoRetido()
// Renderiza o relatório de alunos
renderizaRelatorioAlunos();
renderizaRelatorioAlunos()
// Totaliza as estatísticas da ligação
totalizaEstatisticasLigacao();
totalizaEstatisticasLigacao()
1.
2.
3.
4.
5.
6.
7.
8.

processaFolhaPagamento();
processaFolhaPagamento()
calculaImpostoRetido();
calculaImpostoRetido()
renderizaRelatorioAlunos();
renderizaRelatorioAlunos()
totalizaEstatisticasLigacao();
totalizaEstatisticasLigacao()
1.
2.
3.
4.

processaFolhaPagamento();
processaFolhaPagamento()
calculaImpostoRetido();
calculaImpostoRetido()
renderizaRelatorioAlunos();
renderizaRelatorioAlunos()
totalizaEstatisticasLigacao();
totalizaEstatisticasLigacao()
Simplifique estruturas de
decisão
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($hora > 22:00 || $hora < 06:00) {
return $this->distancia * 3.90;
} else {
return $this->distancia * 2.10;
}
}
}
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if () {
return $this->distancia * 3.90;
} else {
return $this->distancia * 2.10;
}
}
}
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->distancia * 3.90;
} else {
return $this->distancia * 2.10;
}
}
}
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->distancia * 3.90;
} else {
return $this->distancia * 2.10;
}
}
public function ehBandeiraDois($hora) {
return $hora > 22:00 || $hora < 06:00;
}
}
Números mágicos
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->distancia * 3.90;
} else {
return $this->distancia * 2.10;
}
}
public function ehBandeiraDois($hora) {
return $hora > 22:00 || $hora < 06:00;
}
}
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->distancia *;
} else {
return $this->distancia *;
}
}
public function ehBandeiraDois($hora) {
return $hora > 22:00 || $hora < 06:00;
}
}
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->distancia * PRECO_B2;
} else {
return $this->distancia * PRECO_B1;
}
}
public function ehBandeiraDois($hora) {
return $hora > 22:00 || $hora < 06:00;
}
}
<?php
class Taximetro {
public function calculaValorDaCorrida($hora) {
if ($this->ehBandeiraDois($hora)) {
return $this->distancia * PRECO_BANDEIRA2;
} else {
return $this->distancia * PRECO_BANDEIRA1;
}
}
public function ehBandeiraDois($hora) {
return $hora > 22:00 || $hora < 06:00;
}
}
Saindo do labirinto
<?php
...
function calculaValorDaCorrida($hora) {
if ($hora > 22:00 || $hora < 06:00) {
return $this->distancia * 3.90;
} else {
if ($this->diaDaSemana == 'Domingo') {
return $this->distancia * 2.9;
}else {
return $this->distancia * 2.10;
}
}
}
...
distância da margem
<?php
...
function calculaValorDaCorrida($hora) {
if ($hora > 22:00 || $hora < 06:00) {
return $this->distancia * 3.90;
} else {
if ($this->diaDaSemana == 'Domingo') {
return $this->distancia * 2.9;
}else {
return $this->distancia * 2.10;
}
}
}
...
<?php
...
function calculaValorDaCorrida($hora) {
if () {
return $this->distancia * 3.90;
} else {
if () {
return $this->distancia * 2.9;
}else {
return $this->distancia * 2.10;
}
}
}
...
<?php
...
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * 3.90;
} else {
if ($this->ehHorarioDeDomingo()) {
return $this->distancia * 2.9;
}else {
return $this->distancia * 2.10;
}
}
}
...
<?php
..
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * 3.90;
}
if ($this->ehHorarioDeDomingo()) {
return $this->distancia * 2.9;
}else {
return $this->distancia * 2.10;
}
}
...
<?php
...
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * 3.90;
}
if ($this->ehHorarioDeDomingo()) {
return $this->distancia * 2.9;
}else {
return $this->distancia * 2.10;
}
}
...
<?php
...
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * 3.90;
}
if ($this->ehHorarioDeDomingo()) {
return $this->distancia * 2.9;
}
return $this->distancia * 2.10;
}
...
<?php
...
function calculaValorDaCorrida() {
if ($this->ehBandeiraDois()) {
return $this->distancia * PRECO_BANDEIRA2;
}
if ($this->ehHorarioDeDomingo()) {
return $this->distancia * PRECO_DE_DOMINGO;
}
return $this->distancia * PRECO_BANDEIRA1;
}
...
medo de estragar algo?
economize, teste mais
cedo!
Mas o que é refatorar?
“Alteração feita na estrutura
interna do software para tornálo mais fácil de ser
entendido e menos custoso
de ser modificado sem alterar
seu comportamento
observável.”
(Martin Fowler)
“Refactoring é a arte de
evoluir o design do
código existente.”
(William C. Wake)
“Refatorar é uma forma
de manter seu software
sustentável e
competitivo com o
passar do tempo.”
Refatorar é uma forma de
investimento
Tempo investido refatorando é
proporcional ao tempo
economizado com o entendimento
do código multiplicado pelo número
de pessoas na equipe.
(Rodrigo Branas - Developer)
A fórmula matemática do refactoring:
Tr = Te * tamanho da equipe
1 hora investida refatorando é
proporcional a
8 horas economizadas com o
entendimento em uma equipe de 8
pessoas.
Isso sem falar em flexibilidade,
redução na quantidade de
defeitos e reuso.
infelizmente, o inverso também
é verdadeiro
Como vender atividades de
vender
refatoração para o seu gerente?
Diálogo entre o Desenvolvedor e o Gerente
Desenvolvedor: João, preciso fazer um refactoring no
código!
Gerente: Refactoring?! O que é isso, você vai melhorar a
performance?
Desenvolvedor: Não, não...
Gerente: Vai deixar a interface mais bonita e mais fácil
de ser utilizada?
Desenvolvedor: Não...
Gerente: Então? O que é isso?
Desenvolvedor: “Vou fazer uma alteração na estrutura
interna do software,para torná-lo mais fácil de ser
entendido e menos custoso de sermodificado, sem
alterar seu comportamento observável.” (Martin Fowler)
Gerente: Não.
Refatore com um propósito,
evite refatorar apenas por
refatorar
Atente-se as
oportunidades!
oportunidades
Aproveite a correção de um defeito
Aproveite a correção de um defeito
para refatorar!
para refatorar!
Vai adicionar algo novo, aproveite
Vai adicionar algo novo, aproveite
para refatorar!
para refatorar!
Refatore quando precisar entender
Refatore quando precisar entender
uma parte do código
uma parte do código
Os 7 principais inimigos da
Os 7 principais inimigos da
refatoração
refatoração
Desconhecimento
Desconhecimento
Não se dar conta do problema é
uma das principais causas. É
comum ver desenvolvedores
experientes que não dão
atenção a qualidade do código.
Imediatismo
Imediatismo
Pensar apenas em resolver o
problema, sem considerar que
problema
a natureza do desenvolvimento
de software é a mudança.
Janelas quebradas
Janelas quebradas
Temos dificuldade em lidar com
janelas quebradas. Seja numa
dieta, relacionamento ou
desenvolvimento de software, o
desânimo das janelas
quebradas leva ao fracasso.
fracasso
Nível técnico baixo
Nível técnico baixo
É fácil culpar o estagiário. É
preciso ter pessoas com nível
técnico alto e senso crítico
apurado para zelar pelas
boaspráticas e manter a
ordem do código.
código
Falta de trabalho em
Falta de trabalho em
equipe
equipe
O código pertence a
equipe, não ao seu autor.
Todos devem se
responsabilizar e zelar
pelo bem comum.
comum
Gerenciamento
Gerenciamento
Pressão comercial
Pressão comercial
Quando não
Quando não
refatorar?
refatorar?
• Quando o código simplesmente
não funciona, é instável
instáve

• Se funciona, ninguém sabe ao
certo como...

• Próximo ao final do prazo de
entrega
A maioria das empresas precisa
A maioria das empresas precisa
contrair algumas dívidas para
contrair algumas dívidas para
funcionar efetivamente
funcionar efetivamente
Mas cuidado com o aumento do débito
Mas cuidado com o aumento do débito
técnico, os juros são altos
técnico os juros são altos
técnico,
técnico
Testes unitários
As 3 leis do TDD
• Você não pode escrever o código
até que tenha criado um teste
falhando;
falhando

• Você não pode escrever mais

testes do que seja suficiente para
falhar;
falhar

• Você não pode escrever mais

código do que o suficiente para
passar o teste que esta falhando;
falhando
1 Conceito por teste
• Separe do teste que esteja

testando com mais de um
conceito em outros testes

• Facilite o entendimento de cada
teste
Os testes devem ser
rápidos para executar,
pois quando são lentos a
frequência de execução
diminui.
Testes não podem
depender uns dos
outros, pois se um falha
os outros também
falharam
Ao executa-los mais de
uma vez, devem sempre
retornar o mesmo
resultado
Os testes devem ser
escritos antes do
código.
código
Após o código será mais
difícil fazer o teste
O código do teste é tão
importante quanto o
código da produção.
O teste precisa sofrer
alterações da mesma forma
que o código
Quanto mais sujo o teste
mais difícil dar
manutenção, e menor a
flexibilidade para alterálo.
“Se você deixar seus
testes apodrecerem,
seu código também
apodrecerá”
Fique atento aos maus
cheiros!
• Comentários pobres, obsoletos e
redundantes

• Código comentado
• Testes que requerem mais de um passo
• Muitos parâmetros ou parâmetros
booleanos

• Métodos mortos ou que fazem muita
coisa

• Responsabilidades fora do contexto
• Nomes pequenos e inexpressivos
• Duplicação
• Inconsistência
• Intenção obscura
• Variáveis e funções inexpressivas
• Despadronização
• Números mágicos
• Desencapsulamento
• Efeitos colaterais
• Testes insuficientes
Conclusão
• Tudo o que falamos até aqui não é
para ser uma lista de regras

• Você não se torna um bom

programador aprendendo uma lista
de regras.

• As técnicas e práticas têm que

começar a fazer parte do nosso dia
a dia.

• Devemos nos preocupar com a
qualidade do código e não
somente fazê-lo funcionar.
Você é responsável pelo código
Você é responsável pelo código
que escreve e só você!
que escreve e só você!
Referência
•
•
•
•
•
•

Clean Code - Robert Martin

•
•
•
•
•

Design Patterns - Head First - Eric Freeman e Elisabeth Freeman

Refactoring - Martin Fowler
Patters of Enterprise Application Architecture - Martin Fowler
Test-Driven Development by Example - Kent Beck
Effective Java - Joshua Block
Design Patterns - Eric Gamma, Richard Helm, Ralph Johnson e
John Vlissides

Refactoring to Patterns - Joshua Kerievisky
Domain-Driven Design - Eric Evans
Working Effectively with Legacy Code - Michael Feathers
Baseado no curso de Clean Code por Rodrigo Branas
(www.agilecode.com.br)

Referência
Perguntas?
Participe!
dteruel@opensuse.org
http://about.me/mingomax

Más contenido relacionado

Similar a Clean Code e Refatoração

Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaSobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaElaine Naomi
 
Do legado ao DDD
Do legado ao DDDDo legado ao DDD
Do legado ao DDDLeonn Leite
 
Negócio Escrito em Código
Negócio Escrito em CódigoNegócio Escrito em Código
Negócio Escrito em CódigoDouglas Siviotti
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerGiovanni Kenji Shiroma
 
Refatoração 1/3 webinar
Refatoração 1/3   webinarRefatoração 1/3   webinar
Refatoração 1/3 webinarZG Soluções
 
Design for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPDesign for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPPablo Dall'Oglio
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesDavid Robert Camargo de Campos
 
Desenvolvimento orientado a Testes
Desenvolvimento orientado a TestesDesenvolvimento orientado a Testes
Desenvolvimento orientado a TestesDenis Ferrari
 
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Ricardo Valeriano
 
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPaulino Michelazzo
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Luís Cobucci
 
Depurando aplicações PHP like a BOSS
Depurando aplicações PHP like a BOSSDepurando aplicações PHP like a BOSS
Depurando aplicações PHP like a BOSSThiago Rodrigues
 
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e AtitudeCriando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e AtitudePablo Dall'Oglio
 

Similar a Clean Code e Refatoração (20)

Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaSobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
 
Do legado ao DDD
Do legado ao DDDDo legado ao DDD
Do legado ao DDD
 
Negócio Escrito em Código
Negócio Escrito em CódigoNegócio Escrito em Código
Negócio Escrito em Código
 
Mergulhando no ecossistema .NET
Mergulhando no ecossistema .NETMergulhando no ecossistema .NET
Mergulhando no ecossistema .NET
 
Test-driven Development
Test-driven DevelopmentTest-driven Development
Test-driven Development
 
POG nunca mais - SOLISC
POG nunca mais - SOLISCPOG nunca mais - SOLISC
POG nunca mais - SOLISC
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & Docker
 
Aula 01 - Curso PHP e MySQL
Aula 01 - Curso PHP e MySQLAula 01 - Curso PHP e MySQL
Aula 01 - Curso PHP e MySQL
 
Refatoração 1/3 webinar
Refatoração 1/3   webinarRefatoração 1/3   webinar
Refatoração 1/3 webinar
 
Design for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPDesign for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHP
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefes
 
Desenvolvimento orientado a Testes
Desenvolvimento orientado a TestesDesenvolvimento orientado a Testes
Desenvolvimento orientado a Testes
 
Java - Primeiros passos
Java - Primeiros passosJava - Primeiros passos
Java - Primeiros passos
 
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
 
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
PHP Tools for Fast coding
PHP Tools for Fast codingPHP Tools for Fast coding
PHP Tools for Fast coding
 
Depurando aplicações PHP like a BOSS
Depurando aplicações PHP like a BOSSDepurando aplicações PHP like a BOSS
Depurando aplicações PHP like a BOSS
 
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e AtitudeCriando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
Criando software para o futuro com DDD, Arquitetura, Patterns, e Atitude
 

Más de Domingos Teruel

Lições aprendidas com a Re (escrita |design) de uma aplicação PHP
 Lições aprendidas com a Re (escrita |design) de uma aplicação PHP  Lições aprendidas com a Re (escrita |design) de uma aplicação PHP
Lições aprendidas com a Re (escrita |design) de uma aplicação PHP Domingos Teruel
 
Por dentro do Projeto openSUSE
Por dentro do Projeto openSUSEPor dentro do Projeto openSUSE
Por dentro do Projeto openSUSEDomingos Teruel
 
Zend Framework 2 - O que esperar da nova versão
Zend Framework 2 - O que esperar da nova versãoZend Framework 2 - O que esperar da nova versão
Zend Framework 2 - O que esperar da nova versãoDomingos Teruel
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitDomingos Teruel
 
Taxonomias e Tipos de Conteúdos com WordPress 3
Taxonomias e Tipos de Conteúdos com WordPress 3Taxonomias e Tipos de Conteúdos com WordPress 3
Taxonomias e Tipos de Conteúdos com WordPress 3Domingos Teruel
 
Desmistificando o Framework da Zend
Desmistificando o Framework da ZendDesmistificando o Framework da Zend
Desmistificando o Framework da ZendDomingos Teruel
 
Desenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend FrameworkDesenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend FrameworkDomingos Teruel
 
Desenvovelndo Aplicações com PHP, AJAX e Y!UI Yahoo User Interface
Desenvovelndo Aplicações com PHP, AJAX e Y!UI Yahoo User InterfaceDesenvovelndo Aplicações com PHP, AJAX e Y!UI Yahoo User Interface
Desenvovelndo Aplicações com PHP, AJAX e Y!UI Yahoo User InterfaceDomingos Teruel
 
Desenvolvendo Aplicativos com Zend Framework e banco de dados CDS/ISIS
Desenvolvendo Aplicativos com  Zend Framework  e banco de dados CDS/ISISDesenvolvendo Aplicativos com  Zend Framework  e banco de dados CDS/ISIS
Desenvolvendo Aplicativos com Zend Framework e banco de dados CDS/ISISDomingos Teruel
 
Desenvolvendo aplicações PHP, AJAX e YUI! Yahoo User Interface
Desenvolvendo aplicações PHP, AJAX e YUI! Yahoo User InterfaceDesenvolvendo aplicações PHP, AJAX e YUI! Yahoo User Interface
Desenvolvendo aplicações PHP, AJAX e YUI! Yahoo User InterfaceDomingos Teruel
 
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User InterfaceDesenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User InterfaceDomingos Teruel
 

Más de Domingos Teruel (11)

Lições aprendidas com a Re (escrita |design) de uma aplicação PHP
 Lições aprendidas com a Re (escrita |design) de uma aplicação PHP  Lições aprendidas com a Re (escrita |design) de uma aplicação PHP
Lições aprendidas com a Re (escrita |design) de uma aplicação PHP
 
Por dentro do Projeto openSUSE
Por dentro do Projeto openSUSEPor dentro do Projeto openSUSE
Por dentro do Projeto openSUSE
 
Zend Framework 2 - O que esperar da nova versão
Zend Framework 2 - O que esperar da nova versãoZend Framework 2 - O que esperar da nova versão
Zend Framework 2 - O que esperar da nova versão
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnit
 
Taxonomias e Tipos de Conteúdos com WordPress 3
Taxonomias e Tipos de Conteúdos com WordPress 3Taxonomias e Tipos de Conteúdos com WordPress 3
Taxonomias e Tipos de Conteúdos com WordPress 3
 
Desmistificando o Framework da Zend
Desmistificando o Framework da ZendDesmistificando o Framework da Zend
Desmistificando o Framework da Zend
 
Desenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend FrameworkDesenvolvendo Aplicações com Zend Framework
Desenvolvendo Aplicações com Zend Framework
 
Desenvovelndo Aplicações com PHP, AJAX e Y!UI Yahoo User Interface
Desenvovelndo Aplicações com PHP, AJAX e Y!UI Yahoo User InterfaceDesenvovelndo Aplicações com PHP, AJAX e Y!UI Yahoo User Interface
Desenvovelndo Aplicações com PHP, AJAX e Y!UI Yahoo User Interface
 
Desenvolvendo Aplicativos com Zend Framework e banco de dados CDS/ISIS
Desenvolvendo Aplicativos com  Zend Framework  e banco de dados CDS/ISISDesenvolvendo Aplicativos com  Zend Framework  e banco de dados CDS/ISIS
Desenvolvendo Aplicativos com Zend Framework e banco de dados CDS/ISIS
 
Desenvolvendo aplicações PHP, AJAX e YUI! Yahoo User Interface
Desenvolvendo aplicações PHP, AJAX e YUI! Yahoo User InterfaceDesenvolvendo aplicações PHP, AJAX e YUI! Yahoo User Interface
Desenvolvendo aplicações PHP, AJAX e YUI! Yahoo User Interface
 
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User InterfaceDesenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
 

Clean Code e Refatoração