Frage

ich mit Swiz gerade erst begonnen, und, wie es scheint, Swiz zwingen Sie Klassen mit schwacher Verkapselung zu erstellen. Swiz verlangt, dass alle Event-Handler, um die Öffentlichkeit zu sein, Ereignisse zu vermitteln.

Nehmen wir an, Komponente ‚A‘ ein paar Ereignisse auslöst, die ich in der Komponente ‚B‘ hören möchten. Traditionell werde ich nur Ereignis-Listener auf ‚A‘ in ‚B‘ und alle Event-Handler in ‚B‘ hinzufügen können privat gehalten werden. Wenn jedoch, ich bin mit Swiz, ich brauche alle Handler zu machen, zu vermitteln Veranstaltungen, öffentliche.

Bin ich hier etwas fehlt, gibt es eine Möglichkeit, dieses Problem zu umgehen. Ich wirklich, will nicht die öffentliche Schnittstelle meiner Klasse verschmutzen.

Danke.

War es hilfreich?

Lösung

Wie ich auf der Mailing-Liste erwähnt, gibt es keinen Weg darum herum, leider. Da es keine Möglichkeit gibt, private Mitglieder von Klassen zugreifen zu können, kann der einzige Weg B Private Event-Handler für Veranstaltungen nutzen von A genannt wird, aus B. wenn addEventListener () Da Swiz ist offensichtlich nicht in Ihren Klassen arbeitet, hat es keine Möglichkeit, die Mitglieder zugreifen zu können.

Swiz zielt darauf ab, den Anwendungscode zu halten, wie frei von Referenzen (einschließlich Vererbung) zu Swiz Klassen wie möglich. Daher können Sie daran denken, wie Ihre App „von außen“ zu konfigurieren. Im Gegensatz zu der JVM ermöglicht Flash Player einfach keinen Zugriff auf private Mitglieder, so dass für Swiz mit Ihrem Code zu interagieren, es öffentlich sein.

Andere Tipps

Sie können auch einen benutzerdefinierten Namespace erstellen, die sie nicht unbedingt öffentlich, aber nicht privat entweder macht. Ich benutze was Openflux ursprünglich tat:

[Mediate(event="UserEvent.LOGIN")]
metadata function loginHandler(user:User):void
{
    ... with namespace
}

[Mediate(event="UserEvent.LOGOUT")]
public function logoutHandler(user:User):void
{
    ... without namespace
}

Sie haben dann use namespace metadata in die Swiz Prozessoren und wahrscheinlich auf ihre Metadaten MediateQueue . Solange der Namensraum in den richtigen Klassen importiert wird, etwas, das dynamisch ist auf ein Verfahren bezieht funktioniert:

so im setUpMetadataTag Verfahren in MediateProcessor (oder an der Spitze der Klasse):

use namespace metadata;
// bean.source[mediateTag.host.name]
// service["loginHandler"] and service["logoutHandler"] both work
addMediatorByEventType( mediateTag, bean.source[ mediateTag.host.name ], eventType );

macht den Code sauber, und hält die Dinge von öffentlichen zu sein. Aber einige Leute denken, es ist zu viel Arbeit:)

.

Best, Lance

Für etwas außerhalb und aus der Klasse entkoppelt die Handler aufzurufen, kann das Verfahren nicht privat sein. So haben Sie zwei Möglichkeiten: machen sie öffentlich und lassen Swiz sie vermitteln (und ernten alle lose Kopplung), oder sie privat halten und nicht das Ereignis Mediation verwenden. Wenn Sie es lohnt sich denken, dass es (und die meisten tun), verwenden Sie es. Wenn Sie nicht, dies nicht tun.

„Swiz verlangt, dass alle Event-Handler, um die Öffentlichkeit zu sein, Ereignisse zu vermitteln.“

Das ist wahr, aber Swiz Stärke ist, dass es keine (mehr oder weniger) Design-Entscheidungen auf Sie zwingt, sondern bietet nur leistungsfähige Werkzeuge (Dependency Injection, Event Mediation, et al), die Sie wählen können, wo Sie sich bewerben denken angemessen ist.

Swiz Verwendung erfordert nicht die Verwendung des [Mediate] Tag überhaupt - man kann immer noch addEventListener () verwenden und von privaten Methoden hören, wie Sie normalerweise würde (wie ich sicher bin, bist du sehr wohl bewusst). Soweit ich sagen kann, ist die Swiz Veranstaltung Vermittlung in erster Linie für den Einsatz mit System / Anwendungsebene Veranstaltungen vorgesehen. Wenn Sie Ereignis-Listener innerhalb einer einzigen Komponente anrufen, oder in der Nähe der Familie Komponenten, würden Sie in der Regel die Standard-Event-Listener verwenden. Für die Kommunikation zwischen den einzelnen, sonst unabhängige Komponenten, können Sie die Nachricht mit Swiz des Mediators behandeln.

Kurz gesagt, in jedem Fall, wenn Sie den Zugriff auf private Veranstaltung Zuhörer haben (das heißt in der näheren Komponenten), würden Sie wahrscheinlich nicht verwenden [Mediate], um das Ereignis zu erfassen, und so konnten die Zuhörer privat bleiben. Wenn Sie mit dem [Mediate] Tag, ist die Event-Handler im Allgemeinen in einem völlig anderen Ort in der Anwendung (z Moderator -> Controller)., Wo es praktisch nicht in jedem Fall privat sein könnte

Ich kann etwas weg sein, aber das ist, wie es mir scheint. Swiz kann fördern schwache Verkapselung in einigen Situationen, aber für mich bietet es mehr Modularisierung insgesamt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top