2009-05-08 7 views
17

Ich habe kürzlich eine Webanwendung in Seaside + Squeak entwickelt, und ich fand es eine wunderbare Erfahrung. Seaside ist wirklich über alle anderen Frameworks hinweg, und ich habe das Gefühl, dass ich auf einer höheren Abstraktionsebene arbeite (über dem HTTP-Request/Response-Zyklus und dem HTML-Templating, mit dem andere Frameworks umgehen).Wann sollten Seaside-Komponenten verwendet und wann einfache Renderobjekte verwendet werden?

Das heißt, ich bin etwas verwirrt über Seaside-Komponenten. Ich musste vor kurzem eine Liste von Objekten auf einer Komponente anzeigen (ähnlich der stackoverflow Titelseite). Zuerst machte ich jedes Objekt zu einer Komponente (eine Unterklasse von WAComponent), aber das erwies sich als wirklich verschwenderisch, und ich musste # children dynamisch in der Elternkomponente setzen, damit es überhaupt funktionierte. Ich habe dann versucht, sie Objekte render (Objekte, die keine Unterklassen von WAComponent sind, und Rendern mit RenderOn: anstelle von renderContentOn:, wie Komponenten tun). Dies funktionierte, aber jetzt konnten sie nicht mehr auf den globalen Status im Session-Objekt zugreifen, wie es Komponenten können (mit #session). Dann entdeckte ich "WACurrentSession value", was jedem Objekt Zugriff auf das aktuelle Seaside-Session-Objekt gibt. Ich konnte sie nun dazu bringen, Objekte zu rendern. Außerdem entdeckte ich, dass ich viele meiner kleineren Komponenten auch als Renderobjekte umschreiben konnte.

Welche weiteren Gründe gibt es für die Verwendung von Komponenten über Renderobjekte neben dem Aufruf/Antwort- oder Backtracking-Status?

Antwort

16

Dies ist ein häufiger Punkt der Verwirrung für neue Seaside-Benutzer. Wir haben uns bemüht, dies in Seaside 2.9, das momentan in Alpha ist, klarer zu machen, aber ich werde versuchen, mich hier auf 2.8 zu konzentrieren, da es so klingt, als ob Sie es verwenden würden.

Zunächst einmal ist es richtig, dass Sie keine Komponente verwenden müssen, um auf die Sitzung zuzugreifen. Seaside 2,9 Moves #session bis zu einer neuen Klasse WAObject, die es für fast alle Seaside-Objekte (einschließlich Komponenten) zugänglich macht, aber Sie können sich definitiv auf WACurrentSession selbst jetzt in 2,8 beziehen.

Komponenten bieten ungefähr die folgenden Funktionen in 2.8:

  1. #renderContentOn: ist mit einer Instanz, was Renderer Klasse, die Sie in #rendererClass angeben genannt (statt, was auch immer Renderer verwendet wird, wenn das Objekt aufgefordert wird, sich zu machen)
  2. Ein Haken (#updateUrl:) die Aktualisierung zu ermöglichen, die URL vom Renderer verwendet Links
  3. Hooks erzeugen (#updateRoot:, #style, #script) aktualisiert den Kopfabschnitt des HTML-Dokuments
  4. die Fähigkeit, die Wurzel einer Anwendung sein, damit
  5. Hooks (#updateStates:, #states) Zustand Rückzieher zu erleichtern
  6. Ein Haken (#initialRequest:) Initialisierung auf Antrag zu ermöglichen, aus, dass die Session verursacht
  7. Eine Einrichtung (#children), um sicherzustellen, unter Ihnen alle Komponenten erstellt werden
  8. Die Fähigkeit, Dekorationen hinzufügen wird auch die oben Haken auf sie genannt haben
  9. Die Fähigkeit/Antwort zu zeigen/Anruf (verwendet Dekorationen)
  10. Einige Komfortmethoden (#inform:, #isolate:, usw.)

Wenn Sie keine der oben genannten benötigen, benötigen Sie keine Komponente. Wenn Sie eines der oben genannten benötigen, benötigen Sie so gut wie eine Komponente, es sei denn, Sie möchten die entsprechende Funktionalität für Ihre eigene Klasse implementieren.

Die einfachste Metrik ist wahrscheinlich: Wenn Sie beabsichtigen, das Objekt zwischen HTTP-Anfragen herumzuhalten, sollte es eine Komponente sein; Wenn Sie beabsichtigen, das Objekt wegzuwerfen und es auf jedem Rendering-Pass zu erstellen, muss es wahrscheinlich nicht sein. Wenn Sie sich eine Anwendung vorstellen, die Blog-Seiten anzeigt, haben Sie wahrscheinlich Komponenten für ein Menü, eine Blog-Rolle, den Blog-Text, jeden Kommentar und so weiter. Vielleicht möchten Sie das Lesen des Markups und der HTML-Generierung des Blogs herausfiltern, damit Sie verschiedene Markups oder andere Renderer unterstützen können und der Kommentar Components dasselbe Markup unterstützen könnte. Dies könnte mit einer Nicht-Component-Klasse erfolgen, die #renderOn: implementiert und von anderen Komponenten nach Bedarf erstellt und verwendet werden könnte.

Seaside 2,9 spaltet derzeit die obige Funktionalität auf, indem es WAPresenter Beton macht und WAPainter als seine Oberklasse einführt. 1-3 oben sind auf WAPainter und 4-7 auf WAPresenter implementiert, so dass Sie Ihre Wahl haben, was zu Unterklasse abhängig von Ihren Bedürfnissen. Außerdem werden viele Methoden von WAPresenter und WAComponent entfernt, um Endbenutzern das Verständnis zu erleichtern.

Hoffnung, das hilft.

+0

Vielen Dank für die ausführliche Antwort! –