Tupler har en spesiell betydning innen datamaskinfeltet, dette navnet kan høres litt ukjent ut, og det finnes egentlig ingen anvendelsesscenarier for å skrive kode, men overraskende nok er tupler nært knyttet til programmering, noen studenter vet kanskje ikke at et annet akademisk navn for "poster" i relasjonsdatabaser er "tuples", en post er en tuple, en tabell er en relasjon, poster består av tabeller, tupler genererer relasjoner, dette er kjernen i relasjonsdatabaser.
Tupler er en uatskillelig del av en relasjonsdatabase, men de er ikke så uunnværlige i programmering. Noen programmeringsspråk har sin egen tuplesyntaks, som python, F#, haskell, scala, osv., mens andre er mer populære men ikke har tuplesyntaks, som Java, JavaScript, C++, C# osv.
Tupler er ikke uunnværlige programmeringselementer som arrays og objekter, men bruken kan være svært praktisk for å skrive kode, spesielt når en funksjon må returnere flere verdier. I dette tilfellet er vanlig praksis å definere et objekt, sette verdien funksjonen trenger returnere som objektets attributt, og deretter sette returverditypen til funksjonen til objektets type. Eller du kan la denne funksjonen returnere en kartdatastruktur der de spesifikke dataene finnes. Begge tilnærmingene har imidlertid sine svakheter, og den første metoden er pålitelig, men koden er uvanlig oppblåst. Kravene i seg selv er veldig enkle, så lenge funksjonen returnerer flere verdier, men denne metoden krever at man definerer en type på forhånd, deretter instansierer den, setter instansens egenskaper, og til slutt returnerer, noe som er for ineffektivt. Selv om den andre metoden er rask, men ikke sikker nok, kan det inne i funksjonen vite hvilken type verdi som er lagret i kartet, men utenfor funksjonen er det bare å vite at returverdien til denne funksjonen er et kart, altså hvilke verdier som lagres i kartet, hvilken type som ikke er kjent, i flerpersoners utviklingsprosjekter. Denne ulempen er spesielt åpenbar, dessverre er denne praksisen den foretrukne løsningen i noen dynamisk typede språk, noe som også er en av de grunnleggende grunnene til at dynamisk typede språk blir klaget på for dårlig sikkerhet og lesbarhet. Derfor er den beste løsningen på denne typen problem å bruke tupler.
I språk hvor syntaksen selv støtter tupler, representeres tupler med parenteser, slik at (int, bool, string) er en trippeltype, og verdien kan være (1, true, "abc"). Det bør bemerkes at hver tupletype er unik, (int, bool), (bool, int), (streng, dobbel) er alle binærer, men de er forskjellige tupler hvis du tar en bestemt tuple her som returverdien til funksjonen, selv om den ikke er like god som den første løsningen med egendefinerte typer nevnt tidligere når det gjelder lesbarhet og sikkerhet, men den er mye bedre enn den andre løsningen som bruker map, i det minste kan man ved hjelp av tupler vite hvor mange verdier funksjonen vil returnere, Hva slags verdi er disse verdiene, og det har fordelen av at det er enkelt og raskt å kode et andre skjema ved hjelp av map.
Heldigvis støtter disse programmeringsspråkene nå generiske språk, og implementeringen av ikke-innebygde tupler har blitt ekstremt enkel, men tross alt er det et ikke-språklig innebygd syntakselement, og det er definitivt ikke like praktisk å bruke som native tupler.
Følgende introduserer et tredjeparts Java-tuplebibliotek, kalt Javatuples, med egen offisiell hjemmeside og hundrevis av github-stjerner, som nesten har monopolposisjon innen Java-tupler.
Javatupler definerer en tuple med maksimal lengde på 10, men jeg mener antallet elementer i en 10-tuple allerede er for mye, og det er i praksis ingen lesbarhet. Tupleklasser er definert som følger:
Enhet<A> (1 element)
Par<A,B> (2 elementer)
Triol<A,B,C> (3 elementer)
Kvartett<A,B,C,D> (4 elementer)
Kvintett<A,B,C,D,E> (5 elementer)
Sextett<A,B,C,D,E,F> (6 elementer)
Septett<A,B,C,D,E,F,G> (7 elementer)
Oktett<A,B,C,D,E,F,G,H> (8 elementer)
Ennead<A,B,C,D,E,F,G,H,I> (9 elementer)
Decade<A,B,C,D,E,F,G,H,I,J> (10 elementer) Disse arketypiske klassene er generiske klasser, så bokstavene i vinkelparenteser kan erstattes med vilkårlige typer. Nedenfor er et eksempel på en binær kode
Ved å trekke slutninger brukes resten av tupletypene på samme måte.
Fordi Javas tupler ikke støttes av selve språket, ser koden javanesisk og mindre elegant ut. Men når man skriver kode, i tillegg til bekvemmeligheten ved å skrive, kan forbedre effektiviteten, er det viktigere å være mer oppmerksom på meningen som uttrykkes av koden selv, nemlig å bruke betydningen (funksjonen) til selve tupleen for å forbedre koden, og hvordan man skriver den er faktisk bare sekundært.
Til slutt bør det bemerkes at typen i de generiske vinkelparentesene ikke kan være grunntypen i Java; hvis du vil bruke grunntypen, må det også være grunntypen som er bokset, slik at int-typen må konverteres til heltall, og bool-typen tilsvarer den boolske typen. |