Open Source im professionellen Einsatz
Linux-Magazin 01/2004
573

Verträge

Die »area()«-Funktion (Zeilen 36 bis 42) benutzt eine hilfreiche Erweiterung, die so genannten Verträge. Sie legen offen, welchen Anforderungen übergebene Parameter genügen müssen (»in«-Blöcke) und was nach der Ausführung einer Methode gilt (»out«-Blöcke). Im Beispiel gibt es keine Vorbedingung, der Rückgabewert muss aber dem Produkt der beiden Seiten entsprechen. Da die Methode mit Fließkommazahlen rechnet, empfiehlt es sich, nur mit begrenzter Genauigkeit zu testen: »feq()« ist einem »==«-Vergleich vorzuziehen.

Das »assert()« ähnelt dem von C, allerdings moniert es bei einer Verletzung des Kontrakts eine Ausnahme (Exception). Behandelt das Programm die Ausnahme nicht, sorgt D für eine Meldung, in der steht, an welcher Stelle das Programm einen Vertrag gebrochen hat. Gerade während der Entwicklung ist dieses Verhalten praktisch.

In den Zeile 112 bis 122 zeigt sich der Vorteil der Basisklasse »Figure«: Der Code weist der Variablen »fig« nacheinander Objekte der Klassen »Rectangle«, »Circle« und »Triangle« zu. Obwohl »fig« vom Typ »Figure« ist, ruft »fig.area()« immer die Implementierung auf, die zum jeweiligen Objekt gehört. Allgemeiner ausgedrückt: In D kann der Programmierer einem Vorgängerobjekt Nachfolgerobjekte zuordnen (Covariance). Implementiert ein Nachfolger genau die Schnittstelle des Vorgängers, dann lassen sich Funktionen durch das Vorgängerobjekt aufrufen. Tatsächlich ausgeführt wird aber die Implementierung des Nachfolgers.

Diese kovariante Zuordnung ist speziell in größeren Programmbibliotheken recht nützlich, da sich damit leicht Schablonen für Algorithmen erstellen lassen. So ist die Ausgabe einer Figur, die aus verschiedenen Elementen (Kreisen, Polygonen ...) besteht, recht einfach - vorausgesetzt jedes Element implementiert eine Methode wie »draw()«.

In D sind übrigens alle Objekte Referenzen (Pointer auf Klassenstrukturen). Dennoch folgt die Aufrufsyntax für Klassenmethoden und Attribute der einfachen » Objektname.feature()«-Konvention; C- und C++-Programmierer würden hier eher »->« erwarten.

Templates und Ausnahmen

Schablonen (Templates) sind ein zentrales Element für die wieder verwendbaren Komponenten in statisch getypten Sprachen. Auf dem FTP-Server des Linux-Magazins[4] ist ein ausführliches Beispiel zu finden. Folgender Code definiert eine Vorlage »LinkedListTemplate«, die einen generischen Parameter »T« akzeptiert:

template LinkedListTemplate(T) {
   class LinkedList {
      T item;
      LinkedList next;
      uint count;
      private LinkedList head;
      private LinkedList last;


Innerhalb der Schablone ist eine Klasse definiert, die sich auf diesen generischen Typ bezieht. Um eine Instanz dieser Klasse zu erzeugen, die mit dem gewünschten Typ versehen ist, ist etwas Tipparbeit nötig, die sich aber mit dem »alias«-Schlüsselwort umgehen lässt. In Listing 3 sorgt Zeile 2 dafür, dass »IntList« als Ersatz für die verschachtelte Klassendefinition dient: »IntList mylist« erzeugt eine verkettete Liste, die Elemente vom Typ »int« aufnimmt.

Listing 3: Unit-Test

01 unittest {
02    alias instance LinkedListTemplate(int).LinkedList  IntList;
03    IntList res_list = new IntList();
04    res_list.insert_last(1);
05    res_list.insert_last(2);
06    res_list.insert_last(3);
07    assert(res_list.item_at(0) == 1);
08    assert(res_list.item_at(1) == 2);
09    assert(res_list.item_at(2) == 3);
10 }

Eines der bemerkenswerten Features von D sind die integrierten Unit-Tests, die mit dem Schlüsselwort »unittest« beginnen. In Listing 3 ist ein solcher Testblock zu sehen; er kann an beliebiger Stelle im Code stehen. Damit lassen sich Code und Test hervorragend integrieren.

Eine weitere Technik, die für mehr Codequalität sowie robustere Programme sorgt, sind Ausnahmen (Exceptions). Ausnahmen sind in D immer Instanzen von Klassen, die von »Exception« oder »Error« erben sollten. Um einen Fehler anzuzeigen, wirft »throw« ein Ausnahmeobjekt. Tritt innerhalb eines »try«-Blocks eine Ausnahme auf, dann kann eine passende »catch( Ausnahme)«-Anweisungen die Exception fangen und geeignet reagieren.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Programmieren mit Py Side, Ressourcendateien, Qt Quick und QML

    Dieser Beitrag ergänzt den Artikel "Starkes Gespann - Py Side: Programmieren mit Python und Qt" aus dem Linux-Magazin 11/11. Hier erfahren Entwickler, wie sie Ressourcendateien sowie Qt Quick und QML für GUI-Anwendungen einsetzen.

  • Py Side

    Die Bibliothek Py Side kombiniert Python mit den GUI-Fähigkeiten von Qt. Unter anderem bietet sie plattformunabhängige Techniken für Nebenläufigkeit und Netzwerkprogrammierung.

  • Perl-Snapshot

    Selbst gestandenen Wissenschaftlern unterlaufen zuweilen Fehler beim Interpretieren von Statistiken. Mathematische Experimente können helfen, sich dagegen zu wappnen, und kleine Simulationen in Perl unterstützen den Lernprozess anschaulich

  • C++11

    Indem er das Zauberwort "constexpr" anwendet, erreicht der Programmierer, dass C++11 seine Ausdrücke bereits beim Kompilieren auswertet. Folgt er dabei den vorgefertigen Beschwörungsritualen, generieren solche konstanten Ausdrücke Performancegewinne.

  • Insecurity Bulletin

    Eine Schwachstelle im Linux-Kernel führt dazu, dass ein lokaler Angreifer unter Umständen Befehle mit Kernelrechten ausführen kann.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.