Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 1 da Aula 3 - Praticando Test-Driven Development (TDD)

Oi pessoal, refatorei a lógica do método 'Propoe' usando Linq. Ficou bom? Teria alguma forma de refatorar ainda mais?

    public class Leilao
    {

        public string Descricao { get; set; }
        public List<Lance> Lances { get; private set; }

        public Leilao(string descricao)
        {
            this.Descricao = descricao;
            this.Lances = new List<Lance>();
        }

        public void Propoe(Lance lance)
        {
            Usuario usuarioDoUltimoLance = this.Lances
                                            .Select(s => s.Usuario)
                                            .LastOrDefault();

            if (lance.Usuario != usuarioDoUltimoLance)
            {
                bool jaPossui5Lances = this.Lances
                                        .Where(l => l.Usuario == lance.Usuario)
                                        .ToList()
                                        .Count >= 5;

                if (jaPossui5Lances == false)
                {
                    this.Lances.Add(lance);
                }
            }
        }

    }

Obrigado

2 respostas
solução!

Olá Henrique,

uma refatoração a mais que você poderia fazer é extrair as lógicas do propõe para métodos privados para adicionar mais semântica no código. Note que por enquanto seu método Propor está com 2 níveis de chave com um if dentro do outro, quando outra pessoa bater o olho no código talvez ela leve uns minutinhos para entender o que ele faz.

Por exemplo, esta lógica:

Usuario usuarioDoUltimoLance = this.Lances
                                   .Select(s => s.Usuario)
                                   .LastOrDefault();
lance.Usuario != usuarioDoUltimoLance

poderia virar um método UsuarioNaoDeuUltimoLance. Enquanto que essa aqui:

this.Lances
    .Where(l => l.Usuario == lance.Usuario)
    .ToList()
    .Count

pode ser um método QuantidadeDeLancesDoUsuario. Com esses dois métodos o seu Propoe ficaria praticamente um if só juntando a chamada desses dois, mais ou menos:

if(UsuarioNaoDeuUltimoLance() && QuantidadeDeLancesDoUsuario() < 5) 
     this.Lances.Add(lance);

talvez precise passar o usuário que deu o lance como parâmetro para fazer as lógicas do 2 métodos.

Oi Lucas, muito obrigado por todas as explicações. Ajudou muito!

Abraço.