Esta questão é na verdade um monte de problemas com o seu modelo de dados agrupado em um. Você precisa começar a desembaraçá-los, um de cada vez. Soluções mais naturais e intuitivas desaparecerão quando você tentar simplificar cada peça do quebra-cabeça.
Problema 1: você não pode depender da ordem do banco de dados
Suas descrições de classificação de seus dados não são claras.
- O maior problema em potencial é que você não está especificando uma classificação explícita no seu banco de dados, por meio de uma
ORDER BY
cláusula. Se você não é porque parece muito caro, seu programa tem um bug . Os bancos de dados podem retornar resultados em qualquer ordem, se você não especificar um; você não pode confiar no retorno coincidente de dados no pedido, apenas porque você executou a consulta algumas vezes e parece que sim. A ordem pode mudar porque as linhas são reorganizadas no disco, ou algumas são excluídas e novas são substituídas ou um índice é adicionado. Você deve especificar uma ORDER BY
cláusula de algum tipo. A velocidade é inútil sem correção.
- Também não está claro o que você quer dizer com ordem de inserção importante. Se você está falando sobre o próprio banco de dados, deve ter uma coluna que realmente rastreie isso e ela deve ser incluída na sua
ORDER BY
cláusula. Caso contrário, você tem bugs. Se essa coluna ainda não existir, você precisará adicionar uma. Opções típicas para colunas como essa seriam uma coluna de carimbo de data / hora de inserção ou uma chave de incremento automático. A chave de incremento automático é mais confiável.
Problema 2: Tornando a classificação de memória eficiente
Depois de garantir a devolução dos dados na ordem esperada, você pode aproveitar esse fato para tornar os tipos de memória muito mais eficientes. Basta adicionar um row_number()
oudense_rank()
coluna (ou equivalente de seu banco de dados) para definir o resultado de sua consulta. Agora, cada linha tem um índice que fornece uma indicação direta do que o pedido deve ser, e você pode classificá-lo na memória trivialmente. Apenas certifique-se de fornecer um nome significativo ao índice (como sortedBySomethingIndex
).
Viola. Agora você não precisa mais depender da ordem do conjunto de resultados do banco de dados.
Problema 3: Você precisa fazer esse processamento no código?
SQL é realmente muito poderoso. É uma linguagem declarativa incrível que permite fazer muitas transformações e agregações em seus dados. Atualmente, a maioria dos bancos de dados ainda suporta operações entre linhas. Eles são chamados de janela ou funções analíticas:
Você precisa extrair seus dados para a memória assim? Ou você poderia fazer todo o trabalho na consulta SQL usando as funções da janela? Se você pode fazer todo (ou talvez apenas uma parte significativa) do trabalho no DB, fantástico! Seu problema de código desaparece (ou fica muito mais simples)!
Problema 4: Você está fazendo o que para isso data
?
Supondo que você não possa fazer tudo isso no banco de dados, deixe-me ver se entendi. Você está tomando os dados como mapa (que é codificado por itens que você não deseja classificar), depois iterando sobre eles na ordem de inserção e modificando o mapa no local, substituindo o valor de algumas chaves e adicionando novos?
Sinto muito, mas que diabos?
Os chamadores não precisam se preocupar com tudo isso . O sistema que você criou é extremamente frágil. É preciso apenas um erro estúpido (talvez até cometido por você mesmo, como todos nós fizemos) para fazer uma pequena alteração errada e a coisa toda desmorona como um baralho de cartas.
Aqui está talvez uma ideia melhor:
- Faça sua função aceitar a
List
.
- Existem algumas maneiras de lidar com o problema de pedidos.
- Aplicar falha rápida. Lance um erro se a lista não estiver na ordem que a função exige. (Nota: você pode usar o índice de classificação do Problema 2 para saber se está.)
- Crie você mesmo uma cópia classificada (novamente usando o índice do problema 2).
- Descubra uma maneira de construir o mapa em ordem.
- Construa o mapa que você precisa internamente para a função, para que o chamador não precise se preocupar com isso.
- Agora itere sobre o que quer que esteja na representação de ordem e faça o que for necessário.
- Retorne o mapa ou transforme-o em um valor de retorno apropriado
Uma variação possível poderia ser construir uma representação classificada e criar um mapa de chave para indexar . Isso permitiria modificar sua cópia classificada no local, sem criar duplicatas acidentalmente.
Ou talvez isso faça mais sentido: livrar-se do data
parâmetro e processData
realmente buscar seus próprios dados. Em seguida, você pode documentar que está fazendo isso porque ele possui requisitos muito específicos sobre a maneira como os dados são buscados. Em outras palavras, torne a função proprietária de todo o processo, não apenas uma parte dele; as interdependências são fortes demais para dividir a lógica em partes menores. (Altere o nome da função no processo.)
Talvez isso não funcione para a sua situação. Eu não sei sem detalhes completos do problema. Mas conheço um design frágil e confuso quando o ouço.
Sumário
Penso que o problema aqui é, em última análise, que o diabo está nos detalhes. Quando começo a ter problemas como esse, geralmente é porque tenho uma representação inadequada dos meus dados para o problema que estou tentando resolver. A melhor solução é encontrar uma melhor representação e, em seguida, meu problema se torna simples (talvez não fácil, mas direto) de resolver.
Encontre alguém que entenda esse ponto: seu trabalho é reduzir seu problema a um conjunto de problemas simples e diretos. Então você pode criar um código robusto e intuitivo. Fale com eles. Um bom código e um bom design fazem você pensar que qualquer idiota poderia ter pensado neles, porque são simples e diretos. Talvez haja um desenvolvedor sênior com essa mentalidade com a qual você possa conversar.