2. huhtikuu 2010, 19:16

Python ja pikkuohjelmat

Sain tässä jonkin aikaa sitten pienen kipinän kirjoitella eräänlainen medianhallintaohjelma. Hyvin pieni sellainen, joka ei käyttäisi paljoa hienoja ominaisuuksia, mutta joitain pieniä yksityiskohtia olisi oltava:

  • Pääprioriteetti olisi hallita yhtä yksittäistä hakemistoa alihakemistoineen
  • Tiedostoja olisi kuitenkin paljon, siinä määrin, ettei pysy täysin hallinnassa ilman
  • Leikkeiden sisällöt ja pituudet vaihtelevat paljon, lisäksi pelkillä tarinoiden nimillä ei saa riittävää yksikäsitteisyyttä aikaan
  • Ohjelman kautta katsottujen tiedostojen katsomisajoista ja -määristä pidettäisiin kirjaa, jotta käyttäjä voi halutessaan tutkia, onko johonkin arkistojen kätköihin jäänyt unohdettuja helmiä
  • Mikäli jaksaa/viitsii, viritellään mukaan myös tiedostojen metatagailu

Näillä eväillä mennään. No, graafiseksi tämän kai kuvittelisi, joten astutaan välittömästi sille ohjelmistosuunnittelun osa-alueelle, jossa ohjelmain teko ei enää olekaan niin triviaalia kuin esimerkiksi pienen konsolisoftan tekeminen omaksi ratokseen.

Ei enää niin vaikeata

Mutta onko totuus koskaan ollut noin karvas? *Microsoft*in Visual Basic nimittäin kyllä aikoinaan muodosti pienien ohjelmien kirjoittelusta varsin lastenleikkiä, jopa siihen pisteeseen saakka, että ohjelman helppokäyttöisyydestä seuraa kaikkien vihanpito. Jopa VB-koodarien itsensäkin. 90-luvun lopuilta jo alkanut testaamattoman, itseoppineen VB-hutun kirjo on ehkä hellittämässä, kun nykynuoriso opiskelee mieluummin PHP:tä. Ja PHP… VB taitaa olla sivistynyt kuningaskieli PHP:en nähden. Joka tapauksessa piti sanomani, että VB:llä kuvatunlaiset pikkuohjelmat ovat varsin miellyttäviä koodailla, vaikka menetelmän taustaidea toimiikin menetelmän huonouden voimin. Eihän nimittäin kukaan itseään kunnioittava koodaaja tee ikkunasovelluksia, joiden komponentit ovat staattisesti liimautuneita kiinteästi määrättyihin koordinaatteihin lomakkeella… tai, no.

Ja mitä sitten, vaikka Visual Basic aikoinaan ja .NET -sovellukset nykyisin tukevat tätä kivaa ja intuitiivista komponenttien lätkimistä formeille? Linuxille en keksi ainuttakaan tämänlaista RAD-työkalua. On vain näitä suhteellisiin lohkoihin perustuvia menetelmiä.

Suhteelliset lohkot vaikeitako?

En aivan keksi taikka jaksa lähteä googlailemaan termin oikeata nimitystä, mutta tämä suhteellinen ja lohkoihin perustuva sijoittelumenetelmä takaa joustavat lopputulemat. Javalla on Swing, ja sitten on oikein kiva WxWidgets.

Homma ei toimi niin kivasti kuin suora, staattinen lätkiminen, mutta itse asiassa ollaan melko lähellä. Monesti vain jätetään kouluissa mainitsematta graafiset suunnittelutyökalut tähän avuksi. WxWidgetsille on olemassa monia “piirtelyohjelmia”, joista ainakin WxGlade on toiminut oikein moitteetta!

Ohjelma tarjoaa wysiwyg-frontendin koodinmuodostamiseen. Paletissa on kaikki tarpeelliset peruskomponentit kattavien ikkunoiden luomiseen, ja kokonaisuus on toimiva. Lopulta valmiin ikkunan aikaansaavat koodit ja luokat saa generoitua C++:ksi, Pythoniksi tai vaikkapa Lispiksi. Oikein mojovaa, vaikka en monesti kyllä pidäkään tuloksista, etenkin jos (ja kun) framework on itselleni vähemmän tuttu. Javax:n Swing olisi ollut kova vaihtoehto, mutta ei tuo Java niin innosta itseäni…

Mihinkä päädyin? Tiedän kokemuksesta, että C++-projektit kaatuvat yksinkertaisesti detaljien alle. Vaikka koodia voisikin ehkä tehdä melko virheettä, ja syntaksi olisi hanskassa, niin kaikki pikkuviritelmät ja luokkien vetely tuottaa työtä.

Hyvin yllätyksenä itsellenikin, selaillessani Mureakuhaa tiedostojen selailuun liittyvien vinkkien toivossa havaitsin Pythonin hyvähköksi vaihtoehdoksi —- vaikka kokemusta Python-koodaamisesta on alle 30 koodiriviä. Alkuun päästiin kuitenkin nopeasti, koska Pythonin toimintaperiaate on tuttu, ja sisennyskin sujuu.

Pythonilla sujuu

Pythonin hypen takaa epäilevästi tutkien koodia ja esimerkkejä olen tullut siihen tulokseen, että vaikka kieli ei esteettisesti paras mahdollinen ole, niin se on ainakin todella helpposyntaksinen. Käytännön esimerkistä käyköön aina self-liitteiden käyttö, kun halutaan luoda tai viitata luokan sisällä globaaliin muuttujaan. Ei jää ainakaan epäselväksi, onko tämä muuttuja käytettävissä muualta! C++:ssa tietysti tuntuu hyvältä, että holhoaminen on vähäisempää, mutta sielläpä onkin sitten välillä sormi suussa, onko tämä muuttuja playcount nyt luokan oma memberi, vaiko pelkästään metodin sisäinen temppimuuttuja. Mitä ei edellytetä, sitä ei osata.

Pythonille tehty Wx-sovitus WxPython toimii enemmän kuin mainiosti. Oman ikkunan saa ruudulle suoraan WxGladesta käsin, ja tapahtumien sitominen funktioihin on yhtä helppoa kuin Visual Basicissa konsanaan. Yhtä intuitiivistakin. C++:n WxWidgets-mallissa joudutaan käyttämään hankalia makrolaajentuvia taulukoita ja kaikki tämmöinen on omiaan murentamaan itse kielen omia vahvuuksia.

Ja kuinka helppoa se koodin työstäminen onkaan, kun boilerplatea on kamalan vähän! Meininkinä komponenttien alustelu olioina, niiden sijoittaminen paneeleihin tai sizereihin ja sitten pitkälti “unohtaminen” on hyvinkin tuttua Java-töistä, joita TKT:n perusopintoihin saa tehdä. Ja Python hallitsee sen puolen hyvin oivasti. En muista Javan tavasta bindata eventtejä, mutta tässä se on oikein retrosti tehty. WxWidgets on kunnon kirjasto.

Pythonia on muutenkin helppo työstää, kun turhia, lähes tyhjiä rivejä ei pääse tapahtumaan yhtä tiheään kuin vaikkapa Javassa. Ohjelmassani on jo kaikenlaista toiminnallisuutta, ja koodirivejä on reilusti alle 100.

Onko Python se minun suosikkikieleni tästä eteenpäin? En usko. Ainakin tämä on hidasta, jos ei muuta. Eipä se sinänsä haittaakaan, mutta kestävä ratkaisuhan se ei ole. Puhutaan sitten vaikka siitä seikasta, että WxWidgetsit saa myös Haskellille, ja se onkin aivan toinen ääni kellossa. Ajattelin peräti kokeilla portata ohjelmani Haskellille testimielessä, jahka Python-versio valmistuu. WxWidgetsin ansiosta yhteistä toiminnallisuutta on todella paljon, ja kielispesifistä kikkailua todella vähän. Ehkä tiedostojen lukeminen ja sen sellainen tulee olemaan hankala siirtää.

Btw, heitän soppaan sekaan SQlite-pohjaisen metatagitallennuksen. Sekin on tutoriaalin nojalla ääliömäisen helppoa tehdä. Pythonista sopii leipoa tulevaisuuden PHP. Oh yeah, indeed.

Tageja: , ,

---
---

---

Aiheen vierestä