Ist es in Ordnung, C ++ anzupassen?

8

Für meine Projekte definiere ich normalerweise eine Menge Aliase für Typen wie unsigned int, char und double sowie std :: string und andere.

Ich habe auch Aliasing und zu & amp;; oder zu ||, nicht zu!, etc.

  • Ist das eine schlechte Übung oder okay?
Le syntax 25.11.2010, 21:34
quelle

6 Antworten

22

Das Definieren von Typen zum Hinzufügen von Kontext in Ihrem Code ist akzeptabel und wird sogar empfohlen. Das Herumschrauben mit den Betreibern wird nur die nächste Person, die Ihren Code pflegen muss, ermutigen, eine Waffe in Ihr Haus zu bringen.

    
Ignacio Vazquez-Abrams 25.11.2010 21:36
quelle
11

Nun, bedenkt die Neuankömmlinge, die an C ++ gewöhnt sind. Sie werden Schwierigkeiten haben, Ihr Projekt zu erhalten.

Beachten Sie, dass es viele Möglichkeiten für das effektivere Aliasing gibt. Ein gutes Beispiel sind komplizierte verschachtelte STL-Container.

Beispiel:

%Vor%

Jetzt statt

%Vor%

Sie können

schreiben %Vor%

scheint klarer und leserlicher zu sein.

    
Vlad 25.11.2010 21:36
quelle
10

Wenn Sie es nur für überflüssige Umbenennungsfunktionen verwenden (im Gegensatz zu dem Beispiel, das @Vlad gibt), dann ist es Falsche Sache .

Es macht den Code definitiv weniger lesbar - jeder, der C ++ beherrscht, wird (x ? y : z) sehen und wissen, dass es ein ternäres bedingter Operator . Obwohl ORLY x YARLY y NOWAI z KTHX dasselbe sein könnte, verwirrte es den Betrachter: "Ist YARLY NOWAI genau dasselbe wie ? : , wurde für die Bequemlichkeit des Autors umbenannt, oder hat es feine Unterschiede " Wenn diese "Aliase" mit den Standardsprachelementen identisch sind, verlangsamen sie nur die nächste Person, die Ihren Code verwaltet.

TLDR: Das Lesen von Code, egal welcher Code, ist schwer genug, ohne ständig die private alternative Syntax nachschlagen zu müssen.

    
Piskvor 25.11.2010 21:37
quelle
5

Das ist schrecklich. Tu es bitte nicht. Schreibe idiomatisches C ++, nicht irgendeine Makro-gespenstische Monstrosität. Im Allgemeinen ist es extrem schlecht, solche Makros zu definieren, außer in sehr speziellen Fällen (wie dem Makro BOOST_FOREACH ).

Das heißt, and , or und not sind tatsächlich bereits gültige Aliase für && , || und ! in C ++!

Visual Studio kennt sie nur, wenn Sie zuerst den Standard-Header <ciso646> einfügen. Andere Compiler brauchen das nicht.

Typen sind etwas anderes. Die Verwendung von typedef zum Erstellen von Typaliasen abhängig vom Kontext ist sinnvoll, wenn die Aussagekraft des Codes erhöht wird. Dann ist es ermutigt. Es wäre jedoch noch besser, eigene Typen anstelle von Aliasen zu erstellen. Zum Beispiel kann ich mir nicht vorstellen, dass es jemals von Vorteil wäre, einen Alias ​​für std::string zu erstellen - warum nicht einfach std::string direkt verwenden? (Eine Ausnahme sind natürlich generische Datenstrukturen und Algorithmen.)

    
Konrad Rudolph 25.11.2010 21:39
quelle
4
  • "und", "oder", "nicht" sind OK, weil sie Teil der Sprache sind, aber es ist wahrscheinlich besser, C ++ in einem Stil zu schreiben, den andere C ++ - Programmierer verwenden, und nur sehr wenige verwenden es Sie. Aliasieren Sie sie nicht selbst: Sie sind reservierte Namen und es ist im Allgemeinen nicht erlaubt, reservierte Namen auch im Präprozessor zu verwenden. Wenn Ihr Compiler sie nicht im Standardmodus bereitstellt (dh es ist nicht standardkonform), könnten Sie sie mit #define vortäuschen, aber Sie könnten sich in Zukunft auf Probleme einstellen Sie ändern den Compiler oder ändern die Compiler-Optionen.

  • typedefs für integrierte Typen kann unter bestimmten Umständen sinnvoll sein. Zum Beispiel gibt es in C99 (aber nicht in C ++ 03) erweiterte Integertypen wie int32_t , die eine 32-Bit-Ganzzahl angeben, und auf einem bestimmten System, das ein typedef für int sein könnte. Sie kommen von stdint.h ( <cstdint> in C ++ 0x), und wenn dein C ++ - Compiler das nicht als Erweiterung anbietet, kannst du im Allgemeinen eine Version von ihr finden oder schreiben, die für dein System funktioniert. Wenn Sie einen bestimmten Zweck haben, für den Sie vielleicht in Zukunft einen anderen Integer-Typ verwenden möchten (vielleicht auf einem anderen System), dann verstecken Sie auf jeden Fall den "echten" Typ hinter einem Namen, der die wichtigen Eigenschaften beschreibt, die der Grund sind Sie haben diesen Typ für diesen Zweck ausgewählt. Wenn du nur denkst, dass "int" unnötig kurz ist und es "ganzzahlig" sein sollte, dann hilfst du niemandem, selbst dir selbst nicht, indem du versuchst, die Sprache so oberflächlich zu verändern. Es ist eine zusätzliche Indirektion für keinen Gewinn, und auf lange Sicht ist es besser, C ++ zu lernen, als C ++ zu ändern, um "mehr Sinn" für Sie zu machen.

  • Ich kann mir keinen guten Grund vorstellen, irgendeinen anderen Namen für string zu verwenden, außer in einem Fall ähnlich den erweiterten Integer-Typen, wo Ihr Name vielleicht ein Typdef für string auf einigen ist Builds und wstring für andere.

  • Wenn Sie kein englischer Muttersprachler sind und versuchen, C ++ in eine andere Sprache zu übersetzen, dann sehe ich Ihren Standpunkt, aber ich denke nicht, dass das eine gute Idee ist. Sogar andere Sprecher Ihrer Sprache werden C ++ besser kennen, als sie die Übersetzungen kennen, die Sie zufällig ausgewählt haben. Aber ich bin ein englischer Muttersprachler, also weiß ich nicht wirklich, wie viel Unterschied es macht. Wenn man bedenkt, wie viele C ++ Programmierer es auf der Welt gibt, die Sprachen nicht übersetzen, dann ist das, glaube ich, keine große Sache, verglichen mit der Tatsache, dass die gesamte Dokumentation auf Englisch ist ...

Steve Jessop 25.11.2010 23:24
quelle
0

Wenn jeder C ++ - Entwickler mit Ihren Aliasen vertraut war, warum nicht, aber Sie sind mit diesen Aliasen, die im Grunde eine neue Sprache für jeden einführen, der Ihren Code pflegen muss.

Warum fügen Sie diesen zusätzlichen mentalen Schritt hinzu, der in den meisten Fällen keine Klarheit bringt (& amp; & amp; und || sind ziemlich offensichtlich, was sie für jeden C / C ++ - Programmierer tun, und in C ++ können Sie den and und or keywords)

    
hhafez 25.11.2010 22:32
quelle

Tags und Links