¿Redux está usando un patrón de objeto de Dios desinfectado?


15

Mientras aprendía sobre Redux, me vino a la mente el patrón del objeto de Dios (o antipatrón): ambos tienen un solo objeto grande que contiene todos los datos y métodos de la aplicación para manipularlos. Pero Redux ha impuesto algunas restricciones, como hacer que el Objeto sea inmutable y que los eventos sean funciones puras, manteniendo una firma estricta.

Entonces surgió la pregunta: ¿Redux está usando una versión desinfectada del objeto de Dios? O, ¿hay algo que ver con que Javascript no sea OOP fuertemente tipado clásico?


2
Respuesta corta: no. Respuesta larga (en realidad una pregunta que debería conducir a la respuesta): ¿es una base de datos una clase? ¿O qué tal un sistema de archivos? ¿O qué tal un caché? ¿Son todos estos patrones de Dios también?
code4life

OMI, sí lo es. Está en la primera declaración sobre Redux: "Como los requisitos para las aplicaciones JavaScript de una sola página se han vuelto cada vez más complicados, nuestro código debe administrar más estado que nunca". - esto implica que debe administrar el estado de su aplicación como un blob. Creo que es un problema específico de las aplicaciones web y creado por los marcos pobres / nunca diseñados para esto que se utilizan para implementar aplicaciones web.
n13

@ n13: el hecho de que sea accesible desde una ubicación centralizada no significa que, por lo tanto, sea una gota masiva. Por ejemplo, se accede a mi base de datos de forma centralizada ( DbContext) pero sus datos internos se subdividen en partes más pequeñas (tablas, esquemas).
Flater

@Flater un gran blob con muchas subdivisiones sigue siendo un gran blob. Un modelo OO antiguo simple compartimenta todos los datos según sea necesario, lo que significa que cada objeto solo trata con una cantidad muy pequeña de estado / datos y todo es bastante simple. También podría almacenar todo en una estructura global gigante, pero no lo hace porque es un mal diseño de software. Software 101.
n13

@ n13 Puede separar la lógica en subclases (ocultas o no), cumplir tanto con la letra como con la intención de las buenas prácticas, al tiempo que centraliza el acceso a su lógica. Es el mismo argumento que usar microservicios frente a una sola API. Si bien los microservicios son una opción, eso no significa que una API REST "normal" sea, por lo tanto, una mala práctica.
Flater

Respuestas:


6

¿Qué es un objeto de Dios? De Wikipedia:

La mayor parte de la funcionalidad general del programa [que contiene un objeto de Dios] está codificada en un único objeto "que todo lo sabe", que mantiene la mayor parte de la información sobre todo el programa, y ​​también proporciona la mayoría de los métodos para manipular estos datos. Debido a que este objeto contiene tantos datos y requiere tantos métodos, su papel en el programa se vuelve divino (todo lo sabe y lo abarca todo).

La tienda Redux solo contiene un objeto de datos y solo requiere 2 o 3 métodos. A este respecto, es difícil imaginar pensarlo como un objeto de Dios. Definitivamente no es "todo lo sabe".

Ahora, si su reductor no está dividido en absoluto, si toda la lógica está en una función, entonces eso podría calificar, pero es una cuestión simple dividir el reductor en un montón de piezas más pequeñas para evitar la situación.


Creo que OP se pregunta si todos los reductores juntos , más la Tienda, cuentan como un "Objeto de Dios".
user949300

1
¿Todas las clases modelo de un programa juntas cuentan como un objeto divino?
Daniel T.

Yo diría que en la OOP tradicional no todos operan con los mismos datos de "todo", así que no, no lo están.
user949300

Los reductores tampoco funcionan todos con los mismos datos de "todo". Un reductor único es equivalente a una clase de modelo único. Los datos del reductor son equivalentes a los campos de la clase y las acciones son equivalentes a los métodos de la clase (es decir, cada declaración de caso es equivalente a un método específico).
Daniel T.

2

OMI, la pregunta anterior no debería surgir. Los conceptos de programación funcional no son comparables a los conceptos en OOPS, son solo formas diferentes de resolver el mismo problema. ingrese la descripción de la imagen aquí


55
¿Hiciste esta imagen de tabla solo para la pregunta? Creo que sería más adecuado como texto, para que se cargue más rápido y se pueda observar con un lector de pantalla
Phoenix

¿OOP no fomenta también el flujo de datos unidireccional? A menos que considere que OOP es simplemente el concepto de clases que pueden contener referencias entre sí, pero no un diseño adecuado donde las referencias bidireccionales generalmente indican un defecto de diseño.
Steven Jeuris

La mayoría de las cosas que mencionas en OOP y FP ni siquiera tienen nada que ver con la declaración del problema en la primera columna. La composición de funciones, por ejemplo, solo hace que sea más difícil entender la estructura del estado y sus cambios
Ski

Parece que prefieres FP, pero en mi opinión tu respuesta solo confirma un poco mi sensación de que es un objeto de Dios. Al igual que OMG, mi estado es muy complejo, porque estoy tratando todo el estado de todo el programa como una gran cosa. Si, eso es complejo. En OOP, tiene modelos de objetos lógicos que se actualizan, lo que no es un gran problema en absoluto. Si sucede de forma asíncrona, también está bien. Las vistas reflejan el estado del objeto y es muy simple en la práctica.
n13

0

La primera página deja en claro que Redux resuelve un problema específico de las aplicaciones web de una sola página:

Como los requisitos para las aplicaciones JavaScript de una sola página se han vuelto cada vez más complicados, nuestro código debe administrar más estado que nunca. (de Redux - Motivación)

Mi propia traducción es: las aplicaciones web y los marcos para crear aplicaciones web son desordenados y, como se ejecutan en un navegador, se enfrentan a un conjunto único de problemas que simplemente no surgen fuera de las aplicaciones web.

No me malinterpreten: no estoy diciendo que las aplicaciones web sean malas o que los marcos sean malos. Es solo que las páginas web y el paradigma completo sobre él nunca se diseñaron con aplicaciones en mente. Algunas aplicaciones web funcionan notablemente bien. Me encanta Google Docs, por ejemplo, es mejor que los equivalentes de aplicaciones nativas.

Pero Redux es solo una herramienta para gestionar los problemas que surgen cuando tienes que lidiar con las limitaciones y los problemas que surgen de la creación de aplicaciones web que se ejecutan en un navegador.

Para una aplicación iOS, o una aplicación nativa de cualquier tipo, no tiene sentido. El modelo de objetos maneja los cambios asíncronos y la interacción del usuario con facilidad. Siempre sabrás lo que está pasando. Renderizar diferentes estados no es un problema y está automatizado con MVC y eventos de actualización.

Nunca te enfrentas a una situación como las aplicaciones web.

** Si su arquitectura es mala, entonces nada puede salvarlo, ni siquiera Redux;)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.