Depois de 7 horas de aula em pleno Sábado, uma galera corajosa da #engsoftagil se reuniu para um coding dojo. O problema escolhido foi o FizzBuzz. A linguagem foi Ruby. Os detalhes sobre o dojô estão no dojobh.
Tenho alguns comentários:
- Gostei das discussões sobre qualidade do código vs. preocupação com performance. O pessoal decidiu por deixar explícita a intenção do código, o que achei muito bom.
- Mesmo nesse problema muito simples (FizzBuzz), precisamos fazer muitas decisões de design ao implementar. Isso, pra mim, invalida opiniões (principalmente de alguns gerentes por aí) de que programação é algo mecânico. Espero que o pessoal tenha tido o mesmo feeling.
- Surgiram questões interessantes relacionadas a TDD:
- devo escrever outro teste ou refatorar o código?
- como sei que meus testes são suficientes?
- para um problema com uma solução óbvia, posso escrever logo a solução que acho que é a correta e implementar os testes depois?
Todas essas são questões pertinentes e que mostra que o pessoal estava interessado e questionando TDD, mas com a mente aberta.
Uma coisa que eu deveria ter evitado e que pretendo melhorar da próxima vez é o respeito a par que está programando. Fiquei dando pitaco e sugerindo um monte de coisa. Isso atrapalha quem está programando. Devia ter ficado mais calado.
Faltou um teste que juntasse tudo, que Rondy começou a implementar mas não teve tempo de terminar, porque o pessoal começou a Retrospectiva. Coloquei no Gist o código de um possível teste de wrap-up.
def test_fizzbuzz_de_1_a_20 sequence = [] 1.upto(20) do |n| fizzbuzz = FizzBuzz.new(n) sequence.push(fizzbuzz.run) end assert_equal '1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16,17,fizz,19,buzz', sequence.join(",") end
Houve um efeito ruim da decisão de passar o número como parâmetro do construtor, que é ter que instanciar um objeto a cada número. Acho que, como não precisamos manter estado, seria melhor passar o número em questão como parâmetro do método run
, que executa a lógica do FizzBuzz.
Uma coisa interessante a se fazer, é implementar o FizzBuzz passando um Range como parâmetro. Aí, mudaria o código para retornar um Array, ao invés de um número ou String. Aí o código do teste acima iria ficar algo parecido com:
def test_fizzbuzz_de_1_a_20 fizzbuzz = FizzBuzz.new sequence = fizzbuzz.run(1..20).join(",") assert_equal '1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16,17,fizz,19,buzz', sequence end