AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Komponenten-Entwicklung: Interner Zugriff auf Eigenschaften
Thema durchsuchen
Ansicht
Themen-Optionen

Komponenten-Entwicklung: Interner Zugriff auf Eigenschaften

Ein Thema von APP · begonnen am 18. Jan 2004 · letzter Beitrag vom 18. Jan 2004
Antwort Antwort
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#1

Komponenten-Entwicklung: Interner Zugriff auf Eigenschaften

  Alt 18. Jan 2004, 17:56
Hallo,
ich bin auf eine "blöde" Frage gestossen:

Angenommen ich habe eine Komponente mit folgenden Eingenschaften:

Delphi-Quellcode:
  TFileBuffer = CLASS(TStringList)
  PRIVATE
    ...
    FItemSeperator: Char;
    FUNCTION GetObjectFileTime(Index: Integer): TDateTime;
    ...
  PUBLIC
     ...
    PROPERTY ObjectFileTime[Index: Integer]: TDateTime READ GetObjectFileTime WRITE SetObjectFileTime;
    PROPERTY ItemSeperator: Char READ FItemSeperator WRITE FItemSeperator;
    CONSTRUCTOR Create;
    DESTRUCTOR Destroy; OVERRIDE;
  END;
Nun steht im Handbuch (Seite 33-5 Delphi 5 deutsch) über die Eigenschaftsdaten,
  • dass die zum Speichern verwendeten Felder als private deklariert sein müssen.
  • dass aussschließlich die Implementierungsmethoden (Get_xxx und Set_xxx) auf diese Daten direkt zugreifen dürfen.
  • dass wenn andere komponenteneigene Methoden/Eigenschaften auf Eigenschaftsdaten zugreifen wollen, dies ausschliesslich über die Eigenschaften und nicht direkt auf die Daten machen dürfen.

Mit anderen Worten:
Delphi-Quellcode:
{******************************************************************************}
FUNCTION TFileBuffer.GetObjectFileTime(Index: Integer): TDateTime;
{******************************************************************************}
// Nicht lauffähige DEMO-Methode!!
VAR
 aValue : Char;
BEGIN
...
// Wenn ich nun auf die Eigenschaft "ItemSeperator" zugreifen möchte
// müsste ich ja auf
aValue := ItemSeperator; // ZUGRIFF ÜBER DIE EIGENSCHAFT
// und nicht auf
aValue := FItemSeperator; // DIREKTER ZUGRIFF
// zugreifen?
END;
Es funktioniert offensichtlich beides, ausser wenn die Implementierung einer geerbten Eigenschaft geändert wird (lt. Handbuch).

Ich habe mir "renomierte" Projekte angesehen, und musste feststellen, jeder macht es anders (direkt, über die Eigenschaft oder gemischt), oder habe ich den tieferen Sinn nicht verstanden?

Meine Frage ist nun, ist das bloß eine Designfrage/Schwäche/Stilfrage, oder wie geht es nun "richtig"
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#2

Re: Komponenten-Entwicklung: Interner Zugriff auf Eigenschaf

  Alt 18. Jan 2004, 18:08
schon des Designs wegen sollte man Variablen niemals public deklarieren.
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Komponenten-Entwicklung: Interner Zugriff auf Eigenschaf

  Alt 18. Jan 2004, 18:23
Hallo Sanches ,
meine Frage ist eigentlich, wie ich korrekt bei einer Komponente in einer Methode auf die Daten von (anderen) Eigenschaften zugreifen soll...
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Minz

Registriert seit: 19. Dez 2002
476 Beiträge
 
#4

Re: Komponenten-Entwicklung: Interner Zugriff auf Eigenschaf

  Alt 18. Jan 2004, 18:28
Ich glaube, dass ist blos ein Frage des schönen Stils.

Aber warum sollte man auch indirekt zugreifen, wenns auch direkt geht !
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#5

Re: Komponenten-Entwicklung: Interner Zugriff auf Eigenschaf

  Alt 18. Jan 2004, 18:32
Zitat von APP:
meine Frage ist eigentlich, wie ich korrekt bei einer Komponente in einer Methode auf die Daten von (anderen) Eigenschaften zugreifen soll...
Ich glaube, ich verstehe die Frage nicht ganz.

Eine Methode einer Klasse kann doch ohne weiteres auf die Member-Variablen zugreifen. Wenn du in der Getter- bzw Setter-funktion irgendwelche Vorgänge drinnen hast, die du auch von der anderen Funktion aus benötigst, dann gehst du den Weg über die Property, ansonsten eben nicht.
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Komponenten-Entwicklung: Interner Zugriff auf Eigenschaf

  Alt 18. Jan 2004, 18:40
Zitat von Minz:
Ich glaube, dass ist blos ein Frage des schönen Stils.
Stimmt.

Zitat von Minz:
Aber warum sollte man auch indirekt zugreifen, wenns auch direkt geht !
Es gibt gute Gründe über die Property zu gehen. Der wichtigste ist: man kann über die Methode GetXXX immer noch ein paar extra Tests machen (Bei Google suchenPlausibilitätstest), die bei direktem Zugriff auf die Variable nicht mit gemacht werden würden.

Ein hypothetische Frage
Was aber, wenn die property zum Lesen auch nur auf die Konstante zurückgreift.

Da würde ich gegenhalten, daß sich dieses mal ändern kann und man dann überall die Variable durch die Property auswechseln müsste.

Zum Punkt: Objektvariablen als private

Das ist lediglich eine Frage des sauberen Designs. Dadurch kann man sich selbst versichern, daß ein anderer Programmierer den Inhalt einer solchen Variable nicht direkt auf "legalem" Wege ändern kann, d.h. man kann durch die SetXXX Methoden immer die Oberhand wahren

Persönlich empfehle ich den direkten Zugriff auf die Variablen nur an drei Stellen: der GetXXX Methode, der SetXXX Mathode und die Methode (oft Create) welche zur Initialisieren (oder auch zum Reset) der Klasse/des Objektes genutzt wird.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Minz

Registriert seit: 19. Dez 2002
476 Beiträge
 
#7

Re: Komponenten-Entwicklung: Interner Zugriff auf Eigenschaf

  Alt 18. Jan 2004, 18:49
@sakura

achso du meinst z.B. dies:

property MyVar: String read FMyVar write SetMyVar; und in SetMyVar machst du dann Plausibilitätstests?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Komponenten-Entwicklung: Interner Zugriff auf Eigenschaf

  Alt 18. Jan 2004, 18:53
Zitat von Minz:
und in SetMyVar machst du dann Plausibilitätstests?
Zum Beispiel. Wenn ich mit DCOM-Objekten arbeite, dann überprüfe ich in GetXXX zum Beispiel auch, ob diese noch existieren oder der Server u.U. abgeschaltet (oder BSoD) wurde, um dann dynamisch ein neues Objekt von einem anderen Server anzufordern.

Würde ich jetzt direkt auf die Variable zugreifen, könnte ich den Plausibilitätstest nicht mehr so einfach durchführen.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Komponenten-Entwicklung: Interner Zugriff auf Eigenschaf

  Alt 18. Jan 2004, 19:30
Hallo Sakura,
vielen Dank für Deine Erklärungen, das war genau das wonach ich suchte!
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  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 08:33 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