🧪 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ã. 🚀