JArrighetti / PdepUTN

MIT License
0 stars 0 forks source link

Repetición de código al ver el mejor o peor elemento de una lista #12

Open sanuzzi opened 6 years ago

sanuzzi commented 6 years ago

Presten atención a su código:

billeteraMasRica ... = maximum (map(...) lista)

quienesMasRico ... = fromJust (find (...) lista)

billeteraMenosRica ... = minimum (map(...) lista)

quienEsMenosRico ... = fromJust (find (...) lista)

buscarPeorBloqueDeUnUsuarioEnUnaBlockChain ... = fromJust (find (...) blockChain)

¿Se nota la repetición de lógica? Es más, las condiciones también repiten en algunos casos.

Es más, lo del peor bloque define mucha más lógica, que podría eliminarse en buena parte si tuviesen mejores abstracciones.

Hagan una abstracción mejorada para saber el máximo de un conjunto según un criterio, y también saber el mínimo reutilizando el máximo con alguna variación que le apliquen al criterio.

Luego, reutilicen esos 2 para todo lo que deban definir.

sanuzzi commented 6 years ago

Fíjense cómo les quedaron las condiciones:

maximoEntreDosUsuariosDespuesDeUnBloque bloque arg1 arg2
    | unNúmero > otroNúmero = arg1
    | otherwise  = arg2

minimoEntreDosUsuariosDespuesDeUnBloque bloque arg1 arg2
    | unNúmero > otroNúmero = arg1
    | otherwise  = arg2

peorBloqueDeUnUsuario usuario arg1 arg2
    | unNúmero > otroNúmero = arg1
    | otherwise  = arg2

Todo esto se repite:

... arg1 arg2
    | unNúmero > otroNúmero = arg1
    | otherwise  = arg2

¿No podrían ahorrarse esa repetición de las guardas de alguna forma?

En definitiva, para cada caso, lo único que les importa es un número y en base a eso podría existir una lógica externa que se quede con uno o con otro en base a dicho número.

Por otro lado, el primer y segundo caso preguntan algo casi idéntico, esperaría que uno pueda reutilizar directamente el otro al multiplicar por -1 o algo similar.

sanuzzi commented 6 years ago

Se sigue repitiendo, abstraigan a algo mejor. Por ejemplo, lo que dijo víctor, "máximoSegún"

Regalo... máximoSegún criterio lista = fromJust (find (esElMejorDeTodos criterio lista) lista)

esElMejorDeTodos criterio lista elMejor = all (\unoPeor -> criterio elMejor >= criterio unoPeor) lista

quienEsMenosRico bloqueAAplicar usuarios = mínimoSegún (billeteraDeUnUsuarioDespuesDeUnBloque bloqueAAplicar) usuarios