Yan Cui
I help clients go faster for less using serverless technologies.
This article is brought to you by
Don’t reinvent the patterns. Catalyst gives you consistent APIs for messaging, data, and workflow with key microservice patterns like circuit-breakers and retries for free.
NOTE : read the rest of the series, or check out the source code.
If you enjoy reading these exercises then please buy Crista’s book to support her work.
Following on from the last post, we will look at the Monolith style today.
Style 3 – Monolith
As the name suggests, this style is typified by the use of one big blob of code that contains all our application logic!
Constraints
- No named abstractions (i.e. no methods/functions)
- No, or little, use of libraries
The first constraint meant that we can’t break up the logic into smaller functions, hence why everything is inside one big for loop.
I took the second constraint to mean that we should limit the number of namespaces we open (as is the case in Crista’s version). Which means a Dictionary is out of the question. I could still use a Map but that feels too much of a cheat so I decided to stick with an array of string * int tuple to keep track of the word frequencies.
First we need to load the list of stop words:
Then we read the text line by line and process it in one giant for loop…
One caveat I ran into whilst working on this, is with the behaviour of File.ReadAllLines. It removes the line ending character for each line, which means whilst looking for words in a line we have two cases:
- words in the middle of a line, e.g. “I spoke to Elizabeth today…”
- words at the end of a line, e.g. “…turned around to Elizabeth”
so to make the logic consistent, and remove the special case (case 2) I decide to just add the newline character at the end of the string we need to process.
Other than the above caveat, this code is pretty simple. I decided to deviate from Crista’s implementation in another place – her solution reorders the word_freqs array whenever an existing word count is updated. But I figure it’s likely more efficient to just do it once after the main loop.
sidebar: I have used higher-order functions in a few places, which I’m not sure if they constitute as cheating. However, I don’t consider them violations to the constraints we have set ourselves for this particular exercise.
Conclusions
Code written in this style is generally hard to follow as you need to keep the entire application logic (i.e. the big for loop) in your head whilst trying to understand its behaviour, and we know our brains are not great at holding many items in the active memory (the famous 7 +/- 2 rule).
One thing to note is that, whilst this style was commonplace with low-level languages (and goto was popular back then too), it’s possible to program in this style with high-level languages too (as we’ve done with F# here).
I also find Node.js style callbacks tend to lend themselves to this style of coding too.
You can find all the source code for this exercise here.
Whenever you’re ready, here are 3 ways I can help you:
- Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game. This is your one-stop shop for quickly levelling up your serverless skills.
- I help clients launch product ideas, improve their development processes and upskill their teams. If you’d like to work together, then let’s get in touch.
- Join my community on Discord, ask questions, and join the discussion on all things AWS and Serverless.
Pingback: Exercises in Programming Style–Cookbook | theburningmonk.com