(toiminnot)

hwechtla-tl: Symboli: viime muutokset

Symboli on ihan loistava tietotyyppi, mutta useimmat ohjelmoijat eivät edes tiedä niiden olemassaolosta; tai ovat tottuneet pärjäämään ilman niitä, jolloin eivät osaa hyödyntää niitä edes, vaikka ne olisivat tarjolla. Tämän kirjoituksen pointti on selittää, mitä hyötyä symboleista on, ja innostaa ihmiset käyttämään symboleita enemmän ohjelmissaan.

Symbolien käyttö on synergeettistä, vähän niin kuin esimerkiksi se, että esittää tekstin aina tunnetussa merkistössä (kuten Unicodena). Tekstit kannattaa muuttaa Unicodeksi (ja nimet nimet/tunnisteet symboleiksi) ''heti'', kun ohjelma ottaa ne vastaan, niitä kannattaa käsitellä ohjelman sisäisesti aina Unicodena (ja symboleina), ja ne kannattaa muuttaa tavuiksi (merkeiksi) vasta, kun data lähtee ohjelmasta esim. tiedostoon tai verkkoon. Rakenteettoman tietotyypin käyttö saattaa tuntua helpommalta, "suoraviivaisemmalta", mutta aina, kun haluaa jollain tavoin prosessoida tietoa, on mukavampaa, jos sillä on selkeä rakenne. Ja symbolit antavat nimille rakenteen.

[...]

Minkä rakenteen symboli antaa nimelle (merkkijonolle)? merkkijonolle? Sen, että sama nimi nimi/tunniste (merkkijono) viittaa aina samaan asiaan. Tämä on oikeasti merkkijonotietotyypin ja symbolin ainoa ero: symboli on merkkijono, josta taataan, että kaksi samansisältöistä merkkijonoa ovat aina sama merkkijono. Käytännössä tämä tarkoittaa, että kahden symbolin vertaaminen toisiinsa on yhtä nopeaa kuin pienten kokonaislukujen. (Usein symboliin voi myös liittää lisätietoja.)

Symbolittomissa kielissä, kuten Javassa, C:ssä C:ssä, Pythonissa jne., ohjelmoijat ovat usein tottuneet käyttämään lukuja tai luetelmia (enumeraatioita) tilanteissa, joissa tarvitsee ilmaista jokin monesta vaihtoehdosta. Esimerkiksi funktio, joka palauttaa kahden merkkijonon keskinäisen järjestyksen, voi ilmaista sen palauttamalla nollan tai negatiivisen tai positiivisen luvun sen mukaan, kumpi merkkijono on aakkostuksessa aiempi. Monet proseduurit palauttavat niin ikään ''virhekoodeja'' tai jonkin erityisarvon (kuten -1) tilanteessa, jossa ei ole kunnollista palautettavaa. Sama juttu funktioiden syötteissä: jos jokin syöte on monivalinta, siinä käytetään yleensä luetelmia.

[...]

Symbolit ovat itsensä dokumentoivia, tehokkaasti toteutettuja arvoja. tunnisteita. Se, että käyttää numeroita symbolien sijasta tällaiseen, on kuin käyttäisi rivinumeroita funktionimien sijasta viitatakseen ohjelman osiin. Symboleita ei tarvitse edes deklaroida millään tavoin, niitä voi käyttää saman tien. Tietyt tietotyypit, joiden arvoja on äärellinen määrä -- totuusarvot, tyhjä lista, viikonpäivät -- ovat ilman muuta symboleja.

Joissakin tietotyypeissä on ''potentiaalisesti'' ääretön määrä arvoja, mutta jotkin ovat yleisiä: värien nimet, henkilön ominaisuuksien nimet, luonnollisen kielen sanat, kuvien luokitteluun käytetyt tagit, protokollan eri viestit. Näissä ei ole edes mahdollista määritellä etukäteen kaikkia mahdollisia arvoja, mutta symboleita voi symboleitapa voikin muodostaa loputtomasti lisää ja kaikki on hyvin.

Tekstin käsittely on usein nopeampaa symboleilla. nopeampaa, kun muuntaa tekstin symboleiksi. Ei tosin ole kannattavaa muuttaa isoa tekstimössöä ''yhdeksi'' symboliksi, koska tämän symbolin vertailusta muihin on tuskin paljonkaan hyötyä. Mutta riippuen siitä, mitä tekstillä haluaa tehdä, esimerkiksi sen ''sanat'' (tai muut osat, kuten välimerkkien erottamat osat) voi muuttaa symboleiksi ja panna listaan. Jos etsii tekstistä paljon erilaisia ilmauksia, symbolien käyttö nopeuttaa prosessointia huomattavasti.

Symboleita kannattaa käyttää myös tietorakenteissa siellä, missä muuten käytettäisiin luetelmia, tageja tai nimiä. Jos esimerkiksi mallinnat dokumentin rakennepuuta, jokaisessa puun solmussa kannattaa ensimmäiseksi olla symboli, joka kertoo, minkälaisesta puun osasta on kyse (esim. kappale / korostus / otsikko / sana). IRC-protokollassa käyttäjien ja kanavien nimet sekä viestityypit ovat ilman muuta symboleita, koska ne ovat yksittäisten olioiden yksiselitteisiä tunnisteita.

Jos haluat lähdetään kehittämään tietorakenneajatusta pidemmälle, niin dynaamisesti tyypitetyn oliojärjestelmän, oliojärjestelmän saa merkitsemällä olioihin kannattaa merkitä luokka luokan symbolilla. Jos haluat toteuttaa ohjelmointikielen, muuttujiin ja funktioihin kannattaa viitata ohjelmakoodista jäsennetyssä syntaksipuussa symboleilla, ja jos teet tietorakenteen, tietuemäärittelyn, jossa on monta kenttää, kenttien nimien kannattaa olla symboleita.

Staattisissa kielissä käytetään joskus symbolien sijaan deklaraatioita: muuttujien, luokkien, jäsenkenttien, metodien ja funktioiden deklaraatioita. Tämä on ihan hyväksyttävä tapa antaa nimille identiteetti (tai asioille nimi). Mutta dynaamisissa Tunnisteet (''identifier'') ''ovat'' symbolien käännösaikainen vastine: nimi jollekin, joka oikeasti on vain muistiosoite tai numero. Dynaamisissa kielissä, joissa kaikkea ei tarvitse määritellä etukäteen, symbolit ovat verraton selkeytys. selkeytys; ja jos haluaa introspektiivisesti tutkia ohjelmaansa ajonaikaisesti, on luontevaa viitata myös käännösaikaisiin nimiin ajonaikaisilla symboleilla. (Symboleja tukevat kielet (Scheme, Lisp, Ruby) käytännössä aina yhdistävät käännösaikaisen nimiavaruuden ajonaikaisten symbolien nimiavaruuteen.)

[...]


(viimeksi muutettu 16.04.2013 14:35)