"El número ideal de argumentos para una función es cero" es simplemente incorrecto. El número ideal de argumentos es exactamente el número necesario para permitir que su función esté libre de efectos secundarios. Menos que eso e innecesariamente haces que tus funciones sean impuras, lo que te obliga a alejarte del pozo del éxito y subir el gradiente de dolor. A veces, "tío Bob" es acertado con su consejo. A veces está espectacularmente equivocado. Su consejo de cero argumentos es un ejemplo de esto último.
( Fuente: comentario de @David Arno bajo otra pregunta en este sitio )
El comentario ha ganado una cantidad espectacular de 133 votos a favor, por lo que me gustaría prestar más atención a su mérito.
Hasta donde yo sé, hay dos formas distintas en la programación: programación funcional pura (lo que este comentario es alentador) y decir, no preguntar (que de vez en cuando también se recomienda en este sitio web). AFAIK estos dos principios son fundamentalmente incompatibles, cerca de ser opuestos entre sí: funcional puro puede resumirse como "solo valores de retorno, no tienen efectos secundarios", mientras que decir, no preguntar puede resumirse como "no devolver nada, solo tiene efectos secundarios ". Además, estoy un poco perplejo porque pensé que decir, no preguntar se consideraba el núcleo del paradigma OO, mientras que las funciones puras se consideraban el núcleo del paradigma funcional: ¡ahora veo funciones puras recomendadas en OO!
Supongo que los desarrolladores probablemente deberían elegir uno de estos paradigmas y atenerse a él. Bueno, debo admitir que nunca podría obligarme a seguir tampoco. A menudo me parece conveniente devolver un valor y realmente no puedo ver cómo puedo lograr lo que quiero lograr solo con efectos secundarios. A menudo me parece conveniente tener efectos secundarios y realmente no puedo ver cómo puedo lograr lo que quiero lograr solo devolviendo valores. Además, a menudo (supongo que esto es horrible) tengo métodos que hacen ambas cosas.
Sin embargo, a partir de estos 133 votos a favor, estoy razonando que actualmente la programación funcional pura es "ganadora", ya que se convierte en un consenso de que es superior contar, no preguntar. ¿Es esto correcto?
Por lo tanto, en el ejemplo de este juego lleno de antipatrón que estoy tratando de hacer : si quisiera ponerlo en conformidad con el paradigma funcional puro, ¡¿CÓMO ?!
Me parece razonable tener un estado de batalla. Dado que este es un juego por turnos, mantengo los estados de batalla en un diccionario (multijugador; puede haber muchas batallas jugadas por muchos jugadores al mismo tiempo). Cada vez que un jugador hace su turno, llamo a un método apropiado en el estado de batalla que (a) modifica el estado en consecuencia y (b) devuelve actualizaciones a los jugadores, que se serializan en JSON y básicamente les digo lo que acaba de suceder en el tablero. Esto, supongo, es una violación flagrante de AMBOS principios y al mismo tiempo.
OK, podría hacer que un método DEVUELVA un estado de batalla en lugar de modificarlo en su lugar si realmente quisiera. ¡Pero! ¿Tendré que copiar todo innecesariamente en el estado de batalla solo para devolver un estado completamente nuevo en lugar de modificarlo en su lugar?
Ahora, tal vez si el movimiento es un ataque, ¿podría devolver un HP actualizado a los personajes? El problema es que no es tan simple: las reglas del juego, un movimiento puede y a menudo tendrá muchos más efectos que simplemente eliminar una parte del HP de un jugador. Por ejemplo, puede aumentar la distancia entre los personajes, aplicar efectos especiales, etc.
Parece mucho más simple para mí simplemente modificar el estado en su lugar y devolver actualizaciones ...
Pero, ¿cómo abordaría esto un ingeniero experimentado?