TDD com Ruby
Aula 1
Esta aula tem dois objetivos: 1) introduzir o conceito e a prática de TDD e 2) aumentar a familiaridade dos(as) alunos(as) com Ruby.
O que é TDD?
Ciclo do TDD
Fonte: Dojo@SP
Coisas legais
Leituras Recomendadas
Exercício prático em estilo Coding Dojo
- Objetivo: constuir uma planilha eletrônica simples (inspiração: Test-First Challenge; fonte: TDD Problems)
- requisitos:
- colunas: A a Z, linhas: 1 a n
- deve ser possível armazenar um valor em uma célula e o ler de volta tanto o valor literal (e.g. formulas) quanto o valor final (resultado das fórmulas)
- fórmulas: x+y, x*y, sum(x:y), onde x e y são nomes de células (A1, B17 etc)
- quando uma célula é modificada células que conteem referências a ela devem ser atualizadas automaticamente.
- ferramentas:
- um editor de texto
- autotest
- shoulda
Nosso resultado
em anexo
Aula 2
Na primeira aula conseguimos eu aprox. 1 hora e meia constuir uma planilha eletrônica simples, com suporte a referência de células e fórmulas de soma. Mas alguns trechos do nosso código ficaram complexos, e para incluir cada novo
Então nossos objetivos nesta segunda aula foi:
-
refatorar o código existente para simplificar a introdução de novos tipos de fórmulas
-
incluir fórmula de multiplicação (=A1*A2)
-
incluir fórmula de soma da intervalos de células (=sum(A1:B10))
Para isso vamos discutir brevemente conceitos de refatoração e padrões de projeto.
Não conseguimos alcançar o último objetivo, mas conseguimos discutir coisas importantes:
- Refatoração: mover método, substituir acesso a atributo por chamada de método, substituir condicionais por polimorfismo
- Padrões de Projeto: Factory
Nosso resultado:
código em anexo
Leituras Recomendadas
- Refactoring (Martin Fowler)
- Extreme Programming Explained (Kent Beck)
- Agile Software Development (Robert C. Martin)
Aula 3
Quando localizamos a criação dos objetos Expression no método
create, por um lado nós melhoramos o código da classe
Spreadsheet mas por outro lados deixamos parte da complexidade do tratamento de expressões no método
create, de forma que ele sempre precisa ser alterado para incluir novos tipos de expressão. Isso viola o Princípio do Aberto-Fechado (Martin):
um módulo deve estar a aberto a extensão, mas fechado para modificações. Nesta aula nosso objetivo é:
- Refatorar a criação de objetos Expression de forma que o
Expression.create não precise ser modificado para incluir novos tipos de expressão
- Implementar um novo tipo de expressão: soma de intervalos de células (
=sum(A1:B2), que deve somar os valores de A1, A2, B1 e B2) ( Refatorar Soma e Multiplicação para extrair o comportamento comum para uma superclasse.
Resultado:
em anexo
Exercício compulsório: refatorar Soma de Intervalo (
RangeSum) para aproveitar o comportamento comum que foi extraído de Soma e Multiplicação. Notar as diferenças (e.g. um loop, dois loops etc) e modularizá-las apropriadamente.
-- terceiro
Script shell para contar o tempo no coding dojo:
- fish (tudo numa linha só):
while true; notify-send -u critical 'ACABOU O TEMPO; PILOTO SAI; CO-LILOTO VIRA PILOTO; ALGUEM SE TORNA CO-PILOTO'; sleep 7m; end
- bash (tudo numa linha só):
while true; do notify-send -u critical 'ACABOU O TEMPO; PILOTO SAI; CO-LILOTO VIRA PILOTO; ALGUEM SE TORNA CO-PILOTO'; sleep 7m; done
-- terceiro
Sobre a sessão de Coding Dojo:
Infelizmente a turma ficou um pouco acanhada pra vir programar na frente, não sei por quê. A maioria da turma não se dispôs a participar.
Mas apesar disso acho que a sessão foi muito legal, conseguimos avançar num problema que não é muito trivial e em apenas 1 hora e 20 minutos tínhamos uma implementação interessante de uma planilha eletrônica simples.
-- terceiro