trando nosso ponto contrário. Em nossa opinião, não é possível criar
uma simples sequência de passos para se chegar ao melhor algoritmo
possível. Novamente, a experiência e conhecimento do desenvolvedor
são necessários.
Por fim, o ponto é que é realmente difícil saber o tamanho do passo a ser
dado, e como refatorar o código para que ele fique cada vez melhor. Sua
experiência deve ser levada em conta nessa hora.
Vantagem de fazer o teste passar rápido
Uma das vantagens de fazer o teste passar de maneira simples e rápida é
testar o teste. Seu teste é código; e ele pode ter bugs também.
Como não faz sentido
escrever um teste para o teste, uma maneira de
testá-lo é garantir que ele falhe quando precisa falhar, e passe quando
precisa passar. Ou seja, antes de começar a implementação, veja o teste
falhar. Com ele falhando, tente fazê-lo passar da maneira mais simples
possível, com o objetivo apenas de vê-lo ficando verde. Dessa forma, você
testou o teste.
46
Casa do Código
Capítulo 4. Simplicidade e Baby Steps
4.5
Conclusão
Neste capítulo, discutimos sobre os famosos baby steps. A ideia é possibilitar ao desenvolvedor andar na velocidade que achar necessário. Se o código que ele está
implementando naquele momento é complicado e/ou complexo, tomar passos de
bebê podem ajudá-lo a entender melhor o problema e a buscar por soluções mais
simples.
Mas, se o código que ele está trabalhando é algo que já está bem claro e não há
muitas dúvidas sobre a implementação, o desenvolvedor pode então dar um passo
um pouco maior, já que passos pequenos farão com que ele apenas diminua sua
produtividade.
No fim, a grande vantagem dos passos de bebê é poder aprender algo sobre o
código para que o mesmo possa ser melhorado. Se o desenvolvedor não está apren-
dendo nada, então talvez não haja razão para dar passos de bebê naquele instante.
Discutimos também que a modificação mais simples não é necessariamente a
solução mais simples que resolve o problema. Desenvolvedores devem buscar sim-
plicidade não apenas no nível de código, mas também no nível de design de classes.
Às vezes um simples if pode ser o código mais simples a ser escrito, mas talvez não
seja a melhor solução do ponto de vista do design.
Use baby steps com parcimônia. Um bom praticante de TDD sabe a hora de
aumentar ou diminuir o passo. Use os passos de bebê para o bem do seu projeto,
e não simplesmente porque é uma regra. Parafraseando Jason Gorman, "se fazer a
coisa mais simples significa fazer uso de muitos ifs ou switchs, muito provavelmente
você não entendeu TDD.
47
Capítulo 5
TDD e Design de Classes
Como dito anteriormente, TDD é bastante popular pelos seus efeitos positivos no
design das classes do nosso sistema. Neste capítulo, começaremos a discutir como
os testes podem efetivamente ajudar desenvolvedores a pensar melhor em relação às
classes que estão criando.
5.1
O Problema do Carrinho de Compras
Suponha agora que o projeto atual seja uma loja virtual. Essa loja virtual possui um
carrinho de compras, que guarda uma lista de itens comprados. Um item possui a
descrição de um produto, a quantidade, o valor unitário e o valor total desse item.
Veja o código que representa esse carrinho:
public class CarrinhoDeCompras
{
private IList<Item> Itens { get; private set; }
5.1. O Problema do Carrinho de Compras
Casa do Código
public CarrinhoDeCompras()
{
this.itens = new List<Item>();
}
public void Adiciona(Item item)
{
this.Itens.Add(item);
}
}
Um item também é uma simples classe:
public class Item
{
public string Descricao { get; private set; }
public int Quantidade { get; private set; }
public double ValorUnitario { get; private set; }
public Item(String descricao,
int quantidade,
double valorUnitario)
{
this.Descricao = descricao;
this.Quantidade = quantidade;
this.ValorUnitario = valorUnitario;
}
public double ValorTotal
{
get {
return this.ValorUnitario * this.Quantidade;
}
}
}
Agora imagine que o programador deva implementar uma funcionalidade que
devolva o valor do item de maior valor dentro desse carrinho de compras. Pensando
já nos testes, temos os seguintes cenários:
50
Casa do Código
Capítulo 5. TDD e Design de Classes
Se o carrinho só tiver um item, ele mesmo será o item de maior valor.
Se o carrinho tiver muitos itens, o item de maior valor é o que deve ser retor-
nado.
Um carrinho sem nenhum item deve retornar zero.
Seguindo TDD a risca, vamos começar pelo cenário
mais simples, que nesse caso
é o carrinho vazio. Vamos criar um teste para a classe MaiorPreco, responsável por
essa tarefa:
[TestFixture]
public class MaiorPrecoTest
{
[Test]
public void DeveRetornarZeroSeCarrinhoVazio()
{
CarrinhoDeCompras carrinho = new CarrinhoDeCompras();
MaiorPreco algoritmo = new MaiorPreco();
double valor = algoritmo.Encontra(carrinho);
Assert.AreEqual(0.0, valor, 0.0001);
}
}
Fazer esse teste passar é fácil; basta retornar zero.
public class MaiorPreco
{
public double Encontra(CarrinhoDeCompras carrinho)