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.]