Olen nyt tehnyt muutaman harrasteprojektin kahdella staattisesti tyypitetyllä kielellä: Scalalla ja Go:lla. Molemmissa tapauksissa olen törmännyt kohtuuttomiin hankaluuksiin heti, kun pitäisi käsitellä JSON-muotoista dataa.

Staattisen tyypityksen perusongelma on, että se vaatii kaikkien tietorakenteiden olevan ennalta määritellyn tyypityksen mukaisia. Esimerkiksi JSON-rakenne voi kyllä olla tällainen:

{ "title":  "Otsikko",
  "text":   "Teksti",
  "author": "Kirjoittaja" }

Ylläoleva rakenne voitaisiin kuvata Go:ssa tyypillä map[string]string tai Scalassa tyypillä Map[String, String].

Mutta heti, jos jokin kentistä on vähän erilainen, tulee ongelmia:

{ "title":   "Otsikko",
  "text":    "Teksti",
  "authors": ["Kirjoittaja 1", "Kirjoittaja 2"] }

Tuollainen rakenne kun ei vastaa enää mitään staattista tyypitystä. Go:ssa täytyy käyttää geneerisiä interfaceja eli tyyppiä map[string]interface{} ja Scalassa taas Any-tyyppiä muodossa Map[String, Any].

Tämä taas aiheuttaa, että kenttien arvoja ei voi enää lukea suoraan tyyliin authors := json["authors"], vaan ne pitää typecastata tai assertoida erikseen tyyliin authors, ok := json["authors"].([]string). Tästä seuraa sitten hirvittävää monimutkaisuutta, kun käsitellään sisäkkäisiä hierarkioita ja taulukoita.

Johtopäätökseni tästä kaikesta on, että staattisesti tyypitetyt kielet eivät kerta kaikkiaan sovi nykyaikaiseen web-ohjelmointiin, jossa käsitellään dynaamisia tietorakenteita.

Pystyn myös hyvin näkemään, että Javalla tai C#:llä pääasiallisesti ohjelmoivat henkilöt eivät arvosta JSONia läheskään niin paljon kuin esimerkiksi Python-koodaajat, koska se ei "istu" mukavasti kieleen. Tästä seuraa myös, että CouchDB:n ja MongoDB:n kaltaisten NoSQL-tietokantojen käyttö on kovin hankalaa, koska niiden koko idea perustuu dynaamisiin JSON-rakenteisiin.

Kannattaa siis luopua staattisesti tyypitetyistä kielistä nyt, ettei jää ikuisesti jumiin SQL:n ja XML:n rajoittuneeseen maailmaan!

[Update: Puhuin alun perin hieman sekaisin staattisesta ja vahvasta tyypityksestä. Olen tietoinen näiden eroista, ja viittaan tässä lähinnä staattisen tyypityksen ongelmiin. Korjasin sanamuodon pariin kohtaan mutta jätin otsikon ennalleen.]

Published 14.12.2009