Академический Документы
Профессиональный Документы
Культура Документы
"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!
Existem tantas definies como existem programadores no mundo. Que tal a opinio dos mais experientes?
"Elegante e eficiente, cdigo limpo faz bem apenas uma coisa." Bjarne Stroustrup, criador da linguagem de programao C++
"Parece ter sido escrito por algum que se importa." Michael Feathers, engenheiro snior na Object Mentor.
Ah! Mais o cronograma apertado! No tenho tempo para frescura! Meu chefe est me pressionando! Quero mostrar produtividade!
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?
Obviamente o mdico ir se recusar. Por que? Porque o mdico sabe mais que o paciente. Ele o profissional, sem mencionar que seria criminoso.
Perda drstica na produtividade. Problemas com o tempo de desenvolvimento. Alto acoplamento de cdigo. Muitos, MUITOS programadores!
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?
? e s s a l c r o p o g i Linhas de cd
Nmero de estru
turas de deciso?
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.
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.
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?"
Compare:
class Cliente { private Date dataDeNascimento; private Date dataDeCadastro; private double saldoDisponivelPorMes = 102,5; }
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
"A primeira regra de funes que elas devem ser pequenas. A segunda que precisam ser ainda menores." Robert Cecil Martin
De acordo com Robert C Martin e Kent Beck, uma funo deve conter no mximo 20 linhas (quando estiverem muito mal escritas...).
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.
As funes devem fazer uma coisa. Devem faz-la bem. Devem fazer apenas ela. O verdadeiro desafio descobrir o que realmente "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.
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.
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.
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.
Parmetros so complicados. Exigem conceitos. Do ponto de vista de testes, difcil escrever todas as combinaes possveis
Se sua promete fazer apenas uma coisa, mas ela tambm faz outras coisas escondidas, ela um efeito colateral.
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.
Se for necessrio este tipo de efeito colateral, deve-se deixar explcito no nome da funo qual a real inteno da funo.
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.
Passar um booleano para uma funo uma prtica horrenda, pois ele mostra explicitamente que o mtodo faz mais de uma coisa.
Se o valor for verdadeiro ele ir renderizar uma pgina de teste, se for falso (padro) ele ir renderizar a pgina normalmente.
Se o valor for verdadeiro ele ir renderizar uma pgina de teste, se for falso (padro) ele ir renderizar a pgina normalmente.
Uma funo deve fazer ou responder algo, mas no ambos. Uma funo somente pode alterar informaes ou retornar informaes de um objeto.
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
"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
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.
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.
// Verifica se o funcionario tem direito a todos os benefcios if (funcionario.ativo & HORA_TOTAL > HORA_MINIMA) && (funcionario.idade > 65)
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.
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.
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.
Use excees ao invs de cdigos de erros. Tratamento de exceo algo que um mtodo deve fazer. No use excees genricas.
Obriga o uso de if. Pode disparar NullPointerException. Considere: Lanar excees ou retornar um objeto de caso especial.
List<Empregado> empregados = getEmpregados(); if (empregados != null) { for (Empregado empregado: empregados) { pagamentoTotal += empregado.getSalario(); } }
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
Aplicao nativa (Android). Desenvolvido em Java. ORM. Padro de camadas. Model-View-Controller. Active Records.
Cronograma
Referncias
Implementation Patterns, Kent Beck, AddisonWesley, 2007. Clean Code, Robert C Martin, Alta Books, 2011.