Tämän blogini kommenteissa Symbiatch nosti esiin kiintoisan kysymyksen siitä, miten vahva tyypittäminen vaikutttaa web-ohjelmoinnin tehokkuuteen.

Olen käynyt aikoinaan läpi webbipuolella ASP/VBScript-aikakauden, jolloin saatiin aikaan paljon tuhoa kielen tyypittömyydellä ja unohtamalla Option Explicit -määre skriptien alusta. Siksi on ihan ymmärrettävää, että Microsoft-ihmiset uskovat vahvaan tyypittämiseen ja kannattavat C#:aa. Itsekin kannattaisin, jos olisin rajoittunut siihen teknologiakenttään.

Tuon jälkeen olen kuitenkin tutustunut kypsempiin vapaasti tyypitettyihin kieliin, kuten PHP:hen ja Pythoniin. Ne ovat opettaneet, että sovelluksista voi tehdä luotettavia myös ilman vahvaa tyypitystä. Samalla ne (varsinkin Python) ovat osoittaneet, miten paljon joustavampaa ja tehokkaampaa löyhästi tyypitetty kehitys on web-maailmassa.

Pythonin perustavaa laatua oleva ero C#:aan ja Javaan on se, että parametreinä välitettävien objektien ei koskaan tarvitse olla jotain tiettyä luokkaa (tai kantaluokkaa). Python-ohjelmat koodataan niin, että ne eivät tarkista onko objekti tietyn tyyppinen, vaan ne tarkistavat onko siinä kaikki tarvittavat attribuutit mukana.

Esimerkiksi Djangossa on oma django.contrib.auth.models.User -luokka. Django käyttää sitä sisäisesti käyttäjien tunnistamiseen ja monet Djangon toiminnot olettavat, että käyttäjätiedot kuvataan tällä luokalla.

Ohjelmoija voi kuitenkin vapaasti toteuttaa oman User-luokkansa, jonka ei tarvitse millään lailla periytyä Djangon User-luokasta. Toiminnallisuutta ei siis ole millään lailla sidottu alkuperäiseen luokkaan. Ainoa vaatimus on, että luokasta löytyvät tarvittavat attribuutit.

Tämän merkitys on valtava, vaikka se voi olla aluksi vaikea hahmottaa. Alkuperäinen User-luokka voi olla esimerkiksi perimältään sidottu SQL-tietokantoihin tai johonkin muuhun teknologiaan, jota omassa sovelluksessaan ei halua käyttää. Jos kyseessä olisi C# tai Java, koko framework olisi tällöin käyttökelvoton. Mutta Pythonissa alkuperäisen User-luokan voi heittää kokonaan romukoppaan ja käyttää sen tilalla omia ihan erilaisia objekteja. Django ei huomaa mitään, kunhan tarvittavat attribuutit ovat paikoillaan.

Oman koodin uudelleenkäytettävyydessä tämän merkitys on vielä suurempi. Omassa koodissa tehdään usein paljon rankempia oletuksia tietynlaisesta teknologiaympäristöstä. Kun käytetään vahvasti tyypitettyjä kieliä, uudelleenkäyttöaste jää väistämättä pieneksi, ellei käytetä paljon aikaa ja vaivaa luokkahierarkioiden ja interfacejen pohtimiseen. Silloinkin yksi "väärä ratkaisu" yhdessä luokassa voi estää koko kirjaston hyödyntämisen toisessa projektissa.

Tiedän kokemuksesta, että Pythonin löyhä tyypitys on aluksi vaikea hahmottaa. Dokumentaatiotakin on ensin vaikea lukea, kun ei saa aina selkeää vastausta siihen, mitä tyyppiä jokin järjestelmäkirjastojen palauttama arvo on.

Hiljalleen oppii kuitenkin hyväksymään sen, että ohjelmoinnin ei tarvitse aina olla täsmälleen sen perinteisen C++/Java/C# -OO-paradigman mukaista. Itse asiassa on sangen valaisevaa päästä eroon tähän yhteen ajatusmalliin fakkiutumisesta.