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 typedef
und #define
oft 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 * float
odertype 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 = int
und 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?
quelle
DebuggerStepBoundaryAttribute
ist viel besser lesbar alsDSBA
. 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?Antworten:
Mir fallen zwei Merkmale ein:
Portabilität. In Sprachen wie C, in denen Datentypen wie
int
plattformspezifisch sind,DWORD
erleichtert 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 sichint
befindet zB 16bit ohne Vorzeichen und muss daherDWORD
ein Alias für seinsigned 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
,TEMPERATURE
ist es relativ einfach , eine von denen sich ändern zB vonfloat
zudouble
und die anderen zu lassen , wie sie sind.quelle
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.
quelle
type Name = String
, dannString
kann a nicht an eine erwartete Funktion a übergeben werdenName
, aber das Gegenteil ist möglich.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.
quelle