Esta pregunta es en realidad un montón de problemas con su modelo de datos en uno. Debes comenzar a desenredarlos, uno a la vez. Las soluciones más naturales e intuitivas desaparecerán a medida que intente simplificar cada pieza del rompecabezas.
Problema 1: no puede depender del pedido de DB
Sus descripciones para ordenar sus datos no son claras.
- El mayor problema potencial es que no está especificando un tipo explícito en su base de datos, a través de una
ORDER BY
cláusula. Si no lo eres porque parece demasiado caro, tu programa tiene un error . Las bases de datos pueden devolver resultados en cualquier orden si no especifica uno; no puede depender de que coincida devolviendo datos en el orden solo porque ejecutó la consulta varias veces y se ve de esa manera. El orden puede cambiar porque las filas se reorganizan en el disco, o algunas se eliminan y otras nuevas toman su lugar, o se agrega un índice. Usted debe especificar una ORDER BY
cláusula de algún tipo. La velocidad no tiene valor sin corrección.
- Tampoco está claro a qué se refiere con importancia en el orden de inserción. Si está hablando de la base de datos en sí, debe tener una columna que realmente rastree esto, y debe estar incluida en su
ORDER BY
cláusula. De lo contrario, tienes errores. Si dicha columna aún no existe, entonces debe agregar una. Las opciones típicas para columnas como esta serían una columna de marca de tiempo de inserción o una clave de incremento automático. La clave de incremento automático es más confiable.
Problema 2: hacer que la memoria sea eficiente
Una vez que se asegure de que se garantiza que devolverá los datos en el orden que espera, puede aprovechar este hecho para hacer que los tipos de memoria sean mucho más eficientes. Simplemente agregue una columna row_number()
odense_rank()
(o el equivalente de su base de datos) al conjunto de resultados de su consulta. Ahora cada fila tiene un índice que le dará una indicación directa de lo que se supone que es el orden, y puede ordenarlo en memoria de manera trivial. Solo asegúrese de darle al índice un nombre significativo (como sortedBySomethingIndex
).
Viola. Ahora ya no tiene que depender del orden del conjunto de resultados de la base de datos.
Problema 3: ¿Necesitas hacer este procesamiento en código?
SQL es realmente realmente poderoso. Es un lenguaje declarativo sorprendente que le permite realizar muchas transformaciones y agregaciones en sus datos. La mayoría de los DB incluso admiten operaciones de fila cruzada hoy en día. Se llaman ventanas o funciones analíticas:
¿Incluso necesita extraer sus datos en la memoria de esta manera? ¿O podría hacer todo el trabajo en la consulta SQL utilizando funciones de ventana? Si puede hacer todo (o tal vez solo una parte importante) del trabajo en el DB, ¡fantástico! ¡Su problema de código desaparece (o se vuelve mucho más simple)!
Problema 4: ¿Estás haciendo qué data
?
Asumiendo que no puedes hacerlo todo en el DB, déjame aclarar esto. Está tomando los datos como un mapa (que está codificado por cosas por las que no desea ordenar), luego está iterando sobre ellos en orden de inserción y modificando el mapa en su lugar reemplazando el valor de algunas teclas y agregando ¿nuevos?
Lo siento, pero ¿qué diablos?
Las personas que llaman no deberían tener que preocuparse por todo esto . El sistema que ha creado es extremadamente frágil. Solo se necesita un error tonto (tal vez incluso hecho por usted mismo, como todos hemos hecho) para hacer un pequeño cambio incorrecto y todo se derrumba como una baraja de cartas.
Aquí quizás una mejor idea:
- Haga que su función acepte a
List
.
- Hay un par de formas en que puede manejar el problema de pedidos.
- Aplicar Fail Fast. Lanza un error si la lista no está en el orden que requiere la función. (Nota: puede usar el índice de clasificación del problema 2 para saber si es así).
- Cree una copia ordenada usted mismo (nuevamente utilizando el índice del problema 2).
- Encuentre una manera de construir el mapa en sí mismo en orden.
- Construya el mapa que necesita internamente para la función, para que la persona que llama no tenga que preocuparse por eso.
- Ahora repite lo que sea en orden de representación que tengas y haz lo que tengas que hacer.
- Devuelve el mapa o transfórmalo en un valor de retorno apropiado
Una posible variación podría ser construir una representación ordenada y luego crear un mapa de clave para indexar . Esto le permitiría modificar su copia ordenada en su lugar, sin crear duplicados accidentalmente.
O tal vez esto tiene más sentido: deshacerse del data
parámetro y hacer que processData
realmente obtenga sus propios datos. Luego puede documentar que está haciendo esto porque tiene requisitos muy específicos sobre la forma en que se obtienen los datos. En otras palabras, haga que la función sea propietaria de todo el proceso, no solo de una parte; Las interdependencias son demasiado fuertes para dividir la lógica en fragmentos más pequeños. (Cambie el nombre de la función en el proceso).
Quizás estos no funcionen para su situación. No lo sé sin todos los detalles del problema. Pero sí conozco un diseño frágil y confuso cuando escucho uno.
Resumen
Creo que el problema aquí es, en última instancia, que el diablo está en los detalles. Cuando empiezo a tener problemas como este, generalmente es porque tengo una representación inapropiada de mis datos para el problema que estoy tratando de resolver. La mejor solución es encontrar una mejor representación , y luego mi problema se vuelve simple (tal vez no fácil, pero sencillo) de resolver.
Encuentre a alguien que obtenga ese punto: su trabajo es reducir su problema a un conjunto de problemas simples y directos. Entonces puede construir código robusto e intuitivo. Habla con ellos. Un buen código y un buen diseño te hacen pensar que cualquier idiota podría haberlos pensado, porque son simples y directos. Tal vez hay un desarrollador senior que tiene esa mentalidad con la que puedes hablar.