Functioneel programmeren in Scala
Afgelopen weekend weer even in Scala gedoken. Ik liep namelijk wat tegen beperkingen van het OO paradigma aan. Of eigenlijk tegen het imperatief programmeren.
In een project ging het om berekenen van het rendement van een portefeuille. Mijn code vond ik uiteindeljk complex, met name als ik formules moest aanpassen. In een spreadsheet gaat het proces honderd maal sneller en is het ook begrijpelijker.
Het spreadsheet model heeft functies als input voor andere functies en dit zit duidelijker tegen het functionele programmeer model aan.
In het ander project ging het om manipuleren van grote xml structuren. Het werken met de DOM api gaf geheugen en performance problemen, terwijl Sax en Stax weer moeilijker te programmeren zijn. Xml is echter ook maar een lijst van lijsten en dit is weer makkelijker in een functionele taal te doen.
Voldoende redenen dus om functioneel programmeren ook een beetje te beheersen. Scala lijkt een lage instap omdat je gebruik kunt maken van het Java platform en je niet meteen volledig functioneel hoeft te programmeren. In C# zou je weer LINQ kunnen gebruiken.
He duurde wel even voordat het functioneel denken weer aansloeg. Ik was ook heel veel tijd kwijt aan de details van de taal. Was een beetje verwend door het leren van Smalltalk dat maar zes keywords kent en waar je de taal in een half uur hebt geleerd. Wat het niet meteen makkelijker maakt, maar je zit niet zo met het niet goed kennen van de syntax als bij Scala.
Een Scala script heb ik nu wel af en het resultaat ervan is naar de klant toe. Het was geen petproject, er moest echt iets af. Dat werkt toch het beste merk ik. Je moet dan wel door bijten als het even lastig wordt.
Ik ben redelijk tevreden over de code. Het algoritme is simpeler geworden dan als ik het in Java met Dom of Stax zou hebben opgelost. Ik weet nu ook wat tail-recursion in houdt. De code is goed aan te passen en te hergebruiken, omdat het niet erg gebonden is aan een specifieke xml structuur. Je bent alleen bezig met het deel dat je wil aanpassen en de rest van boom interessert je niet.
Ben wel niet zo tevreden over de leesbaarheid van de code, maar dat is misschien een kwestie van wennen. Het is leesbaarder dan Java, maar dat is de lat erg laag leggen.
Ik zal nog wat schrijven over het opzetten van het project, het gebruik van de IDE, maven, specs, e.d. Daarna kijken of de rendement rekenmodule ook beter te implementeren is in Scala of misschien wel in C# en LINQ.
