Heim >Web-Frontend >js-Tutorial >Ein Fall gegen Formobjekte
Hinweis:Während diese Diskussion Ruby on Rails-Beispiele verwendet, gelten die Kernkonzepte allgemein für andere Sprachen und Frameworks.
Das Problem mit Formularobjekten: Eine kritische Betrachtung
Lassen Sie uns das oft mehrdeutige Konzept von „Formularobjekten“ in der Webanwendungsentwicklung klären. Basierend auf verschiedenen Artikeln (unten verlinkt) und praktischen Erfahrungen fehlt für Formularobjekte eine allgemein anerkannte Definition und ein allgemein anerkannter Zweck. Ihre Rollen werden häufig wie folgt beschrieben:
form_for
Helfer:Objekte, die speziell für die Verwendung mit dem form_for
Helfer von Rails entwickelt wurden.Als Hauptziel wird oft die Vereinfachung von Controllern durch die Handhabung der Parameterverarbeitung, der Typerzwingung und der grundlegenden Validierung genannt. Sie werden auch verwendet, um Aktualisierungen an mehreren ActiveRecord-Modellen aus einer einzigen Formularübermittlung zu kapseln und so das Verhalten von ActiveRecord nachzuahmen, um mit dem Controller vertraut zu sein. Sie werden als Möglichkeit zur Bewältigung komplexer Verhaltensweisen dargestellt.
Warum Formularobjekte verwenden? Die beabsichtigten Vorteile:
Zu den angeblichen Vorteilen gehören:
Das Fehlen einer klaren Definition führt jedoch zum ersten großen Problem: schlechte Kommunikation. Wenn in einer Codebasis auf Formularobjekte gestoßen wird, ist unklar, welche dieser Rollen (oder eine Kombination davon) sie erfüllen.
Im Wesentlichen zielen Formularobjekte darauf ab, die Komplexität des Codes durch Zentralisierung von Verantwortlichkeiten, typischerweise innerhalb der Modell- und/oder Controller-Ebenen, umzugestalten. Dies führt jedoch zum zweiten Problem: unbeabsichtigtes Aufblähen.
Der Nachteil: Das „Fat Form Object“-Anti-Pattern
Erwägen Sie eine gemeinsame Implementierung:
<code class="language-ruby">class SomethingController def create @form = MyForm.new(action_params) if @form.valid? @form.save! redirect_to "somewhere" else render :new end end def new @form = MyForm.new end end</code>
Dieser scheinbar unkomplizierte Ansatz verbirgt ein erhebliches Problem. Die öffentliche API des Formularobjekts (new
, valid?
, save!
und seine Präsenz in der Ansicht) zeigt, dass es Folgendes verarbeitet:
Dies verstößt gegen das Prinzip der Einzelverantwortung. Das Formularobjekt wird zu einem Repository für verschiedene Anliegen und zieht mit der Zeit mehr Verantwortlichkeiten nach sich (zusätzliche Ansichtshelfer, Validierungsregeln usw.). Es entwickelt sich zu einem „fetten Objekt“, das genau die Probleme widerspiegelt, die es lösen sollte.
Das dritte Problem: Redundanz
Eine größere Sorge besteht darin, dass diese Verantwortlichkeiten oft bereits von anderen Komponenten übernommen werden:
In mittleren bis großen Anwendungen sind diese Komponenten wahrscheinlich bereits vorhanden. Die Einführung von Formularobjekten mit überlappenden Verantwortlichkeiten führt zu unnötiger Komplexität und architektonischer Mehrdeutigkeit. Komplexität sollte direkt angesprochen und nicht verschleiert werden.
Eine vorgeschlagene Alternative: Ein modularerer Ansatz
Ein strukturierterer Ansatz verwendet dedizierte Objekte für jede Verantwortung:
<code class="language-ruby">class SomethingController def create @form = MyForm.new(action_params) if @form.valid? @form.save! redirect_to "somewhere" else render :new end end def new @form = MyForm.new end end</code>
Vorteile dieses Ansatzes:
Fazit:
Formularobjekte sind nicht grundsätzlich schlecht. Sie können von Nutzen sein, wenn sie mit Bedacht eingesetzt werden. Ihre vage Definition und ihre Tendenz zur Aufblähung der Verantwortung erfordern jedoch eine sorgfältige Prüfung. Bevor Sie ein Formularobjekt einführen oder verwenden, überlegen Sie, ob bereits vorhandene Komponenten die erforderliche Funktionalität beherrschen. Wenn Komplexität vorhanden ist, erfassen Sie sie durch klar definierte Einzweckobjekte, anstatt sie in einem schlecht definierten „Formobjekt“ zu verbergen.
Verlinkte Artikel (aus Gründen der Übersichtlichkeit neu formatiert):
Das obige ist der detaillierte Inhalt vonEin Fall gegen Formobjekte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!