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

Fazit

D ist eine interessante Weiterentwicklung von C und trägt trotz Klassen, Templates, Ausnahmen und Überladen von Funktionen weitaus weniger Ballast als C++ mit sich herum. Wer sich in C und objektorientierter Programmierung auskennt, hat auch D schnell gelernt. An einigen Stellen ist der Neuling jedoch unelegant, zum Beispiel bei Templates: Es wäre einfacher, eine Klasse mit generischen Parametern zu verwenden, etwa nach dem Vorbild von Eiffel.

Leider sind Teile der in der Dokumentation beschriebenen Funktionalität noch nicht implementiert. Die größten Nachteile hat D aber im Bereich der Werkzeugunterstützung. Trotz dieser Defizite sollten C-Programmierer einen Blick auf D werfen: Die Kombination aus Erweiterungen, die zu robuster und gut dokumentierte Software führen sollen, mit wichtigen Funktionen für die systemnahe Programmierung macht D zu einer interessanten Sprache. (fjl)

Infos

[1] D-Homepage und Handbuch: [http://www.digitalmars.com/d/]

[2] DMD-Compiler: [http://www.digitalmars.com/d/dcompiler.html]

[3] DUI: [http://ca.geocities.com/duitoolkit/]

[4] Listings: [ftp://ftp.linux-magazin.de/pub/listings/magazin/2004/01/D/]

Listing 2: Objektorientiertes
D-Programm

001 interface InterfaceEx1 {
002    double area ();
003 }
004 
005 interface InterfaceEx2 {
006    double perimeter();
007 }
008 
009 class Figure : InterfaceEx1, InterfaceEx2 {
010    /* Dummy-Klasse */
011    double area () { return 0.0;}
012    double perimeter (){ return 0.0;}
013 }
014 
015 class Rectangle : Figure {
016    private import math2;
017 
018    private:
019    double side_1;
020    double side_2;
021 
022    export {
023       double get_side_1() {return side_1;}
024       double get_side_2() {return side_2;}
025 
026       this () {
027          side_1 = 1.0;
028          side_2 = 1.0;
029       }
030 
031       this (double s1, double s2){
032          side_1 = s1;
033          side_2 = s2;
034       }
035 
036       double area ()
037          out (result) {
038             assert(feq(result, (get_side_1() * get_side_2())));
039          }
040          body {
041             return (get_side_1()  * get_side_2());
042          }
043 
044       double perimeter () {
045          return (2 * (get_side_1() + get_side_2()));
046       }
047    }
048 }
049 
050 class Circle: Figure {
051    import math;
052 
053    private:
054    double radius;
055 
056    public {
057       this () { radius = 1.0; }
058       this (double init_val) { radius = init_val; }
059       double get_radius () { return radius; }
060       double area () { return (PI * radius * radius); }
061       double perimeter () { return (PI * 2 * radius); }
062    }
063 }
064 
065 class Triangle : Figure {
066    private import math2;
067    private import math;
068 
069    private:
070    double epsilon = 0.001;
071    double side_a, side_b, side_c;
072 
073    public {
074       this () {
075          side_a = side_b = side_c = 1.0;
076       }
077 
078       this (double sa, double sb, double ag) {
079          /* Given side a, side b and the enclosing angle */
080          double angle_gamma = deg2rad(ag);
081          side_a = sa; side_b = sb;
082          side_c = sqrt((sa * sa) + (sb * sb) -
083             2 * side_a * side_b * cos(angle_gamma));
084       }
085 
086       double area () {
087          /* Heron'sche Formel */
088          double s = ((side_a + side_b + side_c) / 2);
089          return (sqrt(s * (s - side_a) * (s - side_b) * (s - side_c)));
090       }
091 
092       double perimeter () {
093          return side_a + side_b + side_c;
094       }
095    }
096 }
097 
098 unittest {
099     assert(10.001 ==  10.00);
100     assert(feq (rad2deg(deg2rad (90.0)), 90.0));
101 }
102 
103 import c.stdio; // für sscanf
104 int main (char[][] args){
105    char [] v1;
106    char [] v2;
107    double dv1, dv2;
108 
109    sscanf(args[1], "%lf", &dv1);
110    sscanf(args[2], "%lf", &dv2);
111 
112    Figure fig = new Rectangle(dv1, dv2);
113    printf("Rectangle: area = %.2lf, perimeter = %.2lfn",
114       fig.area(), fig.perimeter());
115 
116    fig = new Circle(10.0);
117    printf("Circle area = %.2lf, perimeter = %.2lfn",
118       fig.area(), fig.perimeter());
119 
120    fig = new Triangle();
121    printf("Triangle  area = %.2lf, perimeter = %.2lfn",
122       fig.area(), fig.perimeter());
123 
124    return 0;
125 }

Copyright © 2002 Linux New Media AG

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

Ausgabe 11/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Stellenmarkt

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