Die Trennung der Schichten

Reverent

Erfahrenes Mitglied
Hallo Leute,

von Norbert
Businesslogik (also Funktionen, Abläufe, etc.) sollten in eigene Klassen, Projekte, etc. ausgelagert werden. Das bedeutet, dass es nicht so laufen soll, dass man im GUI-Designer auf einen Button doppelklickt und dort seinen Code eingibt, der dann die Aufgabe erledigt. An dieser Stelle sollte nur der Aufruf einer Klasse stattfinden, die dann die Arbeit übernimmt und die gewünschten Daten zurückgibt.
Also:

MyForm
Code:
private void Button_Click(object sender, System.EventArgs e)
{
    MyClass(Button_Click);
}
so ist das doch gemeint oder?
Soweit so gut, aber wie ist das jetzt, wenn beim Betätigen des Button ein Wert in ein Label z.B. eingetragen werden soll?
Wie mache ich was bekannt?
Die Form in der Kasse oder die Klasse in der Form oder beides oder noch über eine andere Klasse?
Ok die Klasse muß der Form bekannt sein.

MyForm
Code:
Class MyClass = new Class();

Ich hoffe Ihr habt mich verstanden!!
Bis Dann
 
Es geht nicht darum jede einzelne Aufgabe in eine Klasse auszulagern und in den Eventhandlern gezwungenermassen nur noch Aufrufe zu taetigen. Es geht darum den Zweck bzw. die Aufgaben deines Programm in entsprechenden Objekten unterzubringen. Klassen welcher der Praesentation dienen, zb einzelne Formulare, sollen dann diese Objekte benutzen um die gewuenschte Funktionalitaet zu erreichen.

Ich kenne dein Programm nicht, die Zuweisung eines Textes zu einem Label solte ruhig im entsprechenden Eventhandler erfolgen. Das was hingegen in externen Business-Klassen ausgelagert werden soll, ist in diesem Fall eher der Text, der zugewiesen wird.

Konkrete Vorschlaege kann man dir nicht geben. Sag uns erst was du entwickeln willst.
 
Hallo zovax,
Wenn der Button betätigt wird, beginnt eine Datenbankabfrage und auf Grund dieser Datenbankabfrage muß dann noch was berechnet werden und der Wert soll dann in einem Label geschrieben werden.
Die Abfrage und die Berechnung gehören dann ja logischer Weise in die Businesslogik und wie wird es dann mit der Darstellung des Wertes in dem Label geregelt?

Bis Dann
 
Die Datenbankabfrage selst wuerde ich nichtmal in die Businesslogik packen, sondern in eigenen eigenen Data-Layer. Dort werden die datenbankspezifischen Aufgaben erledigt jedoch keine Berechnungen oder aehnliches durchgefuehrt. Im BusinessLayer wird dann darauf zugegriffen und mit den Werten weitergerechnet, im PresentationLayer (Deiner GUI) nur auf den BusinessLayer.

Einfaches Beispiel (Nicht hauen bei Tippfehler, aus dem Kopf geschrieben, es geht ja nur um den Sinn):
Code:
public class Customer {
     string _name;
     //Properties, Fields, usw..
     public Customer (DataRow r){
         //Objekt erzeugen
     } 
//weiterer Code
}
public class DataEx{
     public DataRow GetCustomer(int id){
         //Datenbankabfrage, Werte speichern
         return returnRow;
     } 
//weiterer Code
}
public class BusinessEx{
     public Customer GetCustomer(int id){
         Customer returnCustomer = new Customer(data.GetCustomer(id));
         //evtl weiteres
         return returnCustomer;
     } 
//weiterer Code
}
public class Form1{
     private void Button_Click(){
         Customer c = business.GetCustomer(this.tbID.Text);
         //evtl weiteres
         //Dein Label
         this.lName = c.Name;
     } 
//weiterer Code
}

EDIT: Erste Tippfehler verbessert
 
Zuletzt bearbeitet:
Hallo zovax,
kannst du deinen Quellcode mal etwas näher Erklären bitte.

Also noch mal:
1. GUI halt die Benutzeroberfläche
2. eine Klasse für die ganz Logik hinter der Benutzeroberfläche
3. eine Klasse für die Kommunikation mit der Datenbank

Wenn ich einen Wert in meinem Label darstellen möchte, egal wo der jetzt herkommen mag, mache ich das so:
Code:
private void Button_Click(object sender, System.EventArgs e)
{
    label.text = MyClass(Button_Click);
}

Ich muß einen Wert aus der Datenbank darstellen, d.h. die Aktion geht über die Form auf die Logikklasse und von der aus wird die Datenbankabfrage gestartet und zurück zur Logikklasse um dann auf der Form zu erscheinen!

Bis Dann
 
Also noch mal:
1. GUI halt die Benutzeroberfläche
2. eine Klasse für die ganz Logik hinter der Benutzeroberfläche
3. eine Klasse für die Kommunikation mit der Datenbank
Das kann man so nicht sagen, es kommt immer individuell auf das Projekt/Anwendung an. Fuer kleinere Programme wird das wahrscheinlich ok sein. Allerdings lagere ich das nicht nur in eine Klasse sondern in ein externes Projekt aus, das ich dann referenziere.

Verstehe nicht ganz, was du in deinem Code da mit welchen Parametern aufrufst.

Ich muß einen Wert aus der Datenbank darstellen, d.h. die Aktion geht über die Form auf die Logikklasse und von der aus wird die Datenbankabfrage gestartet und zurück zur Logikklasse um dann auf der Form zu erscheinen!
Ok, nur was wird aus der Datenbank geholt? Repraesentatierst du die Daten nicht in Objekten?

Das auf diesen Button geklickt wird, ist doch jetzt ein spezieller Fall, wird etwa fuer jeden Klick eine Datenbankabfrage gestartet? Willst du fuer jede kleine Aufgabe deines Programmes eine entsprechende Methode schreiben nur um etwas auszulagern?

Das Geheimnis ist: Du sollst nicht irgendwelche Methoden und Klassen fuer dein Program schreiben, nur um "irgendetwas aufzurufen", sondern deine Daten sollen in Objekten repraesentiert werden. DIESE sind dein eigentlicher Business Objekte. Hier sind wir also wieder bei der guten alten OOP.

Siehe nochmal mein Beispiel oben. Ich habe dort beispielsweise ein Programm um meine Kunden zu verwalten. Die Daten fuer die Kunden die ich aus der Datenbank bekomme (DataLayer) werden in entsprechenden Customer-Objekten repraesentiert (Customer Klasse). Diese Klassen sind Teil des BusinessLayers und enthalten die "eigentlichen" Programmdaten. In meinem Presentation Layer verwende ich die von diesen Objekten bereitgestellten Funktionalitaeten und Daten nur und stelle sie entsprechend dar. Es werden keine Berechnung oder sonstiges vorgenommen.
 
Hallo zovax,
Ich habe z.B. eine Tabelle TabKunde und für die Tabelle lege ich also eine Klasse an und die Klasse hat dann als Membervariable die Spalten der Tabelle und als Funktionen dann z.B. KundeErstellen(), KundeLoeschen(), u.s.w.
So kann ich dann Objekte von Kunden anlegen und muß dann nur die Objekte verwalten.
Bis Dann
 
Dann wuerde ich im Eventhandler einfach ein Kunden-Objekt erstellen (natuerlich nicht die Datenbankabfrage mit reinpacken, das Erstellen kannst du ja einer anderen Klasse ueberlassen, es soll ja nicht fuer jeden Kunden die Datenbankverbindung neu aufgebaut werden). Dann kannst du die Daten vom Kunden ja direkt dem Label zuweisen

Genauso wie hier:
Code:
public class Form1{
     private void Button_Click(){
         Customer c = business.GetCustomer(this.tbID.Text);
         //evtl weiteres
         //Dein Label
         this.lName = c.Name;
     } 
//weiterer Code
}
.
 
Dann wuerde ich im Eventhandler einfach ein Kunden-Objekt erstellen (natuerlich nicht die Datenbankabfrage mit reinpacken, das Erstellen kannst du ja einer anderen Klasse ueberlassen.
Wie meinst du das welcher Eventhandler und wie meinst du das mit den Abragen?
BisDann
 
Reverent hat gesagt.:
Wie meinst du das welcher Eventhandler und wie meinst du das mit den Abragen?
BisDann
Na, mit dem Eventhandler meine ich den Button_Click Handler. Da willst du den Code doch ausfuehren.

Es laeuft doch wiefolgt ab:
1. Die Daten sind in der Datenbank
2. Du liest die Daten aus der Datenbank (DAS koennte zb. in einem eigenen Layer efolgen)
3. Du erzeugst mit den Daten aus der Datenbank Kunden-Objekte. In den Kunden-Objekten hast du alle relevanten Informationen.
4. Im Button_Click Handler kannst du dann Daten aus den Kunden-Objekten dem Labeltext zuweisen.
 

Neue Beiträge

Zurück