# Callback vs. Event listener



## Timiiih (20. Mai 2011)

Hallo liebe Gemeinde!

Ich möchte hier einmal event listener und Callbacks (zum Beispiel wie in C) miteinander vergleichen und voneinander
abgrenzen. Beides ist dabei im Bezug auf die GUI Programmierung zu sehen, also beispielsweise die Reaktion darauf,
das ein Button geklickt wurde.

Wenn ich das richtig verstehe, kann man bei Callbacks einer Funktion ein Stück ausführbaren Code übergeben 
(vgl. Beispiel bei Wikipedia). In diesem Fall würde das also bedeuten, dass ein Button etwas ganz alleine tun
könnte, wenn er ein Event bekommt, oder er könnte via Callback eine Funktion des Apps aufrufen, in dem der Button
verbaut ist (wie genau allerdings? Dafür müsste der Button doch irgendwie sein App kennen? Hierfür ein mini Beispiel wär schön).

Event listener sind doch quasi sehr mit dem Observer pattern verwandt. Hier hätte der Button eine Liste von Zuhörern, die
alle ein Interface implementieren, welches eine Funktion garantiert, die der Button aufrufen kann, wenn er geklickt wurde.
Wenn der Button also geklickt wurde, geht er die Liste seiner Listener durch und ruft besagte Funktion bei jedem einzelnen auf.
Die Listener selbst können diese Funktion dann implementieren und entsprechend reagieren.

Ein Beispiel für die Verwendung von Callbacks in dieser Situation würde mir das ganze vielleicht noch etwas klarer machen. Was sind die Unterschiede, Vorteile, Gemeinsamkeiten?

Danke,
Timiiih


----------



## SlaterB (20. Mai 2011)

von Schreibaufwand abgesehen ist das alles identisch,
ob ein Button nun direkt einen Callback startet oder genau einen Listener informiert und der Aktion xy startet, wo ist der Unterschied?
was zählt ist dass der Button gedrückt wurde und als unmittelbare Folge eine Aktion startet,
10 Menschen in 20 Ländern erfinden dafür 30 Design Pattern, in der Logik der Welt macht das aber keinen Unterschied

Beispiele findest du quasi überall, z.B. 'actionlistener example' in eine Suchmaschine eintippen, notfalls noch 'java' dazu,
ActionListener kennt aber sonst keiner

führt z.B. zum sowieso naheliegenden Link
How to Write an Action Listener (The Java™ Tutorials > Creating a GUI With JFC/Swing > Writing Event Listeners)
dort sieht du eine schlecht benannte Klasse AL mit Button + Listener der gleich noch auf die 'App' an sich zugreift,
alles was du brauchst 
(edit: ok, dort ist die App selber auch der Listener, nicht besonders hilfreich für andere Fälle)


----------



## muckelzwerg (20. Mai 2011)

Wenn man das ein wenig abstrakter sieht, ist es sowieso fast der gleiche Code. Ob die Funktion A nun in Klasse B steht oder in Klasse C, spielt "logisch" erstmal keine so große Rolle.
Die Frage ist da eher, wie es angenehm zu Verwenden ist, ob Absicherungen notwendig sind, welche zusätzlichen Schichten noch dazwischenliegen (sollen), wie es mit multiplen Threads aussieht usw.

Einen Callback willst Du vielleicht nicht aus einem GUI-Thread ausführen lassen. 
Oder es kommt vielleicht der Tag, an dem Du multithreaded Callbacks aufrufst, dann musst viel prüfen/synchronisieren.
...
Letztlich sollte es nicht darum gehen ob eine Funktion nun "Callback" oder "Message Passing" oder "Event Listener" heißt.
Die wichtigen Fragen sind eher
Sichtbarkeit - Wer sieht was?
Authorisierung - Wer darf was?
Sicherheit - Wer könnte was Blödes tun? Wie schlimm wird es?
Modularität - Wer ist von wem abhängig?
Kontrollierbarkeit - Welche Threads? Events maskieren? ...
Praktikabilität - Wie wird erweitert? Welche typischen Veränderungen gibt es? Wo muss dann überall angepasst werden?
...


Du wirst recht schnell auf den Gedanken kommen, dass Dein Button nicht "wirklich" eine Funktion im Backend kontrollieren soll.
Aber ob er nun ein Ereignis an einen Manager schickt, oder selbst an ihm bekannte Zuhörer sendet oder ...
Eigentlich ist der "Callback" bei einer GUI auch nicht so der klassische Callback. Der Aufrufer hat mir dem Button letztlich nichts zu tun.
Den "Rückruf" verwendest Du eigentlich, wenn Du etwas anstößt (z.B. eine Datenabfrage übers Netzwerk) und dann asynchron darauf reagieren willst. "Mach xyz und ruf mich, wenn Du das Ergebnis hast". 
Wenn Du einer GUI Funktionen injezierst, zu denen gar kein Handlungsfaden gehört, der von der GUI weiß, dann ist es eigentlich eher ein normaler Call.
Die Beispiele auf der englischen und deutschen Wikipediaseite sind für mich persönlich keine "echten" callbacks. Aber da kann man sicher lange drüber streiten.


----------



## Timiiih (20. Mai 2011)

Hallo SlaterB, hallo Muckelzwerg!

@SlaterB:
Wie das mit action listenern funktioniert, habe ich verstanden. Gibt es auch so ein Beispiel für Callbacks, wo diese also benutzt werden um auf einen Buttonclick zu reagieren?

@Muckelzwerg:
Ich wurde leider explizit damit beauftragt ( ;-) ) standard Callback in C mit der Verwendung von event listenern zu vergleichen/gegenüberzustellen.
Ich bin mir nicht ganz sicher, ob ich deinen Post wirklich verstehe, aber ich glaube du willst die Aufmerksamkeit eher auf andere Fragen lenken, als auf callback vs eventlistener.


----------



## Wildcard (20. Mai 2011)

> Gibt es auch so ein Beispiel für Callbacks, wo diese also benutzt werden um auf einen Buttonclick zu reagieren?


Nicht in Java da ein C Callback dort nur über Reflection realisierbar ist und die sollte man nicht leichtfertig verwenden wenn es bessere Alternativen gibt.


----------



## muckelzwerg (20. Mai 2011)

Hättest Du doch gleich sagen können. Aber was Du willst, ist doch kein Vergleich, sondern Beispiele.
Ansonsten schnapp Dir doch ein paar von den Punkten, die ich aufgezählt habe und vergleich mal.


----------



## Timiiih (21. Mai 2011)

hey,

naja ich will die Beispiele ja um zu verstehen, was da los ist um dann selbst (vielleicht auch deinen Punkten) zu vergleichen.
Für event listener gibts ja viele Beispiele, u.a. das, was SlaterB verlinkt hat.

Da Callbacks ja in Java so nicht funktionieren, vielleicht kann man dann ein Beispiel in C oder Pseudocode konstruieren?
Das einzige, was mir einfallen würde, wär sowas hier in der Art:

```
class Button {
    listeVonRegistriertenFunktionsPointern;
   gotClicked((listeVonRegistriertenFunktionsPointern){
      für alle Fkt. in listeVonRegistriertenFunktionsPointern do
           führe Funktion aus
   }

  registriereFkt( (*Funktion));
  löscheFkt((*Funktion));

}
```

Ein App würde dann also eine Funktion beim Button registrieren, die dann ausgeführt wird, wenn der Button geklickt wurde.
Macht das so Sinn?

Timiiih


----------



## muckelzwerg (21. Mai 2011)

Beispiele zu C-Callbacks findest Du im Internet jede Menge. Ob das in jedem Fall Sinn macht ist eine andere Frage.
Für mich machen schon die Beispiele auf Wiki wenig Sinn.


----------

