2
respostas

Melhorando o código Controller LivroLogica.cs

Prof. boa noite!

No penúltimo video do cap.7, o Sr. mencionou que os código dos métodos 'ParaLer()', 'Lendo' e 'Lidos' eram bastante semelhantes e que poderíamos melhorar isso.. de fato.

Como poderíamos refartorar esse código deixando-o ainda mais limpo? Isso será abordado em algum outro curso? Caso negativo, o Sr. poderia mostrar como poderíamos melhorar esse código?

Agradeço pela atenção,

Hugo

2 respostas

Fala, Hugo, tudo bem?

Primeiro eu extrairia a recuperação dos livros para um método único onde faria o filtro com Linq. Depois faria todas as actions usarem esse método:

private IEnumerable<Livro> LivrosDaLista(string lista)
{
    var _repo = new LivroRepositorioCSV();
    return _repo.Todos
        .Where(l => l.Lista.Titulo == lista);
}

public IActionResult ParaLer()
{
    ViewBag.Livros = LivrosDaLista("Para Ler");
    return View("lista");
}

public IActionResult Lendo()
{
    ViewBag.Livros = LivrosDaLista("Lendo");
    return View("lista");
}

public IActionResult Lidos()
{
    ViewBag.Livros = LivrosDaLista("Lidos");
    return View("lista");
}

Mas ainda dá pra melhorar mais. O tipo da lista definido como uma string está muito frágil. O que acontece se eu chamar LivrosDaLista("Para ler")? Parece que vai funcionar mas como a letra L está minúscula nenhum livro será filtrado.

No curso de APIs eu inicio com um projeto um pouco mais robusto: usando enumerados para definir o tipo da lista e usando um banco de dados como repositório de livros.

Mas repara que o curso é sobre APIs, então eu não explico como cheguei nessa solução. Se quiser maiores detalhes abra outro tópico que te explico, ok?

Espero que tenha ajudado.

Abraços!

Fala, Hugo, tudo bem?

Primeiro eu extrairia a recuperação dos livros para um método único onde faria o filtro com Linq. Depois faria todas as actions usarem esse método:

private IEnumerable<Livro> LivrosDaLista(string lista)
{
    var _repo = new LivroRepositorioCSV();
    return _repo.Todos
        .Where(l => l.Lista.Titulo == lista);
}

public IActionResult ParaLer()
{
    ViewBag.Livros = LivrosDaLista("Para Ler");
    return View("lista");
}

public IActionResult Lendo()
{
    ViewBag.Livros = LivrosDaLista("Lendo");
    return View("lista");
}

public IActionResult Lidos()
{
    ViewBag.Livros = LivrosDaLista("Lidos");
    return View("lista");
}

Mas ainda dá pra melhorar mais. O tipo da lista definido como uma string está muito frágil. O que acontece se eu chamar LivrosDaLista("Para ler")? Parece que vai funcionar mas como a letra L está minúscula nenhum livro será filtrado.

No curso de APIs eu inicio com um projeto um pouco mais robusto: usando enumerados para definir o tipo da lista e usando um banco de dados como repositório de livros.

Mas repara que o curso é sobre APIs, então eu não explico como cheguei nessa solução. Se quiser maiores detalhes abra outro tópico que te explico, ok?

Espero que tenha ajudado.

Abraços!