Verwendet Redux ein bereinigtes Gott-Objektmuster?


15

Als ich über Redux lernte, kam mir das Gott-Objekt-Muster (oder Anti-Muster) in den Sinn - beide haben ein einziges großes Objekt, das alle App-Daten und Methoden zu ihrer Manipulation enthält. Redux hat jedoch einige Einschränkungen festgelegt, z. B., dass das Objekt unveränderlich ist und Ereignisse reine Funktionen sind, die eine strenge Signatur beibehalten.

Es stellte sich also die Frage, ob Redux eine bereinigte Version eines Gottesobjekts verwendet. Oder gibt es etwas damit zu tun, dass Javascript kein klassisches, stark typisiertes OOP ist?


2
Kurze Antwort: nein. Lange Antwort (eigentlich eine Frage, die zur Antwort führen sollte): Ist eine Datenbank eine Klasse? Oder wie wäre es mit einem Dateisystem? Oder wie wäre es mit einem Cache? Sind das auch alles Gottes Muster?
Code4life

IMO ja das ist es. In der ersten Aussage zu Redux heißt es: "Da die Anforderungen für einseitige JavaScript-Anwendungen immer komplizierter werden, muss unser Code mehr Status verwalten als jemals zuvor." - Dies bedeutet, dass Sie den Status Ihrer App als einen Blob verwalten müssen. Ich denke, es ist ein Problem, das für Web-Apps spezifisch ist und von den schlechten / nie dafür entwickelten Frameworks erstellt wurde, die zum Implementieren von Web-Apps verwendet werden.
n13

@ n13: Nur weil es von einem zentralen Ort aus zugänglich ist, heißt das noch lange nicht, dass es sich um einen riesigen Blob handelt. Der Zugriff auf meine Datenbank erfolgt beispielsweise zentral ( DbContext), die internen Daten sind jedoch in kleinere Teile (Tabellen, Schemata) unterteilt.
Flater

@Flater a big blob with many subdivisions is still a big blob. A plain old OO model compartmentalizes all data on a need-to-know basis which means each object only deals with a very small amount of state/data and everything is pretty simple. You could also store everything in one giant global struct but you don't do that because it's bad software design. Software 101.
n13

@ n13 Sie können die Logik in Unterklassen unterteilen (versteckt oder nicht), dabei sowohl den Buchstaben als auch die Absicht der guten Praxis einhalten und gleichzeitig den Zugriff auf Ihre Logik zentralisieren. Es ist das gleiche Argument wie bei der Verwendung von Microservices gegenüber einer einzelnen API. Obwohl Microservices eine Option sind, bedeutet dies nicht, dass eine "normale" REST-API daher eine schlechte Praxis ist.
Flater

Antworten:


6

Was ist ein Gottgegenstand? Aus Wikipedia:

Der größte Teil der gesamten Funktionalität eines [ein Gott-Objekt enthaltenden] Programms ist in einem einzigen "allwissenden" Objekt codiert, das die meisten Informationen über das gesamte Programm verwaltet und auch die meisten Methoden zur Bearbeitung dieser Daten bereitstellt. Da dieses Objekt so viele Daten enthält und so viele Methoden erfordert, wird seine Rolle im Programm gottähnlich (allwissend und allumfassend).

Der Redux-Speicher enthält nur ein Datenobjekt und erfordert nur zwei oder drei Methoden. Insofern ist es schwer vorstellbar, dass es sich um ein Gott-Objekt handelt. Es ist definitiv nicht alles Wissen.

Nun, wenn Ihr Reduzierer überhaupt nicht aufgebrochen ist, wenn sich die gesamte Logik auf eine Funktion bezieht , ist dies möglicherweise qualifiziert, aber es ist eine einfache Sache, den Reduzierer in ein Bündel kleinerer Teile aufzuteilen, um die Situation zu vermeiden.


Ich denke, OP fragt sich, ob alle Reduzierer zusammen und der Laden als "Gott-Objekt" gelten.
user949300

1
Zählen alle Modellklassen eines Programms zusammen als Gottobjekt?
Daniel T.

Ich würde argumentieren, dass in der traditionellen OOP nicht alle mit denselben "Alles" -Daten arbeiten, also nein, das sind sie nicht.
user949300

Reduzierer arbeiten auch nicht alle mit denselben "Alles" -Daten. Ein einzelnes Reduzierstück entspricht einer einzelnen Modellklasse. Die Daten des Reduzierers entsprechen den Feldern der Klasse und die Aktionen entsprechen den Methoden der Klasse (dh jede case-Anweisung entspricht einer bestimmten Methode.)
Daniel T.

2

IMO, die obige Frage sollte sich nicht stellen. Funktionale Programmierkonzepte sind nicht mit Konzepten in OOPS vergleichbar, sondern lediglich verschiedene Methoden zur Lösung desselben Problems. Bildbeschreibung hier eingeben


5
Haben Sie dieses Tabellenbild nur für die Frage gemacht? Ich denke, es wäre besser als Text geeignet, damit es schneller geladen und mit einem Screenreader beobachtet werden kann
Phoenix

Fördert OOP nicht auch den unidirektionalen Datenfluss? Es sei denn, Sie betrachten OOP einfach als das Konzept von Klassen, die Verweise aufeinander enthalten können, jedoch keinen ordnungsgemäßen Entwurf, bei dem bidirektionale Verweise in der Regel auf einen Entwurfsfehler hinweisen.
Steven Jeuris

Die meisten Dinge, die Sie unter OOP und FP erwähnen, haben nicht einmal etwas mit der Problemstellung in der ersten Spalte zu tun. Zum Beispiel erschwert die Funktionskomposition das Verständnis der Zustandsstruktur und ihrer Änderungen
Ski

Es scheint, dass Sie FP bevorzugen, aber in meinen Augen bestätigt Ihre Antwort nur ein bisschen mein Gefühl, dass es ein Gott-Objekt ist. Wie OMG ist mein Zustand so komplex, weil ich den gesamten Zustand des gesamten Programms als eine große Sache betrachte. Ja, das ist komplex. In OOP gibt es logische Objektmodelle, die aktualisiert werden, was überhaupt keine große Sache ist. Wenn es asynchron passiert, ist das auch in Ordnung. Ansichten spiegeln den Zustand des Objekts wider und es ist in der Praxis sehr einfach.
n13

0

Auf der ersten Seite wird deutlich, dass Redux ein Problem löst, das nur für Web-Apps mit einer Seite gilt:

Da die Anforderungen an einseitige JavaScript-Anwendungen immer komplizierter werden, muss unser Code mehr Status verwalten als jemals zuvor. (aus Redux - Motivation)

Meine eigene Übersetzung lautet: Web-Apps und die Frameworks für die Erstellung von Web-Apps sind chaotisch. Da sie in einem Browser ausgeführt werden, sind sie mit einer Reihe von Problemen konfrontiert, die nur außerhalb von Web-Apps auftreten.

Versteht mich nicht falsch - ich sage nicht, dass Web-Apps schlecht sind oder dass die Frameworks schlecht sind. Es ist nur so, dass Webseiten und das gesamte Paradigma unbestreitbar nie mit Blick auf Anwendungen entworfen wurden. Einige Web-Apps funktionieren bemerkenswert gut - ich liebe Google Docs zum Beispiel, es ist besser als die nativen App-Entsprechungen.

Redux ist jedoch nur ein Tool, mit dem Sie die Probleme bewältigen können, die beim Erstellen von Webanwendungen auftreten, die in einem Browser ausgeführt werden.

Für eine iOS-App oder eine native App jeglicher Art ist dies nicht sinnvoll. Das Objektmodell verarbeitet problemlos asynchrone Änderungen und Benutzerinteraktionen. Sie werden immer wissen, was los ist. Das Rendern verschiedener Status ist kein Problem und wird mit MVC und Aktualisierungsereignissen automatisiert.

Sie werden nie mit einer Situation konfrontiert, wie es Web-Apps sind.

** Wenn deine Architektur schlecht ist, dann kann dich nichts retten, nicht einmal Redux;)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.