Tupel haben eine besondere Bedeutung im Bereich der Computer, dieser Name mag etwas fremd klingen, und es gibt im Grunde keine Anwendungsszenarien beim Schreiben von Code. Überraschenderweise sind Tupel jedoch eng mit Programmierung verwandt. Einige Studierende wissen vielleicht nicht, dass ein anderer akademischer Begriff für "Datensätze" in relationalen Datenbanken "Tupel" ist, ein Datensatz ein Tupel ist, eine Tabelle eine Beziehung, Datensätze bestehen aus Tabellen, Tupel erzeugen Beziehungen – das ist das Kernkonzept relationaler Datenbanken.
Tupel sind ein untrennbarer Bestandteil einer relationalen Datenbank, aber sie sind in der Programmierung nicht so unverzichtbar. Einige Programmiersprachen haben ihre eigene Tupelsyntax, wie Python, F#, Haskell, Scala usw., während andere beliebter sind, aber keine Tupelsyntax haben, wie Java, JavaScript, C++, C# usw.
Tupel sind keine unverzichtbaren Programmierelemente wie Arrays und Objekte, aber ihre Verwendung kann sehr praktisch zum Schreiben von Code sein, besonders wenn eine Funktion mehrere Werte zurückgeben muss. In diesem Fall ist es üblich, ein Objekt zu definieren, den Wert, den die Funktion zurückgeben muss, als Attribut des Objekts festzulegen und dann den Rückgabewerttyp der Funktion auf den Typ des Objekts zu setzen. Oder du lässt diese Funktion eine Map-Datenstruktur zurückgeben, in der die spezifischen Daten existieren. Beide Ansätze haben jedoch ihre Schwächen, und die erste Methode ist zuverlässig, aber der Code ist ungewöhnlich aufgebläht. Die Anforderungen selbst sind sehr einfach, solange die Funktion mehrere Werte zurückgibt, aber diese Methode erfordert, einen Typ im Voraus zu definieren, ihn dann zu instanziieren, dann die Instanzeigenschaften zu setzen und schließlich zurückzugeben, was zu ineffizient ist. Obwohl die zweite Methode schnell, aber nicht sicher genug ist, kann innerhalb der Funktion wissen, welcher Wert in der Abbildung gespeichert ist, aber außerhalb der Funktion nur wissen, dass der Rückgabewert dieser Funktion eine Abbildung ist, also welche Werte in der Abbildung gespeichert sind und welcher Typ nicht bekannt ist; dieser Nachteil ist besonders offensichtlich, leider ist diese Praxis in einigen dynamisch typisierten Sprachen die bevorzugte Lösung, was auch einer der grundlegenden Gründe ist, warum dynamisch typisierte Sprachen wegen schlechter Sicherheit und Lesbarkeit kritisiert werden. Daher ist die beste Lösung für diese Art von Problem die Verwendung von Tupeln.
In Sprachen, in denen die Syntax selbst Tupel unterstützt, werden Tupel durch Klammern dargestellt, wie zum Beispiel (int, bool, string) ein Triple-Typ, und sein Wert kann (1, wahr, "abc") sein. Es sollte beachtet werden, dass jeder Tupeltyp eindeutig ist (int, bool), (bool, int), (String, Double) sind alles Binären, aber es sind unterschiedliche Tupel, wenn man hier ein bestimmtes Tupel als Rückgabewert der Funktion nimmt, obwohl es in Bezug auf Lesbarkeit und Sicherheit nicht so gut ist wie die erste Lösung mit benutzerdefinierten Typen, was Lesbarkeit und Sicherheit betrifft, aber sie ist viel besser als die zweite Lösung mit Map, zumindest kann man mit Tupeln wissen, wie viele Werte die Funktion zurückgibt, Welche Art von Wert sind diese Werte? Es hat den Vorteil, dass es einfach und schnell ist, ein zweites Schema mit Map zu programmieren.
Glücklicherweise unterstützen diese Programmiersprachen heute Generika, und die Implementierung von nicht eingebauten Tupeln ist äußerst einfach geworden, aber schließlich handelt es sich um ein nicht-sprachliches eingebautes Syntaxelement und definitiv nicht so praktisch zu verwenden wie native Tupel.
Im Folgenden wird eine Drittanbieter-Java-Tupel-Bibliothek namens Javatuples eingeführt, mit eigener offizieller Homepage und Hunderten von Github-Stars, die im Bereich der Java-Tupel fast eine Monopolstellung einnimmt.
Javatuples definieren ein Tupel mit maximaler Länge von 10, aber ich denke, die Anzahl der Elemente in einem 10-Tupel ist bereits zu hoch, und es gibt praktisch keine Lesbarkeit. Tuple-Klassen sind wie folgt definiert:
Einheit<A> (1 Element)
Paar<A,B> (2 Elemente)
Triplet<A,B,C> (3 Elemente)
Quartett<A,B,C,D> (4 Elemente)
Quintett<A,B,C,D,E> (5 Elemente)
Sextett<A,B,C,D,E,F> (6 Elemente)
Septett<A,B,C,D,E,F,G> (7 Elemente)
Oktett<A,B,C,D,E,F,G,H> (8 Elemente)
Ennead<A,B,C,D,E,F,G,H,I> (9 Elemente)
Dekade<A,B,C,D,E,F,G,H,I,J> (10 Elemente) Diese archetypischen Klassen sind generische Klassen, daher können die Buchstaben in Winkelklammern durch beliebige Typen ersetzt werden. Nachfolgend ein Beispiel für einen Binärcode
Durch das ziehen von Schlussfolgerungen werden die übrigen Tupeltypen auf die gleiche Weise verwendet.
Da Javas Tupel nicht von der Sprache selbst unterstützt werden, wirkt der Code javanisch und weniger elegant. Beim Schreiben von Code kann das Schreiben jedoch neben der Bequemlichkeit des Schreibens die Effizienz verbessern, sondern auch wichtiger, mehr auf die vom Code ausgedrückte Bedeutung zu achten, nämlich die Bedeutung (Funktion) des Tupels selbst zu nutzen, um den Code zu verbessern, und wie man ihn schreibt, ist tatsächlich nur sekundär.
Abschließend sollte beachtet werden, dass der Typ in den generischen Winkelklammern nicht der Grundtyp von Java sein kann; wenn man den Grundtyp verwenden will, muss er auch der grundlegende Typ sein, der geboxt wurde, zum Beispiel muss der Int-Typ in Integer umgewandelt werden und der Bool-Typ dem Boolesche Typ entspricht. |