Não só de código vive uma aplicação; junto a ele, temos também boas práticas para escrever código. Hoje, trago para vocês um pouco sobre o conceito de paginação.
Imagine que você tem uma base de dados pequena, com seus 10 clientes, e que sua API retorne todos em uma única requisição, por exemplo, chamando http://localhost:8000/api/v1/clients. Funciona, certo? Claro que sim. Mas agora imagine o seguinte cenário: dentro de alguns meses, seu projeto vai de 10 clientes para 1.000.000, e você novamente precisa chamar no seu sistema sua lista de clientes. Pegou a ideia? Imagine listar todos esses 1.000.000 de uma só vez, imagine o impacto disso no seu sistema, a lentidão que irá causar para os seus usuários ou até mesmo o consumo do seu hardware. E claro, leve em consideração o número de requisições por segundo que serão realizadas.
Para isso, temos a paginação, um conceito que, apesar de simples, auxilia de forma considerável não só no ganho de performance, mas também ajuda a evitar lentidão massiva e até travamentos de aplicativos em casos graves.
O que é paginação ?
Paginação trata-se da obtenção de resultados parciais de uma API, ou, de forma simples, quebrar um montante de dados em pequenas quantidades e retornar para o seu usuário. Como citado no exemplo anterior, imagine ter milhões de resultados no banco de dados e sua aplicação ser obrigada a retornar todos eles de uma vez.
Portanto, voltando ao exemplo, uma solução simples seria implementar uma paginação para retornar uma quantidade x de registros de clientes. Isso já evitaria a lentidão do sistema e ajudaria a evitar o consumo excessivo do seu hardware.
Implementação:
Para o exemplo abaixo, utilizei a linguagem de programação C# com o ASP.NET framework, utilizando o Entity Framework para a construção das queries SQL. Contudo, não se limite a isso, sinta-se livre para usar qualquer outra linguagem; foque em entender o conceito. Depois disso, a implementação se torna apenas uma questão de sintaxe.
A paginação possui como base alguns elementos primordiais para sua funcionalidade, são eles:
- O número da página atual
- O total de registros que devem ser retornados para o usuário final
Vamos iniciar criando um objeto para receber os parâmetros da query através do nosso controller:
public class ClienteParams
{
const int maxPageSize = 50;
public int PageNumber { get; set; } = 1;
private int _pageSize = 10;
public int PageSize
{
get { return _pageSize; }
set { _pageSize = (value > maxPageSize) ? maxPageSize : value; }
}
}
Primeiro, temos o maxPageSize, uma constante que representa o número máximo de registros que queremos retornar, ou seja, o usuário pode escolher buscar de 1 a 50 clientes por página na requisição. O PageNumber representa o número da página em que estamos, que por padrão recebe o valor 1, e a quantidade máxima pode variar com base na quantidade de registros que você tem na sua base de dados.
Agora vamos colocá-lo no nosso controller:
[HttpGet]
public IActionResult GetAll([FromQuery] ClienteParams clienteParams)
{
var clientes = _clienteRepository.GetAll(clienteParams);
return Ok(clientes);
}
Aqui, estamos usando o [FromQuery] para dizer ao framework que os dados de clienteParams estão vindo da query da requisição. Em seguida, chamamos o nosso repository para fazer a busca dos dados (caso você não saiba para que serve esse repository, tenho um post exclusivo para você, basta clicar aqui). Em seguida, apenas retorno o resultado.
Agora, vamos implementar a lógica de busca dos dados.
public IEnumerable<Cliente> GetAll(ClienteParams clienteParams)
{
return _appDbContext.Clientes
.OrderBy(c=>c.Id)
.Skip((clienteParams.PageNumber - 1) * clienteParams.PageSize)
.Take(clienteParams.PageSize)
.ToList();
}
Nesse cenário, estamos utilizando o método “Skip” para informar o número de registros que iremos pular, por exemplo, se estou querendo pegar os valores da página 23, será Skip((23-1) * tamanho da página). Em seguida, utilizo o método “Take” para informar a quantidade de valores que desejo coletar para retornar. Por fim, utilizo o “ToList()” para retornar uma lista desses valores.
Bem simples, não? De início pode parecer algo complicado de se implementar, mas vá em frente, tente por sua conta e verá como isso auxilia na melhora do seu código.
Conclusão
Apesar de simples, o conceito de paginação é algo de extrema importância quando estamos olhando em cenários em que a performance é o mais relevante. Saber quando e porque utilizá-la mostra que de fato você se importa com o crescimento e escalabilidade da aplicação, tornando-a capaz de suportar simples 10 clientes, ou até mesmo 1.000.000.
Nesse artigo você viu:
- Porque usar paginação
- O que é paginação
- Teoria da implementação
- Como implantar em C#