AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Trennung von GUI und Logik, wie geht ihr vor?
Thema durchsuchen
Ansicht
Themen-Optionen

Trennung von GUI und Logik, wie geht ihr vor?

Ein Thema von divBy0 · begonnen am 19. Aug 2011 · letzter Beitrag vom 30. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#1

Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 15:09
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:
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.
Eine Klasse mit einer "extrem schwierigen" Berechnung:

Delphi-Quellcode:
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.
Vielen Dank schon mal für euer Mitmachen!
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.012 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 15:15
Meine Klasse sähe so aus:
Delphi-Quellcode:
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;
und dann würde ich die Properties an die Edits und das Label binden und die Methode an den Button
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 15:45
Ok, damit sieht dein ButtonOnClick so aus oder?

Delphi-Quellcode:
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;
Dies sollte doch eigentlich auch vermieden werden, wegen Spaghetticode.
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#4

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 16:07
Ok, damit sieht dein ButtonOnClick so aus oder?

Delphi-Quellcode:
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;
Dies sollte doch eigentlich auch vermieden werden, wegen Spaghetticode.
Nein, das sollte deshalb vermieden werden, weil das Form um himmels willen niemals im Leben nicht die Klasse TAddition kennen darf.

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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#5

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 16:26
Ich mache das immer der Art:

Delphi-Quellcode:
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;
Konkrete Implementation der visuellen Repräsentation im Presenter/in der View (ich verwende eine abgewandelte Form des MVC):

Delphi-Quellcode:
type
  TAdditionVC = class(TAdditionVisualComponent);
  public:
    procedure resultChangeEvent(result: integer); override;
  end;

// ---

procedure TAdditionVC.resultChangeEvent(result: integer);
begin
  Form1.Edit1.Text = IntToStr(result);
end;
Der Aufruf des ganzen erfolgt aus der GUI über den Controller (falls vorhanden zuvor über den Presenter):
MyController.Add(StrToInt(Edit2.Text), StrToInt(Edit3.Text)); Jetzt kommt es darauf an, wie man den Controller mit den Business-Objekten verbinden möchte.
Der einfachste Fall (der Controller kennt nur ein Objekt):
Delphi-Quellcode:
type
  Controller = class;
    private:
      MyAddition: TAddition;
  end;

// ---

procedure Controller.Add(Zahl1, Zahl2: integer);
begin
  MyAddition.Addition(Zahl1, Zahl2);
end;
MyAddition
Das ist das, was ich aus dem Stehgreif auf die Schnelle zusammentragen kann.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.012 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 16:31
Konkrete Implementation der visuellen Repräsentation im Presenter/in der View (ich verwende eine abgewandelte Form des MVC)
Mich persönlich hat bei dem MVC/MVP Modell immer gestört, dass man für meinen Geschmack zu viel Code erzeugt und trotzdem noch statische Abhängigkeiten hat

Das ist auch ansatzweise an deinem Beispiel sichtbar.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (19. Aug 2011 um 16:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 17:14
Ok, damit sieht dein ButtonOnClick so aus oder?

Delphi-Quellcode:
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;
Dies sollte doch eigentlich auch vermieden werden, wegen Spaghetticode.
Nein, das sollte deshalb vermieden werden, weil das Form um himmels willen niemals im Leben nicht die Klasse TAddition kennen darf.
So würde ich das aber auch lösen. Wie sähe denn deine Lösung aus?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#8

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 17:25
Ok, damit sieht dein ButtonOnClick so aus oder?

Delphi-Quellcode:
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;
Dies sollte doch eigentlich auch vermieden werden, wegen Spaghetticode.
Nein, das sollte deshalb vermieden werden, weil das Form um himmels willen niemals im Leben nicht die Klasse TAddition kennen darf.
So würde ich das aber auch lösen. Wie sähe denn deine Lösung aus?
(fett durch mich)
Dann hast du aber die Aufgabe nicht gelöst, um die es hier geht.

Allgemein:
Eine saubere Trennung erreicht man nur durch Abstraktion. Dass diese Mehraufwand beim Schreiben verursacht, sollte hier nicht das Thema sein.
Sebastian
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
529 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 17:19
Für diesen einfachen Fall zu umständlich.

Delphi-Quellcode:
type
   TAddition = class
   private
     
   public
     function Add(wert1,wert2:integer; var Ergebnis:integer):boolean;
     
   end;
Implemaentation

Function Taddition.Add;
begin
  Ergebnis:=wert1+wert2;
  result:=(wert1<>0) and (wert2<>0);
end;
Result zeigt dann ob was sinnloses gemacht wurde oder kann auf einen Konvertierungsfehler hinweisen.

Die Sache mit privaten Feldern, Methoden sowie Properties macht nur dann Sinn, wenn man Werte zwischenspeichen will.
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.012 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 19. Aug 2011, 16:03
Ok, damit sieht dein ButtonOnClick so aus oder?

Delphi-Quellcode:
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;
Dies sollte doch eigentlich auch vermieden werden, wegen Spaghetticode.
und dann würde ich die Properties an die Edits und das Label binden und die Methode an den Button
Das Verb binden bezieht sich in diesem Satz auch auf "die Methode an den Button"

Somit entsteht in dem Form 0 Code. Es gibt nur ca 4 Zeilen externen Wire up Code.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz