Fragen zu CppCoreGuidelines



  • Hallo, folgende Fragen zu den CppCoreGuidelines:
    https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rp-direct
    Genauer geht es um eines der Beispiele ein Stück weiter unten.
    Das hier ist das bad example:

    change_speed(double s);   // bad: what does s signify?
    // ...
    change_speed(2.3);
    

    Und das hier das good example:

    change_speed(Speed s);    // better: the meaning of s is specified
    // ...
    change_speed(2.3);        // error: no unit
    change_speed(23m / 10s);  // meters per second
    

    Was genau ist damit gemeint?
    Was ist Speed? Eine Klasse? Ein using Speed = double; (das schließe ich durch den Text eigentlich aus).
    Und seit wann ist das Suffix "m" im Standard definiert? Davon habe ich noch nie gehört. Weil user defined Suffixes müssen meines Wissens mit einem Underscore beginnen.
    Wie schreibe ich eine Klasse, die dann nur meter/second annimmt?

    Und noch: im Text darunter wird ein Delta type erwähnt. Was ist damit gemeint? Über Google finde ich dazu absolut überhaupt nichts.

    Danke.


  • Mod

    Das ist egal, was das technisch gesehen ist. Kann eine Klasse sein, kann ein typedef sein, könnte sogar ein Makro sein. Aber darum geht es nicht. Es geht darum, dass beim Lesen unmittelbar ersichtlich ist, dass hier eine absolute Geschwindigkeitsangabe erwartet wird und beispielsweise kein Geschwindigkeitsunterschied, was aus dem Namen change_speed alleine sonst nicht ersichtlich wäre. Wenn da hingegen etwas wie Delta(-Speed) erwartet würde, wäre klar, dass ein Geschwindigkeitsunterschied erwartet wird.

    Zusätzlich werden auch noch dadurch, dass explizite Einheiten erzwungen werden, mögliche Unklarheiten diesbezüglich ausgeschlossen.

    Noch besser, das alles wird hier durch das Typensystem geprüft. Es ist daher auch nur schwer möglich, dass ein Programmierer das nicht mitbekommt, denn wenn er einfach nur irgendeine einheitenlose Zahl angeben würde, bekäme er beim compilieren einen Fehler.



  • Du kannst dir z.B. http://www.boost.org/doc/libs/1_66_0/doc/html/boost_units/Quick_Start.html oder https://github.com/nholthaus/units anschauen.

    Solange man nur einen Parameter hat, ist das Problem noch recht klein (man muss nur die richtige Einheit treffen). Ich hatte aber mal ein Problem mit Längengrad und Breitengrad: mit 2 double-Parametern kann man dann nicht nur Länge und Breite vertauschen (noch dazu klingen "longitude" und "latitude" für deutsche Muttersprachler sehr ähnlich), sondern muss auch noch überlegen, ob die Funktion nun Bogenmaß oder Grad haben will. Und hier reicht auch nicht, dass beide Parameter "Winkel" sein müssen, weil eben beides Winkel sind! In solchen Fällen ist es extrem hilfreich, wenn man das typsicher implementiert und unterschiedliche Klassen für dasselbe nimmt.


Log in to reply