Skip to main content

Second try with Scala and REST

As I mentioned in my previous post I tried to create a simple REST service with Scala and spray.io, but that turned out to be unbelievably difficult. A second try with Scala and REST turned out to be successful.

Play to the rescue


When my experiment with spray.io didn't work out I had an idea to try out Play 2 as a base to my REST service. Working with Play 2 was a walk in the park compared to spray.io even though not entirely painless but much easier and less frustrating.

Starting out with Play 2 was really quick thanks to a good documentation and examples that are up to date. Basically I just ran the command play new appName and started coding.

So far I have REST service and a in-memory implementation of todo tasks with some unit tests. REST service is all Play 2 with routes and a single application class. The current service layer implementation is a single class with tasks in a mutable Map where a individual task is a case class, so just some basic Scala code.

I really like Play 2 so far but I'm a bit concerned of how much dependencies Play 2 brings with it as default. Currently I have 92 jars in referenced libraries of my project, all from default initialization of play application. Sure some of these are test library dependencies but still that's a lot of libraries.

Unit testing Scala code


Play 2 automatically includes as a dependency the specs2 library that's a unit and acceptance testing library for Scala. I had never used specs2 and the bdd style definition of tests was a bit odd to me but I decided to give it a try.

After a few initial wtf's I got the hang of it pretty quickly and was able create some basic unit tests for my service implementation. I've only scratched the surface with specs2 but it seems to do the job and has quick learning curve and so far the provided documentation has been enough to get me going.

What's next


Next step in my adventures in the world of Scala will be to try use some real data storage to persist the todo applications data. I think I'll try out with MongoDB and after that some other very different alternatives like Redis and MariaDB. 


Code shared publicly


As I use code and examples provided by others I too am sharing my code and putting it publicly reviewed by others. It's all shared through my github account at https://github.com/jorilytter/simple-todo, feel free take a look.

Comments

Popular posts from this blog

Simple code: Immutability

Immutability is a special thing that in my mind deserves a short explanation and praise. If you're familiar with functional programming you surely recognice the concept of immutability because it's a key ingredient of the paradigm. In the world of object oriented programming it's not as used and as easy to use approach but there are ways to incorporate immutability to parts of the code and I strongly suggest you to do so. Quick intro to immutablity The basic idea of immutability is unchangeable data.  Lets take a example. We have a need to modify a object's property but because the object is immutable we can't just change value but instead we make a copy of the object and while making the copy we provide the new value for the copy. In code it looks something like this. val pencil = Product(name = "Pencil", category = "Office supply") val blackMarker = pencil.copy(name = "Black marker") The same idea can be applied in functions and metho

Simple code: Readability

Readability, understandability, two key incredients of great code. Easier said than done, right? What one person finds easy to read and understand another one finds incomprehensible. This is especially true when programmers have different levels of understanding on various subjects e.g. object oriented vs. functional or Node.js vs. Java. Even though there are obvious differences between paradigms and programming ecosystems there are some common conventions and ways to lower the barrier. Different approaches It's natural that in programming things happen sequentally e.g. you can have a list of objects and you need to do various things to the list like filter some values out and count a sum of the remaining objects based on some property. With the given list const stories = [   {name: "authentication", points: 43},   {name: "profile page", points: 11},   {name: "shopping cart", points: 24},   {name: "shopping history", points: 15},   {name: &qu

Simple code: Unit tests

Unit tests are the developers number one safety net. Let that sink in. This is the number one reason for writing unit tests. Unit tests are written by developers for developers to ensure that the code works as expected and handles happy and sad paths correctly. With enough unit test coverage the tests enable a safe environment for refactoring and rewriting code. Unit test scope Unit test should test a single thing, a method or function call and it should test only one use case within. In other words a unit test should test a function with a single input. This is a important guideline to understand. When a unit test tests a function with single input it makes the test isolated, repeatable and predictable. Example of good tests: @Test fun findsAddress() {   val address = findAddress("Stevens street 35", "Southport", "Australia")   assertThat(address).isNotNull() } @Test fun doesNotFindAddress() {   val address = findAddress("Stevens street 697", &q