Guten Morgen! Ich habe eine Frage zum Ansatz, wie ich am besten eine Bibliothek programmiere. Mein Ziel: Kommunikation mit einem Gerät über einen SerialPort. Das Funktioniert soweit. Bisher ist alles hinter die GUI programmiert und fest mit ihr verbunden. [Das heisst: Klick auf Button A führt z.B. einen Gerätescan aus. Dabei wird sequenziell ein Scan auf dem Bus abgearbeitet. Wenn ein Gerät antwortet, wird ein Eintrag in eine Liste gemacht und eine ListBox der GUI aktualisiert.] Jetzt würde ich gern die Verbindung von Kommunikationsfunktionen und GUI trennen. Ich stelle mir das so vor, wie einen "Stack", an den ich Aufgaben übergeben kann und der mir bestimmte Antworten / Ereignisse zurückgibt. Wie man merkt, bin ich kein C#-Profi - und ich frage mich nun, wie ich so eine Funktionalität am besten umsetze (mgl. erweiterbar, ...) Idee 1: Kommunikationsstack-Klasse programmieren, mit Funktionen, die man anstoßen könnte und dann immer vom Hauptprogramm auf Ergebnisse pollt. Idee 2: Events. Man stößt eine Kommunikationsstack-Funktion (z.B. "Scan for devices") an und erhält dann Events für jedes antwortende Gerät. Idee 3: So habe ich das schon öfter bei Java-Bibliotheken gesehen: Anstatt Events zu benutzen, erstelle ich in der Bibliothek Methodenrümpfe und im Programm, welches den Stack verwendet, werden dann "Overrides" erstellt für die "Events", die dann implementiert sein sollen. Mir ist nicht klar, wo die Vor- / Nachteile von 2./3. liegen und ich hoffe, Ihr könnt mir einen Hinweis geben, wie man so ein Problem am besten löst / wo ich mehr Informationen zur Herangehensweise finde. Vielen Dank schon im Voraus! Max
Imo ist der Java-Ansatz schlechter les- und wartbar, als Events in C#. Beispiel dazu in Java und C# https://scatteredcode.wordpress.com/2011/11/24/from-c-to-java-events/
>Beispiel dazu in Java und C#
nur schnell drüber geschaut, aber das sind 2 paar Schuhe
in der JAVA Version kann man beliebig viele "Listener" hinzufügen die
auf ein event horchen, das ist NATÜRLICH schlechter lesbar..
wenn schon müsste man eine C# Version die das auch kann damit
vergleichen..
:
Bearbeitet durch User
Das kannst Du doch jederzeit machen. Wo steht geschrieben das man in C# nur einen Eventhandler zuweisen kann?
1 | private void button1_Click(object sender, EventArgs e) |
2 | { |
3 | Timer timer = new Timer(); |
4 | timer.Tick += new EventHandler(timer_Tick1); |
5 | timer.Tick += new EventHandler(timer_Tick2); |
6 | timer.Tick += new EventHandler(timer_Tick3); |
7 | } |
8 | |
9 | void timer_Tick1(object sender, EventArgs e) |
10 | { |
11 | MessageBox.Show("Eventhandler1"); |
12 | } |
13 | |
14 | void timer_Tick2(object sender, EventArgs e) |
15 | { |
16 | MessageBox.Show("Eventhandler2"); |
17 | } |
18 | |
19 | void timer_Tick3(object sender, EventArgs e) |
20 | { |
21 | MessageBox.Show("Eventhandler3"); |
22 | } |
aus software architektur sicht würde ich persönlich die Events bevorzugen. D.h. aber auch das du dich in der Library um einen eigenen Thread kümmern musst, so dass z.B. der start vom scan vorgang nicht blockiert und das ergebnis eben irgendwann nebenher zusammen gestellt wird und über ein Event weitergegeben wird. bei dir hört es sich mehr nach einem art Treiber als wirklich einer lib an, daher würde ich das ganze mehr lowlevel belassen. Also eine blockierende funktion anbieten die sachen ausführt und erst mit dem ergebnis zurück kommt wenn alle Daten da sind. Das ganze in einen eigenen nebenläufigen Thread zu packen, würde ich dem GUI entwickler selbst überlassen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.