Projekt mit
1 €
unterstützen?
So geht das *:


Step 01 - OOP und was nun noch gesagt werden muss (Teil 1/2)


1. Eckstein, Echstein, alles muss versteckt sein ;)

oder: Das Geheimnisprinzip


Wir haben zwar schonmal angeschnitten wo man Variablen deklarieren kann, aber wir haben weder gesagt wie genau und was die gründe sind, wieso man es so machen soll und nicht anderst. Zum Beispiel kann man ja ein Array einfach mal global deklarieren, da wo bekanntlich Form1 deklariert ist. Aber was bringt es uns wenn wir

Eine der wichtigsten Regeln ist:       So global wie nötig, so lokal wie möglich!

Beachte:

- hat man nur globale Variablen, schafft dies Unübersichtlichkeit - wo wird was wann benutzt?
- globale Variablen sollten möglichst aussagekräftig bezeichnet werden.
  Schleifen-/Zählvariablen (i, j, k, s, ...) müssen immer lokal in der Methode,
  in der sie benötigt werden, deklariert werden.
- globale Variablen fressen immer den Speicher, welchen sie verbrauchen;
  lokale werden erst dann erstellt, wenn sie benötigt werden. (Speichereffizienz)
- globale Variablen oder Objekte können von überall benutzt werden.
  In der OOP benutzt man hierfür jedoch s.g. "Properties"
  Somit kann eine Eigenschafft eines Objekts als "Globale Variable" benutzt werden,
  wenn das Objekt selbst global ist.

Beispiel für Deklaration und Verwendung von Properties:

type
  TAuto = class(TForm)
  private
    fColor     : TColor;
    fHeight    : Real;
    fWidth     : Real;
    fMaxWeight : Real;
  public
    property Color         : TColor read fColor     write fColor;
    property Height        : Real   read fHeight    write fHeight;
    property Width         : Real   read fWidth     write fWidth;
    property WeightMaximum : Real   read fMaxWeight;

    constructor Create(AColor:TColor; AHeight, AWidht, MaxWeight: Real);
  end;

Das Schlüsselwort "write"/"read" sorgt dafür, dass wir auf die Eigenschafft schreibend/lesend zugreifen können.

Ist MyCar eine erstellte Instanz unseres Objektes...

// so wäre das möglich:
  MyCar.Color := clBlue;
  MyCar.Height := 1.3;
  MyCar.Width := 1.6;
  MyCar.Length := 2.4;
// das jedoch nicht:
  MyCar.WeightMaximum := 10000;

Grund hierfür ist einfach, dass wir keine Schreibberechtigung für die Eigenschafft WeightMaximum erstellt haben.


2. Methoden mal anders

Wie wir es aus dem Anfängerbereich bereits kennengelernt haben gibt es verschiedene möglichkeiten bein deklarieren von Parametern. Zur kurzen Wiederholung und Vertiefung einmal folgende Methode als Beispiel:

procedure initGame( APlayerName: String; var ALevel: Integer;
    const AGameType: Integer; APlayerList: TStrings);

Beschreibung der Parameter:
APlayerName: String; Dies ist eine ganz normale Definition eines Parameters;
Hierbei werden die Werte der Variable übergeben.
d.h. wenn in der Methode initGame die Variable APlayerName verändert wurde
so ist die ursprüngliche Variable dennoch unverändert.
=> Call by Value
var ALevel: Integer Hierbei wird auf jeden Fall eine Variable verlangt,
da hierbei nur der Zeiger auf die Adresse,
in der sich der Wert befindet, übertragen wird.
=> Call by Reference
const AGameType: Integer; Hierbei kann alles mögliche übergeben werden.
Der Clue bei der Geschichte ist, dass weder der Wert
noch die Referenz verändert werden kann.
=> geschütztes Objekt
APlayerList: TStrings Nun ja, was wird dies wohl für ein Typus Übertragung sein?
Wird hier das Objekt geschützt?
Oder wird hier die Referenz des Objektes übertragen?
Oder wie oben der Wert?
Schon durch diese Fragerei kann man darauf schließen,
dass es bei solchen Parametern, welche nicht direkt von Datentypen abstammen,
sondern eigene Klassen sind, stets die Referenz, also "der Zeiger" übertragen wird.

 

Somit dürfte der OOP-Bereich zum Thema der Sichtbarkeit erstmals erledigt sein :)


Da das Kommentarmodul dieser Seite zur Zeit neu überarbeitet werden muss, sendet bitte alle Fragen, Anregungen oder Probleme mit Betreff zu welchem Thema es sich handelt an folgende Mailadresse:



www.marco-hetzel.de
www.delphi-lernen.de
www.lazarus-lernen.de

© 2006-2019 by Marco Hetzel , last modified 01.11.2018, 11:28

(* Unterstützung dient der Aufrechthaltung laufender Kosten für dieses Projekt.)