AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion und Darstellung trennen

Ein Thema von scrat1979 · begonnen am 17. Dez 2008 · letzter Beitrag vom 18. Dez 2008
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#1

Funktion und Darstellung trennen

  Alt 17. Dez 2008, 21:09
Hallo zusammen!

Ich bin gerade dabei, meinen Programmierstil etwas zu verbessern. Hier im Forum stößt man öfters auf Aussagen wie "Du mußt Funktion und Darstellung eines Programmes klar trennen". Was genau ist denn damit gemeint? Gibt es hierzu evtl. ein Beispiel oder sogar ein Programm mit Source, um dies nachvollziehen zu können?? Über die SuFu oder unter Google habe ich leider nichts gefunden

Danke im Voraus,
SCRaT
Michael Kübler
  Mit Zitat antworten Zitat
Noedel

Registriert seit: 7. Aug 2008
204 Beiträge
 
Delphi 7 Professional
 
#2

Re: Funktion und Darstellung trennen

  Alt 17. Dez 2008, 21:25
Damit ist nur gemeint, dass du die Sachen wie Rechnungen allgemein solche Prozesse von den anderen wie Ausgabe, Gestaltung
trennen sollst. (bzw. kannst, weil es einfach "nur" schöner ist)
-"Was studierst du eigentlich? Nerdologie?"
-"Informatik..."
-"Wusst ich´s doch!"
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#3

Re: Funktion und Darstellung trennen

  Alt 17. Dez 2008, 21:29
Hmmmm.... "einfach nur schöner"? Nee, also das kann nicht ernst gemeint sein! Wenn die Programme umfangreicher werden, ist es so ziemlich der einzige Weg sich noch im Source zurecht zu finden. Aber, zumindest mir geht es so, es ist oft nicht gerade einfach dieses Prinzip konsequent anzuwenden.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Funktion und Darstellung trennen

  Alt 17. Dez 2008, 21:32
Also ist damit gemeint, z.B. umfangreiche Berechungen, Speicherungen in Datei etc. in eigene Proceduren zu packen und diese dann aufzurufen??
Michael Kübler
  Mit Zitat antworten Zitat
Noedel

Registriert seit: 7. Aug 2008
204 Beiträge
 
Delphi 7 Professional
 
#5

Re: Funktion und Darstellung trennen

  Alt 17. Dez 2008, 21:34
genau so in der Art.
So sollst du zb nicht rechnung, Ausgabe und vllt noch was Visualisiertes in eine Procedure oder gar auf einen Button legen sondern für jeden "Schritt" (Vllt sagt dir EVA was) ne neue Procedure anlegen
-"Was studierst du eigentlich? Nerdologie?"
-"Informatik..."
-"Wusst ich´s doch!"
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Funktion und Darstellung trennen

  Alt 17. Dez 2008, 21:36
Hauptsächlich geht es meiner Meinung nach primär darum, dass man seine Daten nicht in Labels oder Listboxen speichert, sondern sie in Variablen vorhält. Der Programmablauf sollte also nicht gestört werden, selbst wenn extern irgendwelche Control-Eigenschaften verändert werden. Man bekommt sonst auch enorme Schwierigkeiten, wenn man später mal die GUI verändern will und nun ziemlich viel umschreiben muss, weil sich die Datenspeicherung verändert hat.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Funktion und Darstellung trennen

  Alt 18. Dez 2008, 05:52
Hier mal ein Beispiel, das gleich zwei Fehler enthält:
Delphi-Quellcode:
function BerechneZinsesZins:double;
var
  kapital, zins : double;
  jahre, i : integer;
begin
  kapital := StrToFloat(Form1.EditKapital);
  zins := StrToFloat(Form1.EditZins) / 100.0;
  jahre := IntToStr(Form1.EditJahre);
  if jahre <= 0 then
  begin
    ShowMessage('Die Anzahl der Jahre muss grösser 0 sein!');
    result := 0;
    exit;
  end;
  Result := kapital;
  for i := 1 to jahre do
    Result := Result * (1.0 + zins);
end;
1. Fehler
Die Bussinesslogik ist untrennbar mit der Benutzeroberfläche verkoppelt.
Richtig wäre es, die Werte kapital, Zins und jahre als Parameter zu übergeben
2. Fehler
Es wird ShowMessage verwendet, um einen Fehler anzuzeigen.
Dies wird immer wieder falsch gemacht, denn ShowMessage verhindert,
dass man Programmcode in einem anderen Kontext benützen kann.
Man möchte die Funktion vielleicht in einer Schleife aufrufen oder in einem Webservice anwenden.
Richtig kann nur sein eine Exception zu "raisen".
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#8

Re: Funktion und Darstellung trennen

  Alt 18. Dez 2008, 06:07
Zitat:
Also ist damit gemeint, z.B. umfangreiche Berechungen, Speicherungen in Datei etc. in eigene Proceduren zu packen und diese dann aufzurufen??
Das ist nicht unbedingt damit gemeint (das ist eher prozedurale Programmierung).


Die Daten und deren Verarbeitung sollten in einer von der GUI getrennten Stuktur abgelegt sein.

Beispielsweise ein StringGrid (GUI), welches die Daten aus einer Tabelle (Datentabelle, z.B. eine Collection) nur darstellt. Änderungen werden nur an der Tabelle durchgeführt und anschließend wird das Grid neu angezeigt.

Nicht, weil es einfach "nur" schöner ist, sondern um einerseits bei Änderungen an der GUI an der Datenlogik nichts verändern zu müssen und andererseits auch, um bei Änderungen an der Datenlogik an der GUI nichts verändern zu müssen.

Die praktische Umsetzung ist häufig leider nicht ganz einfach, ich würde die Daten in ein Objekt verpacken und die entsprechenden Methoden für den Zugriff bereit stellen.

Ich versuche mal ein Beispiel:

Hier wird bei ButtonClick ein EditDialog ausgeführt, dem ein neuer Datensatz übergeben wird, der in diesem Fall NEU (Add) hinzugefügt wurde. Das Datenobjekt "Users" stellt dazu die Methode "Add" bereit und diese liefert einen leeren Datensatz vom Typ TUser zurück (hier verkürzt gezeigt).

Bei Doppeklick auf die Listbox, wird ebenfalls der EditDialog geöffnet, diesmal mit den Daten eines bestehenden Users, der über den Index (der Index der Liste entspricht dabei dem Index der Kollektion, das ist wichtig!) aus der Kollektion geholt wird.

Die Prozedur "UpdateList" hat nichts weiter zu tun, als die Listenanzeige neu anzuzeigen.

Delphi-Quellcode:
  //Einzelnes User-Objekt
  TUser = class(TCollectionItem)
    ...
    public
      property Name: String read...
      property Passwort: String read...
    end;

  //Users Kollektion, hier steckt das "Add"
  TUsers = class(TCollection)
    ...
  public
    //Add ist eine Funktion mit einem Rückgabewert vom Typ TUser
    function Add: TUser;
  end;

  //Hier wird ein neuer User eingefügt und seine Daten bearbeitet
procedure TBenutzerverwaltung.btNeuClick(Sender: TObject);
begin
  //Neuen Eintrag anlegen
  fEditDialog.Edit(Users.Add);
  UpdateList;
end;

procedure TfBenutzerverwaltung.ListBox1DblClick(Sender: TObject);
begin
  //Eintrag bearbeiten
  fEditDialog.Edit(Users[Listbox1.ItemIndex]);
  UpdateList;
end;

procedure TBenutzerverwaltung.UpdateList;
var i: Integer;
begin
  Listbox1.Clear;
  if Users.Count > 0 then begin
    for i := 0 to Users.Count - 1 do begin
      Listbox1.Items.Add(Users[i].Name);
    end;
  end;
end;
Alle Klarheiten beseitigt?
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:45 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