Forum: PC-Programmierung C# Bibliothek erstellen mit Events oder Überschreiben? (OOP)


von Max (Gast)


Lesenswert?

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

von Arc N. (arc)


Lesenswert?

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/

von Robert L. (lrlr)


Lesenswert?

>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
von poly (Gast)


Lesenswert?

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
        }

von Ben W. (ben_w)


Lesenswert?

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
Noch kein Account? Hier anmelden.