Einführung in die objektorientierte Programmierung unter Perl


Inhaltsverzeichnis

1. Einleitung
1.1. Voraussetzungen
1.2. Danksagungen
2. Grundlagen
2.1. Assoziative Arrays
2.2. Module und subs
2.2.1. Definition eines Moduls
2.2.2. Verwendung eines Moduls
2.3. Referenzen
3. Aufbau einer Klasse in Perl
3.1. Perl-Klassen sind auch nur Module
3.2. Anwendung der Klasse
3.3. Die Klasse genauer betrachtet
3.3.1. Der Konstruktor
3.3.2. Die Methoden addiere und ueberweise
3.3.3. Die Funktionen guthabenzinsen und kreditzinsen
3.4. Eine erste Zusammenfassung
4. Ein Beispiel für objektorientierte Programmierung
4.1. Aufgabenstellung
4.2. Zerlegung in Klassen
4.3. Die Klassen im Detail
4.3.1. Klasse TClass
4.3.2. Klasse TMethod
4.3.3. Klasse TParam
4.4. Vollständige Beschreibung der Klassen
4.4.1. Die Klasse TParam
4.4.2. Die Klasse TMethod
4.4.3. Die Klasse TClass
4.5. Die Klassen kritisch betrachtet
5. Abschluss
5.1. Wiederholung des Gelernten
5.2. Aufgaben
5.2.1. TPoint
5.2.2. TLine
A. Anhang 1
B. Anhang 2
C. Musterlösung zur Aufgabe

Dieser Vortrag ist praxisorientiert, daher werde ich auf Theorie verzichten, und an dieser Stelle auch keine Diskussion über die Vorteile von objektorientierter Programmierung führen.

An einem kleinen Beispiel zeige ich den Aufbau einer Klasse in Perl. Danach stelle ich die Lösung eines kleinen Problems dar, von der Problemstellung bis zur objektorientierten Lösung. Anhand einer einfachen Aufgabe, die eigenständig gelöst werden soll, besteht die Möglichkeit das Gelernte zu rekapitulieren.

Referenzen sind ein wichtiges Hilfsmittel, um dynamische Datenstrukturen zu erzeugen. Eine Referenz speichert einen Verweis auf ein Datenobjekt, z.B. eine gewöhnliche Variable oder ein Array. Um eine Referenz auf eine benannte Variable zu erzeugen schreibt man

$referenz = \$variable;

Über die Referenz kann man auf das referenzierte Objekt zugreifen. So ändert der folgende Code den Wert der Variable $a auf 5:

my $a = 4;         # Variable anlegen
my $refa = \$a;    # Referenz auf Variable anlegen
$$refa = 5;        # Ueber die Referenz die Variable setzen
print $a;

Hierbei fällt auf, dass der Zugriff auf die referenzierte Variable mit zwei $-Zeichen eingeleitet wird. Eine Zuweisung erfolgt also an $$refa. Bei Referenzen auf Arrays und Hashes gibt es dafür eine Kurzform, die wir im nächsten Beispiel sehen:

my %hash;
my $hashref = \%hash;
$hashref->{'otto'} = 'karl';
print $hash{'otto'};

Hier kann man statt $$hashref{'otto'} auch $hashref->{'otto'} schreiben. Hier ist -> ein Sinnbild für die Tatsache dass $hashref eine Referenz ist. Für ein Array sähe der Code so aus:

my @array;
my $arrayref = \@array;
$arrayref->[0] = 5;
print $array[0];

Bis auf die Verwendung von eckigen Klammern statt geschweiften Klammern ist die Schreibweise also gleich.

Im objektorientierten Perl werden häufig Referenzen auf anonyme Objekte erzeugt. Anonyme Objekte sind Objekte, die sich nicht über einen Namen ansprechen lassen und die so lange existieren, wie eine Referenz auf sie existiert. So erzeugt

$anonHashRef = {};

ein anonymes assoziatives Array und speichert eine Referenz darauf in $anonHashRef ab. Und der folgende Code erzeugt ein anonymes Array und speichert eine Referenz darauf in $anonArrayRef ab.

$anonArrayRef = ();

Beim Zugriff auf referenzierte Objekte wird nicht zwischen Referenzen auf benannte und anonyme Objekte unterschieden. So sähe der Code für den Zugriff über die beiden oben eingerichteten Referenzen wie folgt aus:

$anonArrayRef->[0] = 7;
$anonHashRef->{'beispiel'} = 9;

Die im Anhang A, Beispiel A.2 dargestellte Datei TKonto_t.pl verwendet die Klasse TKonto.

Das Einbinden der Klasse geschieht genau wie bei einem Modul durch eine use-Anweisung. In den Zeilen 3 und 4 lege ich zwei Variablen vom Typ TKonto durch Aufruf von new TKonto an. Dabei ist die erste übergebene Zahl der Kontostand und die zweite Zahl das Dispolimit, d.h. der Betrag um den das Konto maximal überzogen werden darf.

Als ersten Schritt richte ich zwei Konten ein:

  1 use TKonto;
  2
  3 my $boss_konto = new TKonto (1000000, 70000);
  4 my $mein_konto = new TKonto (200, 500);

Danach führe ich in Zeile 13 eine Überweisung von meinem Boss zu mir durch.

 13 $boss_konto->ueberweise ($mein_konto, 1000);

Um zu kontrollieren, dass die Überweisung korrekt durchgeführt wurde und dabei keine wundersame Geldvermehrung oder -vernichtung stattgefunden hat, gebe ich die einzelnen Kontostände, sowie die Gesamtsumme aus.

  9 printf "Boss Konto: %9d\n", $boss_konto->getKontostand();
 10 printf "Mein Konto: %9d\n", $mein_konto->getKontostand();
 11 printf "Summe : %9d\n", $boss_konto->getKontostand()+$mein_konto->getKontostand();

An diesem Beispiel sehen wir schon den prinzipiellen Ablauf beim Einsatz einer Klasse: Zuerst wird eine neue Variable erzeugt, dann werden Funktionen in Verbindung mit dieser Variablen aufgerufen:

my $var = new Klasse();
$var->example();

In der Sprache der Objektorientierung: new ist der Konstruktor der Klasse, die Variable speichert eine Instanz der Klasse und die subs werden Methoden genannt.

Nachdem wir gesehen haben, dass die Klasse funktioniert, wollen wir jetzt wissen, wie die Klasse funktioniert.

A. Anhang 1

B. Anhang 2

C. Musterlösung zur Aufgabe