AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi kleines OOP Beispiel bitte um Anmerk./Verbesserungvorschläge
Thema durchsuchen
Ansicht
Themen-Optionen

kleines OOP Beispiel bitte um Anmerk./Verbesserungvorschläge

Offene Frage von "newbe"
Ein Thema von newbe · begonnen am 14. Okt 2008 · letzter Beitrag vom 17. Okt 2008
Antwort Antwort
Seite 1 von 3  1 23      
newbe

Registriert seit: 14. Okt 2008
143 Beiträge
 
Delphi 7 Personal
 
#1

kleines OOP Beispiel bitte um Anmerk./Verbesserungvorschläge

  Alt 14. Okt 2008, 15:00
Hallo Delphipraxis Community,

Ich bin ein Delphi-Neuling und habe mal ein kleines ganz einfaches Übungsproject erstellt. Ich würde mich freuen, wenn hier mal ein paar erfahrenere
Leute mal auf Fehler, oder Verbesserungmöglichkeiten prüfen könnten. Mir geht es vorallem um das Prinzip der Datenkapselung. Eventuell könnt ihr mir aber auch noch andere Hinweise zum Codedesign geben. Wie würdet ihr diees Beispiel elegant umsetzten? Für alle Hinweise bin ich dankbar.

Was mich speziell noch Interessieren würde.

Wozu benötigt man den Constructor/Destructor?
Benötigt man ihn im diesem Beispiel überhaupt?
Und wozu dient er sonst im allgemeinen?
Was ist der Unterschied zwischen Constructor und einer Klasse.init; procedure?
Was bedeutet der "Default 0" Wert in der Property Deklaration?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


  TMeineDaten = class(TObject)
    private
      fWert1 : Integer;
      fWert2 : Integer;
      fErgebnis : Integer;
    procedure SetWert1(const Value: Integer);
    procedure SetWert2(const Value: Integer);
    procedure BerechneErgebnis();
    procedure SetErgebniss(const Value: Integer);

    public
      constructor create;
      destructor destroy;
      property Wert1 : Integer read FWert1 write SetWert1 Default 0;
      property Wert2 : Integer read FWert2 write SetWert2 Default 0;
      property Ergebnis : Integer read FErgebnis write SetErgebniss Default 0;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}



{ TMeineDaten }

procedure TMeineDaten.BerechneErgebnis();
begin
SetErgebniss(fWert1+fWert2);
end;

constructor TMeineDaten.create;
begin

end;

destructor TMeineDaten.destroy;
begin

end;

procedure TMeineDaten.SetErgebniss(const Value: Integer);
begin
  FErgebnis := Value;
end;

procedure TMeineDaten.SetWert1(const Value: Integer);
begin
  FWert1 := Value;
end;

procedure TMeineDaten.SetWert2(const Value: Integer);
begin
  FWert2 := Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
var test: TMeineDaten;
begin
  test:=TMeineDaten.create;
  test.SetWert1(strtoint(edit1.text));
  test.SetWert2(strtoint(edit2.text));
  test.BerechneErgebnis();
  label1.caption:=inttostr(test.ergebnis);
  test.Free;
end;

end.
Angehängte Dateien
Dateityp: rar testproject_oop_125.rar (186,3 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: kleines OOP Beispiel bitte um Anmerk./Verbesserungvorsch

  Alt 14. Okt 2008, 15:15
Hallo und Willkommen in der DP

bis auf den leeren Konstruktor/Destruktor und fehlende Ressourcen-Schutzblöcke (try-finally) habe ich nichts Auffälliges bemerkt. Destroy ist als virtuell deklariert und sollte daher mit override überschrieben werden. Und zumindest ein inherited sollte dann schon drinstehen. Ansonsten OK.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: kleines OOP Beispiel bitte um Anmerk./Verbesserungvorsch

  Alt 14. Okt 2008, 15:30
hi,

Zitat:
Wozu benötigt man den Constructor/Destructor?
Einen Constructor bzw Destructor benötigst du, um dein Objekt zu initialisieren. Du kannst dort Werte festlegen, jedesmal beim erzeugen eines solchen Objektes durchzuführende FUnktionen aufrufen, etc..

Zitat:
Benötigt man ihn im diesem Beispiel überhaupt?
Nein, Constructor und Destructor sind ja schon in TOBject hinterlegt, von welchem du ja erbst. Da du keine weiteren Einstellungen machen möchtest (scheinbar), kannst du dir diese Deklarationen auch sparen.

Zitat:
Und wozu dient er sonst im allgemeinen?
Steht oben

Zitat:
Was ist der Unterschied zwischen Constructor und einer Klasse.init; procedure?
hmm, ich würd jetzt mal behaupten, der Constructor ist das was ich oben beschrieben habe und Init; ist einfach nut eine procedur, welche nach dem Erzeugen des Objekt manuell aufgerufen werden muss..

Zitat:
Was bedeutet der "Default 0" Wert in der Property Deklaration?
hmm, kann ich dir leider gerade nicht sagen...würd mich auch mal interessieren

Gruß
Ansgar
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: kleines OOP Beispiel bitte um Anmerk./Verbesserungvorsch

  Alt 14. Okt 2008, 15:32
Zitat von angos:
Zitat:
Was bedeutet der "Default 0" Wert in der Property Deklaration?
hmm, kann ich dir leider gerade nicht sagen...würd mich auch mal interessieren

Gruß
Ansgar
Bedeutet, dass bei einer published Property dieser Wert nicht in der dfm gespeichert wird.

d.h. wenn du im Consttructor einen default-Wert setzt, kannst du das so kenntlich machen, damit nicht unnötige info in der dfm gespeichert wird.

Evtl. dient es auch dazu, im Objekt-Inspector einen nicht-default-Wert fett zu markieren.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: kleines OOP Beispiel bitte um Anmerk./Verbesserungvorsch

  Alt 14. Okt 2008, 15:36
Zitat:
Die optionalen Direktiven stored, default und nodefault sind Speicherangaben. Sie haben keinerlei Auswirkungen auf die Funktionsweise des Programms, sondern steuern lediglich die )Verwaltung der Laufzeit-Typinformationen. Genauer gesagt bestimmen sie, ob die Werte der published-Eigenschaften in der Formulardatei (DFM) gespeichert werden.
Nach der Angabe stored muß der Wert True oder False, der Name eines Booleschen Feldes oder der Name einer parameterlosen Methode folgen, die einen Booleschen Wert zurückgibt. Ein Beispiel:

property Name: TComponentName read FName write SetName stored False; Wird eine Eigenschaft ohne die Angabe stored deklariert, entspricht dies der Definition stored True.
Nach default muß eine Konstante angegeben werden, die denselben Datentyp wie die Eigenschaft hat:

property Tag: Longint read FTag write FTag default 0; Mit Hilfe des Bezeichners nodefault kann ein geerbter default-Wert ohne Angabe eines neues Wertes außer Kraft gesetzt werden. default und nodefault werden nur für Ordinal- und Mengentypen unterstützt, bei denen die Ober- und Untergrenze des Basistyps einen Ordinalwert zwischen 0 und 31 hat. Wenn eine solche Eigenschaft ohne default oder nodefault deklariert wird, gilt sie als mit nodefault deklariert. Reelle Zahlen, Zeiger und Strings besitzen den impliziten default-Wert von 0, nil bzw. '' (einen leeren String).

Beim Speichern einer Komponente werden die Speicherbezeichner ihrer published-Eigenschaften überprüft. Wenn sich der aktuelle Wert einer Eigenschaft von ihrem default
-Wert unterscheidet (oder kein default-Wert vorhanden ist) und stored True ist, wird der Wert gespeichert. Treffen diese Bedingungen nicht zu, wird der Wert nicht gespeichert.

Hinweis: Bei Array-Eigenschaften werden Speicherangaben nicht unterstützt. default hat bei diesem Eigenschaftstyp eine andere Bedeutung (siehe Array-Eigenschaften).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: kleines OOP Beispiel bitte um Anmerk./Verbesserungvorsch

  Alt 14. Okt 2008, 15:39
Zitat von newbe:
1. Wozu benötigt man den Constructor/Destructor?
2. Benötigt man ihn im diesem Beispiel überhaupt?
3. Und wozu dient er sonst im allgemeinen?
4. Was ist der Unterschied zwischen Constructor und einer Klasse.init; procedure?
5. Was bedeutet der "Default 0" Wert in der Property Deklaration?
1. Der Konstruktor ist eine vom Compiler "unsichtbar" erweiterte Methode, bei der als aller erstes der Speicher vom System reserviert wird, den die Instanz benötigt. Sein Rückgabewert ist immer ein Zeiger auf den Anfang dieses Bereiches. Der Destruktor macht das Gegenteil: Er gibt den vom Konstruktor angeforderten Speicher zur Neuverteilung in die Obhut des Betriebssystems zurück.

2. Prinzipiell benötigt man beide immer, weswegen der Urahne aller Klassen (TObject) beide bereits enthält. Du musst sie aber nicht wie in deinem Beispiel leer überschreiben, wenn du nicht selbst noch Werte/Felder in deiner Klasse (de)initialisieren willst/brauchst. Dort kann man sie getrost weg lassen, wodurch automatisch der Konstruktor/Destruktor der Elternklasse verwendet wird.

3. s.o.

4. Eine init Prozedur ist eine einfache Methode. Sie würde keinen Speicher anfordern, d.h. sie kann erst nach dem Konstruktor aufgerufen werden - wie jede andere Methode auch (ausgenommen Klassenmethoden). Die Namensgebung "init" ist dabei völlig egal. Es ist zudem im generellen eigentlich üblich Initialisierungen im Konstruktor vorzunehmen, und dafür nicht noch eine separat aufzurufende Methode anzulegen (es sei denn der Konstruktor ruft diese dann auf).

5. Damit legst du den Wert der Eigenschaft fest, den sie direkt nach Aufruf des Konstruktors hat. Unter Delphi werden Felder grundsätzlich mit 0 initialisiert, weshalb hier die explizite Angabe nicht nötig wäre. Sie tut aber auch nicht weh . Default-Werte lassen sich übrigens nur für einfache Datentypen vorgeben, d.h. nicht für Klassen, Records und Arrays (da bin ich mir zumindest 99%ig sicher).


Edit: Yay, sind dem roten Kasten satte 3 Beiträge durchgegangen
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: kleines OOP Beispiel bitte um Anmerk./Verbesserungvorsch

  Alt 14. Okt 2008, 15:46
Wenn du einen Constrcutor mit xyz:=TKlasse.create (create ist jetzt der constructor, was ja normalerweise in Delphi auch so ist) aufrufst, führt der Compiler zu Beginn (und auch am Ende) des Constructors noch etwas Code ein. Dieser hat die Aufgabe den Speicherplatz zu reservieren, der für alle deine Felder (Variablen in der Klasse) benötigt werden. Einen Zeiger auf den Speicherplatz bekommst du ja dann vom constructor zurück und Speicherst ihn in xyz.
Der Constructor verbindet quasi zwei Aufgaben:
  1. Den Speicherplatz zu reservieren
  2. Felder zu initialisieren, wenn nötig (macht procedure init überflüssig)
Am Ende des Constructors wird dann noch die Methode AfterConstruction aufgerufen.

Du kannst einen Constrcutor auch ganz normal als Methode aufrufen, über xyz.create. Dann wird ausschließlich der Code innerhalb des Constructors ausgeführt. Dann sollte aber xyz schon vorher initialisiert sein. Genauso ist es, wenn du einen Vorfahr-constructor mit inherited aufrufst.

Der Destructor löscht dann übrigens die gesamten Felder wieder aus dem Speicher. Der macht das übrigens immer. Den kann man auch nicht als normale Methode verwenden.



default ist eine Angabe, welche sich für published properties anbietet. Defaultwerte müssen nicht in der Ressource gespeichert.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#8

Re: kleines OOP Beispiel bitte um Anmerk./Verbesserungvorsch

  Alt 14. Okt 2008, 15:48
Zitat von newbe:
Delphi-Quellcode:
private
...
procedure BerechneErgebnis();
Wenn diese Prozedur private deklariert ist, ist ihre Sichtbarkeit eventuell etwas zu sehr begrenzt um mit der Klasse sinnvoll zu arbeiten...
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: kleines OOP Beispiel bitte um Anmerk./Verbesserungvorsch

  Alt 14. Okt 2008, 15:57
Stimmt, fällt im Beispiel nur nicht auf, weil es in derselben Unit steht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
newbe

Registriert seit: 14. Okt 2008
143 Beiträge
 
Delphi 7 Personal
 
#10

Re: kleines OOP Beispiel bitte um Anmerk./Verbesserungvorsch

  Alt 14. Okt 2008, 18:50
@All erstmal Danke für eure Antworten.

@mjustin & DeddyH

Ich habe die Procedur Berechne Ergebnis absichtlich als Privat Deklariert um die Sichtbarkeit zu limitieren und das
OOP-Prinzip der Datenkapselung umzusetzen. Ich könnte die Procedure natürlich auch als Public deklarieren um beispielsweise aus einer anderen Unit darauf zugreifen zu können. Mir fällt nur kein Grund ein warum dies nötig sein sollte. Vielleicht kannst du
da mal ein sinnvolles Beispiel bringen das mir zeigt für welche Anforderungen diese Umsetzung angebracht ist.

Grundsätzlich hätte ich am liebsten intelligente Objecte. In diesem Fall strebe ich eine strickte Trennung von externen
Usereingaben und internen Berechnungen an. Sprich ich würde auf die Procedure Berechne Ergebnis am liebsten komplett
verzichten. Ich hätte es gern so, das wenn beide Werte eingegeben sind das Object selbständig addiert und das Ergebnis in
der Property Ergebnis zu Verfügung stellt. Aber vielleicht habe ich das auch falsche Vorstelllungen und sowas ist mit
OOP gar nicht machbar/Sinnvoll! Ich stelle mir das so vor. Achtung ungetestet.

mfG newbe

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
  end;


  TMeineDaten = class(TObject)
    private
      fWert1 : Integer;
      fWert2 : Integer;
      fErgebnis : Integer;
    procedure SetWert1(const Value: Integer);
    procedure SetWert2(const Value: Integer);
    function GetErgebniss() Integer; //Getter eingefügt
    procedure SetErgebniss(const Value: Integer);

    public
      constructor create;
      destructor destroy;
      property Wert1 : Integer read FWert1 write SetWert1 Default 0;
      property Wert2 : Integer read FWert2 write SetWert2 Default 0;
      property Ergebnis : Integer read GetErgebnis write SetErgebniss Default 0; //Getter eingefügt
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm} 

ungetestet!

{ TMeineDaten } 


function GetErgebniss() :Integer;
begin
  SetErgebnis(fWert1+fWert2); //oder Setter weglassen und direkt fErgebnis:=fWert1+fWert2;
end;


procedure TMeineDaten.SetErgebniss(const Value: Integer);
begin
  FErgebnis := Value;
end;

procedure TMeineDaten.SetWert1(const Value: Integer);
begin
  FWert1 := Value; //Wertebereich checken
end;

procedure TMeineDaten.SetWert2(const Value: Integer);
begin
  FWert2 := Value; //Wertebereich checken
end;

procedure TForm1.Button1Click(Sender: TObject);
var test: TMeineDaten;
begin
  test:=TMeineDaten.create;
  test.SetWert1(strtoint(edit1.text));
  test.SetWert2(strtoint(edit2.text));
  
// weg damit -> test.BerechneErgebnis();

  label1.caption:=inttostr(test.ergebnis);
  test.Free;
end;

end.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:12 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