Seu código mente?
Publicado em: quinta-feira, 8 de ago de 2019
Tags: Design

No telegram fazendo suporte à comunidade, acabei me deparando com um exemplo que me chamou muita a atenção. Um código que mentia.

E vamos às minhas colocações sobre a questão:

Sobre as abstrações

Eu citei abstrações em Abstrações – Tradeoffs e co-responsabilidade, também falei sobre a absorção de complexidade pela arquitetura em Oragon – Princípios de Design – Complexidade Reside na Arquitetura, ambos são bons textos auxiliares para esse esse texto aqui. Mas falando de abstrações, quando criamos abstrações, estamos tentando abstrair complexidade. Isso quer dizer, delegar à abstração alguma complexidade em prol de simplificar algo. Ou seja, entre as diferentes N formas de se usar algo, elegemos algumas para simplificar de forma a facilitar seu uso. Abstrações em geral são assim.

public IQueryable<T> GetBlaBlaBla(Expression<Func<T, bool> filterExpression) => return session
                                         .Query<T>()
                                         .Where(filterExpression)
                                         .ToList()
                                         .AsQueryable();

O código do acima é de uma abstração de um repositório genérico.

O problema em questão é que:

Ao retornar IQueryable<T> um consumidor espera que o método seja uma promessa de execução de uma query.

Essa expectativa não reflete a realidade. Na tentativa de facilitar o trabalho do consumidor, você está dando uma falsa ideia…

http://michaelis.uol.com.br/moderno-portugues/busca/portugues-brasileiro/mentira/

Entre 9 definições fico com 2 delas: “4 – Aquilo que dá falsa ideia” e “5 – O que ilude“.

Entenda, não há má vontade nenhuma no processo, mas não é pela boa vontade que o código deixa de ser uma mentira.

A solução óbvia para esse problema seria:

public IList<T> Metodo() => return session
                                         .Query<T>()
                                         .Where(filterExpression)
                                         .ToList();

Pronto, agora:

  • está claro que você está realizando a operação.
  • está claro que você está trazendo os dados para a memória.

Essa simples mudança evita que consumidores enganadamente achem que seu método faz algo que ele não faz. A versão anterior dava a entender que você teria como resultado uma promessa e não os dados todos materializados em memória.

A diferença para quem consome, é que IQueryable<T> sugere que você pode refinar sua consulta com novos filtros e novas projections, e conectado a um bom ORM, a impressão é de que isso acontecerá de forma otimizada em banco. No entanto quanto você chamou o ToList() acabou o amor! O dado veio imediatamente para a memória com o filtro que estava ali. Tudo que você fizer depois de chamar o ToList(), mesmo fazendo cast com AsQueryable(), será realizado em memória.

Luiz Carlos Faria

Mensagem do Autor

Espero que goste desse post. Não deixe de comentar e falar o que achou. 

Se acha que esse post pode ajudar alguém que você conheça, compartilhe!

 

Eventos passados

novembro 2020
outubro 2020
setembro 2020
agosto 2020
Nenhum evento encontrado!
Carregar Mais

Publicidade

Assine

0 comentários

Enviar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Lives

Fique de olho nas lives

Fique de olho nas lives no meu canal do Youtube, no Canal .NET e nos Grupos do Facebook e Instagram.

Aceleradores

Existem diversas formas de viabilizar o suporte ao teu projeto. Seja com os treinamentos, consultoria, mentorias em grupo.

Agenda & Eventos

outubro

novembro 2020

dezembro
DOM
SEG
TER
QUA
QUI
SEX
SAB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
Events for 1st novembro
Sem Eventos
Events for 2nd novembro
Sem Eventos
Events for 3rd novembro
Sem Eventos
Events for 4th novembro
Sem Eventos
Events for 5th novembro
Sem Eventos
Events for 6th novembro
Sem Eventos
Events for 7th novembro
Sem Eventos
Events for 8th novembro
Sem Eventos
Events for 9th novembro
Sem Eventos
Events for 10th novembro
Sem Eventos
Events for 11th novembro
Sem Eventos
Events for 12th novembro
Events for 13th novembro
Sem Eventos
Events for 14th novembro
Sem Eventos
Events for 15th novembro
Sem Eventos
Events for 16th novembro
Sem Eventos
Events for 17th novembro
Sem Eventos
Events for 18th novembro
Sem Eventos
Events for 19th novembro
Sem Eventos
Events for 20th novembro
Sem Eventos
Events for 21st novembro
Sem Eventos
Events for 22nd novembro
Sem Eventos
Events for 23rd novembro
Sem Eventos
Events for 24th novembro
Sem Eventos
Events for 25th novembro
Sem Eventos
Events for 26th novembro
Sem Eventos
Events for 27th novembro
Sem Eventos
Events for 28th novembro
Sem Eventos
Events for 29th novembro
Sem Eventos
Events for 30th novembro
Sem Eventos
Share This