Gedanken zu Typaliasnamen / Synonymen?

10

Ich werde mein Bestes geben, um diese Frage so zu gestalten, dass sie nicht zu einem Sprachkrieg oder einer Sprachliste führt, da ich denke, dass es eine gute technische Antwort auf diese Frage geben könnte.

Verschiedene Sprachen unterstützen Typaliasnamen in unterschiedlichem Maße. Mit C # können Typaliasnamen am Anfang jeder Codedatei deklariert werden, und sie sind nur in dieser Datei gültig. Sprachen wie ML / Haskell verwenden wahrscheinlich genauso viele Typaliasnamen wie Typdefinitionen. C / C ++ sind eine Art von Wilder Westen, mit typedefund #defineoft scheinbar austauschbar Typen Alias verwendet wird.

Die Vorteile des Typ-Aliasing führen nicht zu viel Streit:

  • Es macht es bequem, zusammengesetzte Typen zu definieren, die natürlich durch die Sprache beschrieben werden, z . B. type Coordinate = float * floatoder type String = [Char].
  • Lange Namen können gekürzt werden : using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute.
  • In Sprachen wie ML oder Haskell, in denen Funktionsparameter häufig keine Namen haben, bieten Typ-Aliase einen Anschein von Selbstdokumentation.

Der Nachteil ist etwas zweifelhafter: Aliase können sich vermehren, was es schwierig macht, Code zu lesen und zu verstehen oder eine Plattform zu erlernen. Die Win32-API ist ein gutes Beispiel mit ihrem DWORD = intund seinem HINSTANCE = HANDLE = void*und seinem LPHANDLE = HANDLE FAR*und so. In all diesen Fällen macht es kaum Sinn, zwischen einem GRIFF und einem leeren Zeiger oder einem DWORD und einer ganzen Zahl usw. zu unterscheiden.

Wenn man die philosophische Debatte darüber beiseite lässt, ob ein König seinen Untertanen völlige Freiheit geben und sie für sich selbst verantwortlich machen sollte oder ob sie alle ihre fragwürdigen Handlungen eingreifen sollten, könnte es ein glückliches Medium geben, das die Vorteile von Typ-Aliasing währenddessen zulässt das Risiko seines Missbrauchs mindern?

Beispielsweise kann das Problem langer Namen durch gute Funktionen zur automatischen Vervollständigung gelöst werden. In Visual Studio 2010 können Sie beispielsweise DSBA eingeben, um Intellisense auf System.Diagnostics.DebuggerStepBoundaryAttribute zu verweisen. Könnte es andere Funktionen geben, die die anderen Vorteile des Typ-Aliasing sicherer bieten?

Rei Miyasaka
quelle
Intellisense oder nicht, System.Diagnostics.DebuggerStepBoundaryAttribute ist im Code viel weniger lesbar als DSBA, insbesondere wenn es häufig verwendet wird.
Zvrba
@zvrba: eigentlich DebuggerStepBoundaryAttributeist viel besser lesbar als DSBA. Im ersten Fall wissen Sie, was es bedeutet. Im zweiten hast du keine Ahnung. Stellen Sie sich nun vor, Sie verwenden im Code zwanzig verschiedene Aliase wie diesen. Hätte jemand genug Mut, um zu versuchen, Ihren Code zu lesen und zu verstehen?
Arseni Mourzenko

Antworten:

3

Mir fallen zwei Merkmale ein:

Portabilität. In Sprachen wie C, in denen Datentypen wie intplattformspezifisch sind, DWORDerleichtert ein Alias ​​wie die Sicherstellung, dass Sie wirklich überall eine 32-Bit-Ganzzahl mit Vorzeichen verwenden, wenn dies für Ihr Programm erforderlich ist, selbst wenn Sie das Programm auf eine Plattform portieren, auf der es sich intbefindet zB 16bit ohne Vorzeichen und muss daher DWORDein Alias ​​für sein signed long.

Abstraktion. In Ihrem Programm können Sie viele Ganzzahl- und Gleitkommazahlen für verschiedene Zwecke verwenden. Durch die Schaffung von Aliasnamen wie SPEED, HEIGHT, TEMPERATUREist es relativ einfach , eine von denen sich ändern zB von floatzu doubleund die anderen zu lassen , wie sie sind.

user281377
quelle
Das beantwortet die Frage jedoch nicht ...
Rei Miyasaka
@Rei, du hast recht, dass ammoQ die Frage nicht beantwortet, sondern wirklich kommentiert hat. Trotzdem erlaubt P.SE keine formatierten oder langen Kommentare ... Ich denke, er verdient keine Ablehnung: Sein Kommentar ist thematisch und gut.
Ando
@Andrea es scheint nicht das Ergebnis zu sein, die Frage vollständig gelesen zu haben; Abgesehen von dem Hinweis zur Portabilität (der nur ein weiterer Punkt ist, der in die Liste der Upsides aufgenommen werden muss), handelt es sich nur um eine Wiederholung.
Rei Miyasaka
2

Ich stimme Andrea zu, dass Sie eine Kapselung benötigen, aber ich bin nicht der Meinung, dass dies teuer sein muss.

Ich denke, das Happy-Medium wäre typsichere Typedefs, die wahrscheinlich eine explizite Konvertierung zwischen dem realen Typ und dem Typedef ermöglichen, aber eine implizite Konvertierung verhindern.

Das Hauptproblem, das ich bei Typedefs in vielen Sprachen sehe, ist, dass sie keinen neuen Typ einführen, sondern lediglich einen Alias. Dies ist zwar nützlich, aber nicht so nützlich wie ein neuer Typ, der dem alten Typ ähnelt, aber einen neuen Name. Und Komposition oder Vererbung sind zu schwer, wenn Sie nur sicherstellen möchten, dass Sie nicht einige Variablen mischen.

jk.
quelle
1
Ich könnte nicht mehr zustimmen, ich würde wirklich gerne diese Art von "begrenztem" Polymorphismus sehen. Wenn type Name = String, dann Stringkann a nicht an eine erwartete Funktion a übergeben werden Name, aber das Gegenteil ist möglich.
Matthieu M.
1

Ich denke, Typ-Aliase geben dem faulen Programmierer (sehr) billige Kapselung. Vielleicht könnte die Alternative darin bestehen, eine ordnungsgemäße (teure) Kapselung zu verwenden.

Es gibt auch das Argument, dass Ersteres für die verwendete Maschine / Sprache viel optimierter ist als Letzteres.

Ando
quelle