🧪 1.2 Implementando uma nova funcionalidade

A evolução do negócio exige agora a busca pelo menor lance do leilão. Esta regra deve ser integrada ao componente Avaliador. Adicionamos uma nova condição para capturar o extremo inferior:

public class Avaliador {
    private double maiorDeTodos = Double.NEGATIVE_INFINITY;
    private double menorDeTodos = Double.POSITIVE_INFINITY;
 
    public void avalia(Leilao leilao) {
        for (Lance lance : leilao.getLances()) {
            if (lance.getValor() > maiorDeTodos) {
                maiorDeTodos = lance.getValor();
            }
            if (lance.getValor() < menorDeTodos) {
                menorDeTodos = lance.getValor();
            }
        }
    }
 
    public double getMaiorLance() { return maiorDeTodos; }
    public double getMenorLance() { return menorDeTodos; }
}
public class TesteDoAvaliador {
    public static void main(String[] args) {
        var joao = new Usuario("João");
        var jose = new Usuario("José");
        var maria = new Usuario("Maria");
 
        var leilao = new Leilao("Playstation 5");
 
        leilao.propoe(new Lance(joao, 300.0));
        leilao.propoe(new Lance(jose, 400.0));
        leilao.propoe(new Lance(maria, 250.0));
 
        var leiloeiro = new Avaliador();
        leiloeiro.avalia(leilao);
 
        System.out.println("Maior esperado: 400.0 | Real: " + leiloeiro.getMaiorLance());
        System.out.println("Menor esperado: 250.0 | Real: " + leiloeiro.getMenorLance());
    }
}

Tudo parece perfeito. Os valores batem e o sistema parece pronto para produção. Ou será que não?

🛡️ O Fantasma da Regressão

Considere um cenário sutilmente diferente (lances em ordem crescente):

public class TesteDoAvaliadorBug {
    public static void main(String[] args) {
        var joao = new Usuario("João");
        var jose = new Usuario("José");
        var maria = new Usuario("Maria");
 
        var leilao = new Leilao("Playstation 5");
 
        leilao.propoe(new Lance(maria, 250.0));
        leilao.propoe(new Lance(joao, 300.0));
        leilao.propoe(new Lance(jose, 400.0));
 
        var leiloeiro = new Avaliador();
        leiloeiro.avalia(leilao);
 
        System.out.println(leiloeiro.getMaiorLance()); // 400.0
        System.out.println(leiloeiro.getMenorLance()); // INFINITY?
    }
}

Fragilidade Blindada 🛡️

Em um ambiente de Engenharia de Elite, não deixamos a descoberta de bugs para o cliente final. Um bug em produção custa reputação e capital. Precisamos de uma forma determinística de garantir que o código que funciona hoje, continuará funcionando amanhã. 🚀


⬅️ Capítulo Anterior | Próximo Capítulo ➡️