Frage

Ich habe C ++ ereignisgesteuerte geschrieben apps MFC für GUI-Tasten, und ich verwende HTML Veranstaltungen wie onmousedown einige Javascript in einer Webseite auslösen. Die Idee der ereignisgesteuerte Programmierung ist intuitiv, wenn Sie die Schnittstelle verwenden und Ereignisse hartcodiert werden.

Ich weiß, wie einen Funktionszeiger in C zu verwenden, und ich sehe, wie Windows verwendet sie eine Ereignisschleife zu laufen. Ich kann Code schreiben, um dynamisch eine andere Funktion aufrufen.

Mein Problem ist, bewegt sich weg von Compile-Zeit und in der Laufzeit. Ich spreche hier jede Sprache, aber wenn Sie eine Sprache benötigen, wählen Sie Javascript oder PHP, wie ich sie am meisten in diesen Tagen verwenden. Ich habe nicht einen Griff überhaupt, wie ich mein eigenes Event-Objekt verwenden könnte etwas getan. Es ist einfach nicht ein Konzept, das ich bekommen. Und da ich sie nicht, ich weiß nicht, was ihre praktische Anwendung sein könnte.

Zum Beispiel, ich nehme an, dass, wenn ich wollte ein benutzerdefiniertes Turn-basiertes Spiel machen, dass ich Ereignisobjekte verwenden könnte eine Wirkung von einiger Spiel-Stück Fähigkeit zu vertreten, dass nur muss „passieren.“

Kann mir jemand eine einfache Verwendung von benutzerdefinierten Ereignissen? Oder Situationen, in denen es sinnvoll oder praktisch? Hängt es weitgehend von der Sprache und Umgebung und wie sie die Ereignisse behandelt werden? Eine Javascript Antwort wäre gut, aber ich lese viele Sprachen.

Sorry, ich bin nur mangelhaft in dieser Hinsicht und müssen einige praktische, Fortgeschrittene (Zwischen?) Einsicht. Es ist wie Zeiger in C. I „erhalten“ Zeiger und wie sie sind dein Freund. Aber es gab eine Zeit, wo ich nicht, und viele Leute, die ich noch nicht kenne. Es ist einfach, wenn Sie es erhalten, bekomme ich einfach nicht individuelle, dynamische Ereignisse, die Art und Weise.

War es hilfreich?

Lösung

Wenn wir über ereignisorientierte Programmierung sprechen, sprechen wir in der Regel über eine oder mehr Implementierungen des Beobachter-Entwurfsmuster . Und ein Ziel des Betrachters Entwurfsmuster ist lose Kopplung zwischen Objekten

Das ist wohl nicht viel bedeutet, ohne ein gutes Beispiel, und es gibt sicherlich viele gute da draußen; Ich bezweifle Mine wird die beste von ihnen sein, aber ich werde ein Gleichgewicht gerät es dennoch nehmen. Stellen Sie sich zwei Objekte. Ein Ziel will wissen, wenn etwas mit dem anderen Objekt geschieht, so kann es tun, etwas selbst - vielleicht den Hund der Familie, Rover, will Dad an der Tür begrüßen, wenn er mit der Arbeit nach Hause kommt. Es gibt ein paar Möglichkeiten, wie Sie dieses Szenario programmieren könnte, nicht wahr?

  • Stellen Sie sicher, Dad einen Verweis auf Rover hat, und wenn er nach Hause kommt, ruft Rover greetDatAtTheDoor () -Methode, oder

  • Rover Geben Sie einen Verweis auf Papa, hören für onArriveHome Veranstaltung Dad, und wenn es feuert, Anruf greetDadAtTheDoor () intern.

Auf der Oberfläche kann es nicht scheinen, viel Unterschied zwischen den beiden zu sein, aber tatsächlich, Dad hat einige der Umsetzung der Rover in ihm brannte; einmal in Rover, und dann wieder in Dad: wenn Rover-Implementierung aus irgendeinem Grunde ändern mußte, würden wir Änderungen an zwei Stellen machen. Keine große Sache, vielleicht, aber immer noch nicht ideal.

Nun stell dir vor Mom will auch Dad begrüßen. Und die Katze, Mr. Bigglesworth, der nicht Dad mag sehr viel, möchte sicherstellen, er ist nicht in der Nähe, so dass er lieber nach draußen gehen. Und ein Nachbar, Joe, will wissen, wann Papa nach Hause kommt, so kann er ihn Bug darüber zwanzig Dollar Dad ihm schuldet. Wie können wir für all diese Szenarien berücksichtigen, und die zusätzlichen diejenigen, die würden unweigerlich auftauchen? Platzieren von Verweisen auf Mamas greetHusband () -Methode, die getOutNow Katze () -Methode, die greetDadAtTheDoor Hund () -Methode, und Joes goGetMyMoney () -Methode in Definition Papas Klasse würde schnell durcheinander zu bringen für Dad - und für keinen guten Grund, da alle Dad wirklich braucht, zu tun, selbst, wird nach Hause kommen. Mom, der Hund, die Katze, und der Nachbar wollen nur benachrichtigt werden, wenn das geschieht, so können sie ihre internen Implementierungen tun, was erforderlich ist.

Sprachen handhaben, die Besonderheiten dieses Materials in unterschiedlicher Weise, aber wie Sie sehen, wenn Sie um Start googeln, in der Regel das Muster beinhaltet es ein Array ist, oder Array-ähnliche Struktur, auf der Veranstaltung „Dispatcher“ (in diesem Fall Dad - dh das Objekt alle anderen interessierten in) und die „Abonnenten“ (zB Mom, die Katze, Rover und Joe) alle „registrieren“ durch eine öffentlich ausgesetzt Methode auf dem Dispatcher aufrufen und in Verweise auf sich selbst - Referenzen, die am Ende, in irgendeiner Form, in Papas Array von „Abonnenten“. Dann, wenn Papa nach Hause kommt, er „Versendungen“ ein Ereignis - das „Ich bin zu Hause“ Ereignis, sagen -, die im Wesentlichen eine Funktion, die über jedem seiner Teilnehmer-Schleifen und ruft sie mit einigen öffentlich zugänglichen Methode ihrer eigenen - nur es ist eine Methode, deren Name Dad nicht kennt, nicht zu wissen, denn der Hörer vorgesehen, wenn er / sie / es gibt sie in.

Da ich zufällig meist codieren in diesen Tagen Actionscript, hier ist, wie es in meiner Welt aussehen könnte - sagen wir, wie aus meiner Mom Klasse deklariert:

var dad:Dad = new Dad();
dad.addEventListener(DadEvent.ARRIVED_HOME, greetHusbandAtDoor);

private function greetHusbandAtDoor(event:DadEvent):void
{
   // Go greet my husband
}

In Dad, dann alles, was ich tun, wenn ich nach Hause komme, ist:

dispatchEvent(new DadEvent(DadEvent.ARRIVED_HOME));

... und weil Flash die ereignis Dispatching und Benachrichtigungsdetails für mich behandelt (auch hier jeder tut es ein bisschen anders, aber intern, folgt Flash den konzeptionellen Modell, das ich beschrieben habe), mein Vater kommt nach Hause, und jeder Familienmitglied tut, was sie unterschrieben autom zu tunmatisch.

Wir hoffen, das erklärt, die Dinge ein wenig - was für Event-Denken aussieht, was für lose Kopplungsmittel, warum es wichtig ist, und so weiter. Viel Glück!

Andere Tipps

In einem kompilierten Langauge, schreiben Sie Ihre eigene Ereignisschleife. In einer Runtime-Sprache, es ist bereits von der Host-Umgebung implementiert, und der Programmierer bekommt nur eine abstrahierte Schnittstelle in die Systemereignisse. Sie sehen nie die Ereignisschleife.

Es gibt zwei Facetten für den Aufbau Funktionalität mit Ereignissen. Die erste ist die Festlegung der Bedingungen, unter denen ein Ereignis ausgelöst wird. In Javascript im Browser gibt es kein einziges „mousedown-“ Ereignis. Es gibt in der Tat eine für jedes Element auf der Seite. In diesem Fall wird Feuer die Bedingung für, wenn einer von ihnen basiert sowohl auf der Position des Mauszeigers, und ob die Maustaste aus dem oben Zustand in den Down-Zustand nur geschaltet hat. Dieser Zustand kann mehrere Ereignisse führen zu feuern. (Im Browser gibt es etwas namens Ereignis „sprudeln“, die im Zusammenhang mit dieser ist. Aber das ist außerhalb des Geltungsbereichs hier).

Die andere Facette ist die Event-Handler. Ein Ereignis geschieht unabhängig davon, ob es ein Handler für sie oder nicht. die Handler Bereitstellung ist bei Ihnen. In JavaScript sind Funktionen erstklassige Werte. Sie erhalten während der Laufzeit definiert, bei nicht kompilieren zeit So gibt für Zeiger keine Notwendigkeit oder Tabellen springen. Sie erstellen eine neue Funktion zur Laufzeit, und ordnen Sie sie auf eine spezielle Eigenschaft, dass die Host-Umgebung sucht, wenn ein bestimmtes Ereignis ausgelöst wird.

so auf Stack-Überlauf, wird es ein Event-Handler werden auf jedem der Pfeil nach unten der „Onclick“ Ereignisse, die auf den Pfeil rot wird, verringert eine Zahl, überprüft eine andere Variable und zeigt bedingt eine Benachrichtigung. Dann, wenn der Handler RÜCKKEHR, gibt er die Steuerung des Threads an den Browser, und der Benutzer kann hallelujah wieder mit dem Browser interagieren. (Alle Interaktionen aufhören, während ein Ereignis behandelt wird, so dass Sie lieber es schnell machen). Hier ist ein Beispiel für die jQuery-Bibliothek verwendet wird.

jQuery("a .downarrow")
.click(function(e){ e.target.style.color="red" /* ... do other things */ });

oder in raw Javascript (Version 1.6) kann es sein,

Array.prototype.slice.apply(document.getElementsByTagName("a"))
.filter(function(o){ return !!(/downarrow/).exec(o.className)})
.forEach(function(o){ 
    o.onclick= function(e){ 
        e.target.style.color="red" /* ...do other things * / 
    }
 });

Es ist wirklich so einfach. Der Hauptgrund, Sie so etwas tun würden, ist es asynchrone Interaktion ermöglicht. Eine GUI-Anwendung nicht fortschreitet in einer geraden Linie, Schritt für Schritt. Es muss reagieren dynamisch auf die Eingabe des Benutzers. Events sind eine Möglichkeit, das Aussehen einer Multi-Thread-Anwendung Art von Fälschung. Es kann für den Benutzer sieht, dass viele Dinge geschehen gleichzeitig, ohne sie zu stören.

Sie können eine Bibliothek verwenden, um ein benutzerdefiniertes Ereignis zu definieren. Dies würde vielleicht ein domänenspezifisches Ereignis kodieren. Zum Beispiel: Sie haben ein Schachspiel, das über seinen nächsten Zug denkt. das Verfahren für die Bewegung für die Suche läuft die Zeit davon. Das Schachspiel könnte ein „onComputerMove“ Ereignis ausgelöst. Man könnte dieses Ereignis mit einer Funktion behandeln, die die Spezifikationen für den Umzug packt und aktualisiert die visuelle Darstellung des Schachbretts und erscheint eine Nachricht für den Benutzer auf, und beendet das Programm. Dann, wenn der Spieler bewegt können Sie ein „onPlayerMove“ Ereignis ausgelöst, die viel von der gleichen Sache tut.

Die schönste Sache über Ereignisse ist also bidirektionale explizite Kopplung zwischen zwei Modulen oder Klassen reduzieren.

Lassen Sie sich also sagen, ich habe zwei Klassen: Baby-und Mama


Ohne Ereignisse, ich etwa zwei Methoden sehen eine Mama zu ermöglichen, ein Baby zu füttern:

  • Mama ruft die baby.pokeBelly() Methode auf der Baby-jede halbe Stunde zu wissen, ob Sie baby.fillWith(milk) verlangen.
    Das Problem ist, dass Mama Thread der ganzen Tag nach dem Baby in einer while-Schleife warten
  • wissen, Baby-Mama mit ihr verbundenen und eine mommy.feed(me) Methode aufrufen, die wiederum ruft baby.fillWith(milk).
    Das Problem wird dann darum bitten, dass ein einfaches Kind der richtige Mama zu fragen, seinen Bauch zu füllen.
    Babys tun das nicht, wie sie sollten einfach bleiben.

Mit Veranstaltungen, könnten Sie eine Mommy.OnBabyCries(baby) seine babie der baby.Cry Ereignis binden:

void Mommy.OnBabyCries(baby) {
    baby.fillWith(milk)
}

Danach, wenn das Baby essen will, alles was man tun muss, ist sein Cry Ereignis auslösen.

Die Logik bleibt in der Mama, oder später auch in jedem Babysitter und Kinder bleiben glücklich, ohne sie zu sorgen.

Ich weiß nicht, ob ich Ihre Frage völlig verstehen, sondern eine Klasse mit einem Ereignisse ist wie ein GUI mit einer Taste. Man denke nur an wie ein homonculus ... Innerhalb jeder Klasse mit einem Ereignisse gibt es eine kleine Person mit einer virtuellen Taste zu drücken. Er weiß nicht, was die Taste tun wird, aber er weiß, wann es zu drücken. Jetzt denken Sie an einer verwandten Klasse mit einer anderen Person etwas in ihm. Diese Person weiß, dass, wenn er eine Nachricht hört, dass eine Taste gedrückt wurde, er sollte etwas tun.

, wenn Sie wollen der zweiten Mann über etwas wissen, den ersten Mann getan hat, verbinden Sie die Vermittlungsstelle zwischen der ersten Klasse und der zweiten Klasse (Melden Sie sich an der Veranstaltung). Wenn der erste Mann auf die Schaltfläche (Brände das Ereignis) drückt, tut der zweite Mann, was er weiß, dass er angeblich zu tun ...

Ich weiß nicht, ob das hilft oder ich bin gerade auf einem LSD-Trip Denken von kleinen winzigen Menschen in meinen Programmen ...

Bei StackOverflow, wenn Sie stimmen ab, Ihr Ruf fällt und Ihr Pfeil nach unten leuchtet rot.

In der Regel können Sie eine einzelne onclick schreiben, aktualisieren Sie alle Elemente in ihr, und versuchen Sie es nicht zu vergessen, jedes Mal zu ändern, wenn das Seitenlayout Änderungen.

Stattdessen können Sie onVoteDown Ereignis erklären, feuern sie in onclick und abonnieren Sie diese Veranstaltung:

  • Ihr Ruf div
  • Ihr Pfeil img
  • Ihre XmlHTTPRequest, die Ihre Stimme an den Server sendet.

Ich bin nicht ganz sicher, welche Art von Antwort, die Sie suchen, so dass ich entschuldige mich, wenn dies nicht alles in der Nähe ist. ;)


Mit dem benutzerdefinierte , meinst du benutzerdefinierte Aktionen , benutzerdefinierte Trigger , oder wirklich benutzerdefinierte Ereignisse

Zum Beispiel: Eine benutzerdefinierte Aktion zu einem vordefinierten Ereignisse (zum Beispiel eines Mausklick), einen benutzerdefinierten Trigger würde einen Mausklick über ein Skript und eine benutzerdefiniertes Ereignis würde einen Zuhörer sein, die von der Sprache oder ist definiert sind nicht nicht ohne weiteres verfügbar.

Wenn Sie benutzerdefinierte Ereignisse suchen, kann ich Ihnen nicht wirklich helfen. Obwohl, ich glaube nicht, dass es für sie in JavaScript viel Unterstützung ist.


So definieren Sie eine Aktion ...

Veranstaltungen werden in der Regel über vordefinierte Eigenschaften eines Objekts festgelegt, sagen window.onload. Standardmäßig sind sie alle gleich oder undefined null. So setzen sie, verwenden Sie sie auf den Wert einer Funktion zu setzen haben.

Sie können eine "anonyme" Funktion verwenden:

window.onload = function (eventObject) {
    /* ... */
};

oder setzen sie auf eine Funktionsreferenz (nicht die gleichen, aber ähnlich einen Zeiger):

function handleOnload(eventObject) {
    /* ... */
}

window.onload = handleOnload; /* note the lack of parenthesis */

Wenn das Ereignis ausgelöst wird, wird die Funktion aufgerufen. Also, in jedem Setup, wenn die Seite fertig geladen, Sie den Code platzieren statt /* ... */ ausgeführt wird.

Es gibt auch formale Methoden zur Verfügung Ereignisse zu schaffen. W3C definiert addEventListener während IE attachEvent verwendet. Mehr Infos .

Es gibt viele Referenzen für die Liste der verfügbaren Ereignisse zu lernen. Hier sind 2, dass Sie sollten eine gute Basis geben:


Der Browser in der Regel übernimmt die Ansteuerung der Ereignisse - entweder für die Browser-Ereignisse (onload) oder Benutzerereignisse (onclick). Die Eigenschaft und Funktion sollen reagieren zu können.

Triggerung Ihre eigene Veranstaltung ist nicht die einfachste Sache zu erreichen. Um das Gerät vollständig ein Event Objekt zu definieren dauert einige Arbeit - und variiert zwischen den Browsern

Obwohl, wenn Sie das Event Objekt nicht benötigen, können Sie einfach das Ereignis nennen:

window.onload();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top