Вы находитесь на странице: 1из 85

Desenvolvimento profissional utilizando tcnicas de cdigo limpo

Marcello Torres de Oliveira Galhardo marcello.galhardo@gmail.com

"Para poder considerar a si mesmo um profissional, voc deve criar um cdigo limpo. No h desculpa racional para no dar o melhor de si." Robert Cecil Martin

Sumrio
- Introduo - Proposta de projeto - Cdigo limpo* - Software de anlise de cdigo fonte** - Concluso** - Cronograma - Referncias

* Ainda em desenvolvimento

Introduo
Alguns dizem que a programao deixou de ser uma preocupao. Dizem que devemos nos preocupar com modelos e requisitos. Outros que se a engenharia de software estiver bem elaborada, o cdigo estar bem escrito!

Introduo O que um bom cdigo?

Existem tantas definies como existem programadores no mundo. Que tal a opinio dos mais experientes?

Introduo Opinies sobre um bom cdigo

"Elegante e eficiente, cdigo limpo faz bem apenas uma coisa." Bjarne Stroustrup, criador da linguagem de programao C++

Introduo Opinies sobre um bom cdigo


"Simples e direto, pode ser lido como uma conversa, como uma prosa." Grady Booch, criador da modelagem de software UML.

Introduo Opinies sobre um bom cdigo

"Parece ter sido escrito por algum que se importa." Michael Feathers, engenheiro snior na Object Mentor.

Introduo Opinies sobre um bom cdigo


"Cada rotina que voc l faz o que voc espera." Ward Cunningham, criador do Wiki, cocriador da eXtreme Programming. Lder da comunidade Smalltalk.

Introduo Ainda no est convencido?

Ah! Mais o cronograma apertado! No tenho tempo para frescura! Meu chefe est me pressionando! Quero mostrar produtividade!

Introduo At aonde vai o profissionalismo

Responda!
Se voc fosse um mdico e um paciente exigisse que voc parasse com toda aquela lavao das mos na preparao a para a cirurgia?

Introduo At aonde vai o profissionalismo

Obviamente o mdico ir se recusar. Por que? Porque o mdico sabe mais que o paciente. Ele o profissional, sem mencionar que seria criminoso.

Introduo Qual o custo de um cdigo "ruim"?

Perda drstica na produtividade. Problemas com o tempo de desenvolvimento. Alto acoplamento de cdigo. Muitos, MUITOS programadores!

Introduo Ento, um cdigo bem escrito ...

...simples. ...elegante. ...eficiente.

Introduo Agora que voc entende...

Funcionar o mnimo que se deve esperar de um cdigo...

Proposta de projeto Objetivos de desenvolvimento

Analisar o que um cdigo limpo. Explicar o conceito de um cdigo limpo. Desenvolver um aplicativo que analise o cdigo fonte e d informaes de como melhora-lo.

Cdigo limpo

"Qualquer um conselhe escrever cdigo que um computador entende. Bons programadores, escrevem cdigo que humanos entendam." Martin Fowler

Cdigo limpo
i d c e d Linhas

Nm

ero d

? o d o t m gos por

e cl

ass

es?

Nmero

de mto

dos?

Como mensurar a qualidade de um cdigo?

? e s s a l c r o p o g i Linhas de cd

Nmero de estru

turas de deciso?

Cdigo limpo Nomes significativos

H nomes por todos os lados em um software. Nomeamos variveis, classes, funes, parmetros, pacotes, diretrios.... J que vamos fazer muito isso, devemos fazer isso muito bem.

Cdigo limpo Nomes que revelam seu propsito


Qual o propsito deste cdigo? public List<int[]> pegarCelulasMarcadas () { List<int[]> lista1 = new ArrayList<int[]>(); for (int[] x : umaLista) if (x[0] == 4) lista1.add(x); return lista1; }

Cdigo limpo Nomes que revelam seu propsito

Por que difcil dizer o que o cdigo faz? No h expresses complexas. O problema no a simplicidade do cdigo, mas seu aspecto implcito, isto , o contexto que no est explcito no cdigo.

Cdigo limpo Nomes que revelam seu propsito


Que tipos de coisas esto em umaLista? Qual a importncia de um item na posio zero na umaLista? Qual a importncia do valor 4? Como eu usaria a lista retornada?

Cdigo limpo Nomes que revelam seu propsito


E agora, qual o propsito?
public ListaDeCelulasMarcadas pegarCelulasMarcadas () { ListaDeCelulasMarcadas celulasMarcadas = new listaDeCelulasMarcadas(); for (Celula celula : tabuleiroDoJogo) if (celula.estaMarcada()) celulasMarcadas.add(celula); return celulasMarcadas; }

Cdigo limpo Nomes pronunciveis


Os seres humanos so bons com as palavras. Pode parecer tolo, mais todas as palavras so pronunciveis.
class DtaCli_Rcrd { private Date dNasc; private Date dCad; private double salDisMen = 102,5; }

Cdigo limpo Nomes pronunciveis

timo! A classe est pronta e voc j pode falar com seu amigo sobre o bug que encontrou nela, por exemplo: "Bem, aqui no dNasc, est tendo um problema no calculo do SalDisMen, t vendo?"

Cdigo limpo Nomes pronunciveis

Compare:
class Cliente { private Date dataDeNascimento; private Date dataDeCadastro; private double saldoDisponivelPorMes = 102,5; }

Cdigo limpo Nome de classes


Classes e objetos devem ter nomes com substantivos, como por exemplo: Cliente, Usuario, Conta, Produto e etc. Evite palavras muito usadas como Dados ou Info, palavras que lembrem palavras reservadas e jamais utilizem verbo na criao do nome de uma classe.

Cdigo limpo Nome de mtodos

Os nomes de mtodos devem ter verbos como inserir, realizar, apagar, salvar e atualizar. Devem-se nomear mtodos de acesso, alterao e autenticao segundo seus valores e adicionar os prefixos get, set ou is de acordo com o padro javabeans.
www.java.sun.com/products/javabeans/docs/specs

Cdigo limpo Nome de mtodos


Quando os construtores estiverem sobrecarregados, use mtodos de fbrica estticos com nomes que descrevam os parmetros. Usuario usuario = Usuario.encontrePeloId(23); melhor do que: Usuario usuario = new Usuario(23);

Cdigo limpo Use nomes passveis de busca


Utilizar nomes ruins causa vrios problemas a um software, e um dos piores a dificuldade de localiz-los. Ao utilizar bons nomes, voc otimiza a busca por um trecho especfico sem precisar parar em cdigos aleatrios com letras semelhantes! Alm disto, voc otimiza o Code Complete do editor de texto que esteja usando.

Cdigo limpo

"A primeira regra de funes que elas devem ser pequenas. A segunda que precisam ser ainda menores." Robert Cecil Martin

Cdigo limpo Funes pequenas

De acordo com Robert C Martin e Kent Beck, uma funo deve conter no mximo 20 linhas (quando estiverem muito mal escritas...).

Cdigo limpo Funes pequenas

No existe uma regra especfica ou algo que prove que funes pequenas so melhores. Essas afirmativas so baseadas em experincias prprias e relatos de outros profissionais no ramo.

Cdigo limpo Faa apenas uma coisa

As funes devem fazer uma coisa. Devem faz-la bem. Devem fazer apenas ela. O verdadeiro desafio descobrir o que realmente "uma coisa".

Cdigo limpo Faa apenas uma coisa

Se uma funo faz apenas aqueles passos em um nvel abaixo do nome da funo, ento ela est fazendo uma s coisa. Apesar de tudo, o motivo de criarmos a funo para decompor um conceito em uma srie de passos no prximo nvel de abstrao.

Cdigo limpo Um nvel de abstrao por funo

Para confirmar que uma funo faz apenas "uma coisa"deve ser verificado se todas as instrues dentro da funo esto no mesmo nvel de abstrao.

Cdigo limpo Um nvel de abstrao por funo

Vrios nveis de abstrao dentro de uma funo sempre gera confuso. Os leitores podem no conseguir dizer se uma expresso determinada um conceito essencial ou um mero detalhe.

Cdigo limpo Ler o cdigo de cima para baixo


Um cdigo deve ser lido de cima para baixo, como uma narrativa. Utilize sujeitos, verbos e predicados. Narrativas so frases em ordem coerente. V do nvel de abstrao mais alto, descendo at o mais baixo.

Cdigo limpo Parmetros de funes

A quantidade ideal de parmetros para uma funo zero (nula). Depois vem um (mnade), seguido de dois (dade). necessrio evitar trs (trade). Mais do que trs (polade), nunca devem ser usados.

Cdigo limpo Parmetros de funes

Parmetros so complicados. Exigem conceitos. Do ponto de vista de testes, difcil escrever todas as combinaes possveis

Cdigo limpo Evite efeitos colaterais

Se sua promete fazer apenas uma coisa, mas ela tambm faz outras coisas escondidas, ela um efeito colateral.

Cdigo limpo Evite efeitos colaterais

Acessar uma varivel global, por exemplo, causa um acoplamento do cdigo e torna o fluxo do sistema confuso. Mais por que o nome efeitos colaterais? Pela sua reao ao descobrir o motivo do cdigo no funcionar.

Cdigo limpo Evite efeitos colaterais

Se for necessrio este tipo de efeito colateral, deve-se deixar explcito no nome da funo qual a real inteno da funo.

Cdigo limpo Parmetros de sada

Os parmetros so comumente interpretados como entradas de uma funo. Se uma funo altera o estado de um parmetro, ela deveria alterar o estado do objeto que pertence.

Cdigo limpo Parmetros lgicos

Passar um booleano para uma funo uma prtica horrenda, pois ele mostra explicitamente que o mtodo faz mais de uma coisa.

Cdigo limpo Parmetros lgicos

paginaDebug = true; PaginaWeb paginaWeb = PaginaWeb.renderizaPagina(paginaDebug);

Se o valor for verdadeiro ele ir renderizar uma pgina de teste, se for falso (padro) ele ir renderizar a pgina normalmente.

Cdigo limpo Parmetros lgicos


public void configuraERenderizaPagina () { paginaWeb.configuraPagina(); return paginaWeb.renderizaPagina(); }

Se o valor for verdadeiro ele ir renderizar uma pgina de teste, se for falso (padro) ele ir renderizar a pgina normalmente.

Cdigo limpo Separao comando-consulta

Uma funo deve fazer ou responder algo, mas no ambos. Uma funo somente pode alterar informaes ou retornar informaes de um objeto.

Cdigo limpo Separao comando-consulta

public boolean set(String atributo, String valor); Essa funo define o valor de um atributo e retorna true se obtiver xito ou false se o atributo no existir. Isso levaria a instrues: if (set("nomeDeUsuario", "marcello_galhardo"))

Cdigo limpo Separao comando-consulta


Imagine do ponto de vista do leitor: Est sendo perguntado se o atributo "nomeDoUsuario" anteriormente recebeu o valor "marcello_galhardo"? Ou se "nomeDeUsuario" obteve xito em receber o valor "marcello_galhardo"?

Cdigo limpo

"Quando voc sentir a necessidade de escrever um comentrio, chegou o momento de voc re-escrever todo o seu cdigo." Brian W. Kernighan e P.J. Plaugher

Cdigo limpo Comentrios significam cdigo ruim


Uma das motivaes mais comuns para criar um comentrio um cdigo ruim. Construmos um mdulo e sabemos que est confuso e desorganizado. Estamos cientes da baguna, ento dizemos: "Oh, melhor inserir um comentrio!"

Cdigo limpo Comentrios significam cdigo ruim

No! melhor limpar seu cdigo.

Cdigo limpo Comentrios significam cdigo ruim

Cdigos claros e expressivos com poucos comentrios so mais legveis que muitos comentrios em um cdigo confuso. Ao invs de explicar a baguna, melhor limpar ela.

Cdigo limpo Explique-se no cdigo

Certamente h vezes em que no possvel se expressar direito no cdigo. Infelizmente devido a isso, muitos programadores assumem que o cdigo raramente um bom meio para se explicar.

Cdigo limpo Explique-se no cdigo

// Verifica se o funcionario tem direito a todos os benefcios if (funcionario.ativo & HORA_TOTAL > HORA_MINIMA) && (funcionario.idade > 65)

Qual voc gostaria de ver em um cdigo fonte?


if (funcionario.temDireitoATodosOsBeneficios())

Cdigo limpo Comentrios bons


Comentrios sobre licena. Comentrios de alerta. Comentrios para documentao. Necessidade de explicao de regra de negcio especfica.

Cdigo limpo Comentrios extremamente ruins

Poucas prticas so to condenveis quanto colocar o cdigo como comentrio. Um cdigo comentado nunca apagado, pois outros programadores acham que o cdigo importantes demais para no serem apagados.

Cdigo limpo Comentrios extremamente ruins


Houve uma poca em que explicar o cdigo em comentrio poderia ser prtico. Mais j faz anos que existem sistemas de controle de verso/cdigo fonte, que lembraram dos cdigos. Eu prometo que no perder seu cdigo.

Cdigo limpo Formatao


Aqui, existem trs regras essnciais: 1. As regras da linguagem de programao. 2. As regras do framework utilizado. 3. As regras do time de desenvolvimento.

Cdigo limpo Objetos e estruturas de dados

H um motivo para declararmos nossas variveis como privadas. No queremos que ningum dependa delas. Desejamos ter a liberdade para alterar o tipo ou a implementao seja por capricho ou impulso.

Cdigo limpo A Lei de Demeter

Um mtodo F de uma classe C s deve chamar os mtodos de:


1. C. 2. Um objeto criado por F. 3. Um objeto passado como parmetro para F. 4. Um objeto dentro de uma varivel de instncia de C.

Cdigo limpo A Lei de Demeter

Um mtodo no deve chamar os mtodos em objetos retornados por qualquer outra das funes permitidas. Em outras palavras, fale apenas com conhecidos, no com estranhos.

Cdigo limpo Use excees para tratar erros

Use excees ao invs de cdigos de erros. Tratamento de exceo algo que um mtodo deve fazer. No use excees genricas.

Cdigo limpo Use excees para tratar erros


if (deletaPagina(pagina) == E_OK) { if (registro.deletaReferencias(pagina.nome) == E_OK) { if (configChaves.deletaChaves(pagina.id)) == E_OK) { logger.log("pagina deletada!"); } else { logger.log("configChaves no foi deletado!"); } } else { logger.log("deletar referencias do registro falhou!"); } } else { logger.log("no foi possvel deletar a pagina"); return E_ERROR; }

Cdigo limpo Use excees para tratar erros


public void removeCompletamenteUmaPagina() { try { deletaPagina(pagina); registro.deletaReferencias(pagina.nome); configChaves.deletaChaves(pagina.id); } catch (DeleteFailedException e) { logger.log(e.getMessage()); } }

Cdigo limpo No retorne null de mtodos

Obriga o uso de if. Pode disparar NullPointerException. Considere: Lanar excees ou retornar um objeto de caso especial.

Cdigo limpo No retorne null de mtodos

List<Empregado> empregados = getEmpregados(); if (empregados != null) { for (Empregado empregado: empregados) { pagamentoTotal += empregado.getSalario(); } }

Cdigo limpo No retorne null de mtodos

List<Empregado> empregados = getEmpregados(); for (Empregado empregado: empregados) { pagamentoTotal += empregado.getSalario(); }

Cdigo limpo Use excees para tratar erros

Use excees ao invs de cdigos de erros. Tratamento de exceo algo que um mtodo deve fazer. No use excees genricas.

Cdigo limpo

"Deixe a rea do acampamento mais limpa do que como voc a encontrou." Boy Scouts of America

Cdigo limpo Equvocos da refatorao


Se no estiver quebrado, no conserte! Refatorao no oferece benefcios a curto prazo. Refatorao s funciona para equipes agis.

Cdigo limpo Aplicao exemplo: Agenda APK

Aplicao nativa (Android). Desenvolvido em Java. ORM. Padro de camadas. Model-View-Controller. Active Records.

Cdigo limpo Aplicao exemplo: Agenda APK


Anlise rpida: Maior classe: 80 linhas. Maior mtodo: 6 linhas. Nmero de if: 0. Nmero de for: 0. Nmero de for-each: 1.

Cronograma

Referncias

Implementation Patterns, Kent Beck, AddisonWesley, 2007. Clean Code, Robert C Martin, Alta Books, 2011.

Вам также может понравиться