![]() |
Trennung von GUI und Logik, wie geht ihr vor?
Hallo zusammen,
in diversen Themen hier taucht ja immer wieder die Trennung von GUI und Logik auf. Mich würde es mal interessieren wie ihr dabei vor geht. Beispiel: Ein Formular mit zwei Edits, einem Button und einem Label.
Delphi-Quellcode:
Eine Klasse mit einer "extrem schwierigen" Berechnung: 8-)
unit uMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uAddition, StdCtrls; type TForm1 = class(TForm) EditZahl1: TEdit; EditZahl2: TEdit; ButtonAddition: TButton; LabelErgebnis: TLabel; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} end.
Delphi-Quellcode:
Vielen Dank schon mal für euer Mitmachen!
unit uAddition;
interface type TAddition = class private FErgebnis: Integer; public function Addition(Zahl1, Zahl2: Integer): Integer; property Ergebnis: Integer read FErgebnis; end; implementation { TAddition } function TAddition.Addition(Zahl1, Zahl2: Integer): Integer; begin FErgebnis := Zahl1 + Zahl2; Result := FErgebnis; end; end. |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Meine Klasse sähe so aus:
Delphi-Quellcode:
und dann würde ich die Properties an die Edits und das Label binden und die Methode an den Button
type
TAddition = class private FErgebnis: Integer; public procedure Addition; property Zahl1: Integer read FZahl1 write FZahl1; property Zahl2: Integer read FZahl2 write FZahl2; property Ergebnis: Integer read FErgebnis; end; |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Ok, damit sieht dein ButtonOnClick so aus oder?
Delphi-Quellcode:
Dies sollte doch eigentlich auch vermieden werden, wegen Spaghetticode.
procedure TForm1.ButtonAdditionClick(Sender: TObject);
begin FAddition.Zahl1 := StrToIntDef(EditZahl1.Text, 0); FAddition.Zahl2 := StrToIntDef(EditZahl2.Text, 0); FAddition.Addition; LabelErgebnis.Caption := IntToStr(FAddition.Ergebnis); end; |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Zitat:
Somit entsteht in dem Form 0 Code. Es gibt nur ca 4 Zeilen externen Wire up Code. |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Es geht ja gerade darum, die Logik vom GUI zu trennen. Deswegen darf die GUI die Logik nicht kennen. Und die Logik das GUI auch nicht. Dazwischen muss etwas geschaltet werden, das als Vermittler agiert. Also z.B. klassisches MVC: Model (Logik), View (Form), Controller (kennt beides), der Controller fehlt hier komplett und wäre dann das, was die Logik-Klasse mit ihren Properties an die ein- bzw. Ausgabefelder am Form und die Ausführung der Methode an deren Button event bindet. |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Ich mache das immer der Art:
Delphi-Quellcode:
Konkrete Implementation der visuellen Repräsentation im Presenter/in der View (ich verwende eine abgewandelte Form des MVC):
type
TAdditionVisualComponent = class public: procedure resultChangeEvent(result: integer); virtual; abstract; end; type TAddition = class [...] private: visualComponent: TAdditionVisualComponent; end; // --- function TAddition.Addition(Zahl1, Zahl2: Integer): Integer; begin [...] if self.visualComponent <> nil then self.visualComponent.resultChangeEvent(Zahl1 + Zahl2); end;
Delphi-Quellcode:
Der Aufruf des ganzen erfolgt aus der GUI über den Controller (falls vorhanden zuvor über den Presenter):
type
TAdditionVC = class(TAdditionVisualComponent); public: procedure resultChangeEvent(result: integer); override; end; // --- procedure TAdditionVC.resultChangeEvent(result: integer); begin Form1.Edit1.Text = IntToStr(result); end;
Delphi-Quellcode:
Jetzt kommt es darauf an, wie man den Controller mit den Business-Objekten verbinden möchte.
MyController.Add(StrToInt(Edit2.Text), StrToInt(Edit3.Text));
Der einfachste Fall (der Controller kennt nur ein Objekt):
Delphi-Quellcode:
Das ist das, was ich aus dem Stehgreif auf die Schnelle zusammentragen kann.
type
Controller = class; private: MyAddition: TAddition; end; // --- procedure Controller.Add(Zahl1, Zahl2: integer); begin MyAddition.Addition(Zahl1, Zahl2); end; MyAddition |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Das ist auch ansatzweise an deinem Beispiel sichtbar. |
AW: Trennung von GUI und Logik, wie geht ihr vor?
"Wie mache ich aus einer trivialen Aufgabe ein extrem kompliziertes Konstrukt"
So wäre meine Kurzbeschreibung zu dem, was ich bisher hier im Thema gelesen habe :-D Aber soll jeder machen, wie er's für richtig hält :P |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Könnte noch sehr interessant werden, vor allem dann mit X-Plattform. Da bezahlt man dann sehr teuer, wenn man es nicht schön getrennt hat ;) |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Dass man dann mit dem "Ach, bei so nem trivialen Beispiel..." kommen kann, war klar ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz