Applying best practices - How to develop object-oriented…
Categories: Engenharia de software, Tecnologia, Test-Driven development
-
Ultimamente tenho estudado os autores clássicos de desenvolvimento ágil como Kent Beck, Martin Fowler, Robert C. Martin, etc e sofrido bastante. Tendo revisto meus projetos anteriores vi como minha modelagem se baseava no AnemicDomainModel como citado nesse artigo do Fowler.
Todos meus sistemas se pareciam como uma implementação do catálogo de patterns da SUN como se aquilo fosse uma interface.
Recentemente tive oportunidade de ser o responsável por todo o ciclo de desenvolvimento de um projeto pequeno com poucos requisitos funcionais, tinha ao todo uns 10 casos de usos tirando o aspecto CRUD da aplicação.
Pude realizar algumas experiências com conceitos que eu estava estudando a algum tempo e alguns que eu conhecia mas nunca tivera oportunidade de implementar.
Estou planejando um artigo mais elaborado sobre essa experiência, mas por enquanto posso adiantar alguns sentimentos sobre tudo isso.
Test-Driven Development
Essa prática do XP realmente é muito mais produtivo, eu sempre realizei os testes depois que as classes estavam desenhadas e até com métodos implementados, mas nesse sistema eu simplesmente aboli os diagramas de classes da UML, tentei fazer tudo radicalmente, fui separando as classes que eu achava que existiam no dominio da aplicação com cartões CRC, mas depois abandonei os cartões e fui direto para os “Unit Tests”, outro princípio que segui do XP foi fazer os casos de uso importantes primeiro, CRUD eu nem toquei, o banco de dados foi a última coisa que fiz. Fui criando os Unit Tests (UT) e os objetos foram surgindo naturalmente a partir dos requisitos funcionais que respondiam pela cerne do sistema, quando terminei o modelo praticamente tinha o sistema concluido, apesar de não ter nenhum select implementado. Nesse momento eu não sabia como seria a performance ou se teria que refatorar tudo aquilo para se adequar ao banco mas sentia que a aplicação estava terminada, diferente de todas as vezes onde fiz os CRUDs primeiro (que correspodem por cerca de 80% das aplicações ou mais) e praticamente via um túnel sem fim pela frente.
Domain Model
Meu modelo criou classes que a muito tempo não via (acho que desde os sisteminhas de locadora da faculdade). Minhas classes não são apenas tabelas em memória como repositório de dados, elas conhecem suas responsabilidades e seus dados como descrito nesse pattern do Fowler, acredito que as classes criaram até sentimentos (risos!).
Minha forma de pensar era um Bean que mais parecia uma tabela e que viajava da persistencia até o jsp, furando tudo pelo caminho, então dessa forma pude testar todo o sistema praticamente de minhas classes de testes no JUnit usando refactoring a todo momento e criando um modelo estável e que realmente está testado e terminado. Minhas classes sabem fazer o que tem que ser feito, ou seja, elas tem suas responsabilidades, olha só essa frase:
Procedural code gets information then
makes decisions. Object-oriented code tells
objects to do things.
— Alec Sharp
Acho que já to programando OO!
Design by contracts
Pude implementar os conceitos DbC nesse projeto, aliás quando voce desenvolve criando os testes primeiro isso flui quase que naturalmente, basta uma polida nos conceitos e pronto, um bom lugar para isso é esse artigo do Phillip Calçado sobre o tema.
Futuro
Algumas coisas não puderam ser implementadas como Dependency Injection, Aspect Oriented Programming, Pair Programming, Continuos Integration, etc. Esses conceitos vão ficar para os próximos projetos, pretendo adotar Hibernate e Spring na próxima e ver o que essas boas práticas são capazes, vou primeiro tentar convencer minha equipe a adotar o XP como metodologia, aí veremos, qualquer coisa esses conceitos já me foram uteis, aguardem novidades.



March 21st, 2006 at 10:32 am
Gostei muito.
Sobre as classes que criaram sentimentos, isto está relacionado aos padrões GRASP?
March 21st, 2006 at 10:47 am
Com certeza, alias o “Applying Uml And Patterns” do Craig Larman é meu livro de cabeçeira, as três edições, é interessante acompanhar a evolução das edições desse livro que cobre desde o processo unificado até os métodos ágeis.
Outro livro dele excelente é “Agile and Iterative Development - A Manager’s Guide”, esse ainda estou lendo. Passaria a tarde citando livros aqui
Um detalhe, a java magazine do mês passado trouxe uma matéria sobre TDD e a desse mês sobre Pair Programming muito interessante. Não pode faltar, Mundo Java passada com uma matéria do Phillip Calçado que vale o preço da revista tambem.
March 21st, 2006 at 10:54 am
a show de bola cara……eu ja estou adotando aos poucos o TDD, estou pegando um requesito aqui e estou fazendo ele todo em TDD ou tentando neh…..normalmente eu fazia os metodos cruds…e depois com o JUnit eu ia fazendo a regra de negocio chamando esses metodos ja prontos…agora eu to tentando fazer como o conceito de TDD fala….ir fazendo e construindo na hora…..to achando bem interessante……
Vlw
March 21st, 2006 at 11:31 am
Pois é, aconselho a ir fundo nessa abordagem, deixe o CRUD de sua aplicação para o fim e depois me diga o que ocorreu…

estou lendo alguns papers sobre XP com CMMI e PMBOK… isso quer dizer que voce não necessariamente precisa ser prolixo e usar UP para desenvolver algo com qualidade e bem documentado, XP não quer dizer desorganização como alguns pensam, mas sim se preocupar com o importante e cortar excessos, ser ágil antes de tudo!
Não digo que UML não é importante, mas voce amarrar seu desenvolvimento a passos imutáveis é muito insatisfatório e chato, uso UML quando preciso agora, as vezes para visualizar de forma ampla como está se formando um modulo, documentar o sistemas, etc. Estou pra ver um sistema que mantenha os diagramas atualizados com o código do inicio ao fim do sistema
e fazer um sistema sem UML começando da persistencia indo até as regras de negócio é suicidio e não gostar de fins de semana
March 21st, 2006 at 2:00 pm
Grande, muito massa Christiano. Interessante mesmo.
Você está seduzindo o nêgo com isso, mas continue se esforçando meu amigo, vamos ver se você me carrega para o *Domain Model*
Você poderia me passar uns sources, projetinhos simples onde você implementou isso, projetos do Eclipse se possível para eu dá uma sacada.
Temos que conversar pessoalmente sobre isso, quero você me mostrando isso tudo workando no Eclipse e tal, dae fica mais fácil de entender e enxergar as reais vantagens que você tá enxergar e eu não.
Então agente marca algo para essa semana, Triad e tal.. Seria bom você aprontar um projeto simples porém funcional para demonstrar e explicar para mim e o Handerson, ok ?
Se cuida !
“Moços bonitos como nós desenvolvem em Java!”
March 29th, 2006 at 12:07 pm
Apresenta isso no Sun Tech Days
É uma boa discussão e aprendizado