em Ciência da Computação pela UFRJ! • Finalizando MBA em Garantia de Qualidade de Software pela Escola Politécnica da UFRJ! • Mantém um blog técnico sobre testes: stefanteixeira.com.br! • Certificado CTAL-TM / TA pelo ISQTB e CPRE-FL pelo IREB! Contatos:! • E-mail: [email protected]! • Twitter: twitter.com/stefan_teixeira! • Facebook: facebook.com/stefan.teixeira! • LinkedIn: linkedin.com/in/stefanteixeira! • GitHub: github.com/stefanteixeira! • SlideShare: slideshare.net/stefanteixeira
clean code when each routine you read turns out to be pretty much what you expected”! Ward Cunningham, criador do Wiki, do Fit e um dos signatários originais do Manifesto Ágil
um comentário, então ele não revela sua intenção."! ! int v1; //valor do produto à vista int v2; //valor total do produto a prazo int v3 = v2 - v1; //diferença entre valores à vista e a prazo ! int valorAVista; int valorAPrazo; int diferencaEntreValoresAVistaAPrazo;
letra! ‣ Usar apenas como variáveis de controle (em um “for”, por exemplo) ! • Evite usar valores “hardcoded" (constantes, strings, etc.)! ! assertEquals(“Cadastrado com sucesso”, cadastroPage.getMensagem()); ! public static final String MSG_SUCESSO = “Cadastrado com sucesso”; assertEquals( MSG_SUCESSO, cadastroPage.getMessage() );
is that they should be small. The second rule is that they should be smaller than that.”! ! “Se a gente não consegue dar um nome sucinto a uma classe, então provavelmente a classe é grande demais.”! !
longo a uma função. ! Um nome longo e descritivo é melhor do que um curto e enigmático. ! Um nome longo e descritivo é melhor do que um comentário.”! ! //Testa a inclusão de um usuário informando CPF inválido testeIncluirFalha() ! testeIncluirUsuarioComCPFInvalidoSemSucesso() !
boolean isSuite) throws Exception { if( isTestPage(pageData) ) { incluiSetupsETeardowns(pageData, isSuite); } return pageData.getHtml(); } ! O método faz apenas uma coisa?! ! 1) Determina se a página é uma página de teste! 2) Caso seja, inclui setups e teardowns! 3) Renderiza a página em HTML!
renderizarPaginaComSetupsETeardowns, verificamos se a página é uma página de teste e, caso seja, incluímos os setups e teardowns. Em ambos os casos, renderizamos a página em HTML. ! ! ! Observe que todos os passos da função do exemplo estão a um nível de abstração abaixo do seu nome.
• Veja se é possível extrair outra função com um nome que não seja uma reafirmação da implementação inicial.! ! ! “Se uma função executa passos que estão a apenas um nível de abstração abaixo do seu nome, então a função faz apenas uma coisa.”! ! “Funções que fazem apenas uma coisa não podem ser divididas em seções."
“The proper use of comments is to compensate for our failure to express ourself in code.”! ! “Innacurate comments are far worse than no comments at all. Truth can only be found in one place: the code.”! ! !
de login, passando usuário e senha como parâmetros e submetendo o form em seguida private void preencherESubmeterForm(String _usuario, String _senha) { usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit(); }
de código comentado não vai ter coragem de deletá- lo. Podem pensar que é algo importante.! ‣ Pratique o desapego. Temos ferramentas de controle de versão para isso. :)
devem estar próximas verticalmente, e a função que chama deve estar acima da que é chamada, se possível. ! ‣ Isso dá a seu código um fluxo natural.! ! • Afinidade Conceitual! ‣Quanto maior for a afinidade entre conceitos de funções, menor deve ser a distância vertical entre elas.
Good programmers write code that humans can understand.”! - Martin Fowler! ! “Refactoring is an iterative process full of trial and error, inevitably converging on something we feel is worthy of a professional."! - "Uncle Bob" Martin