So last night we had our first Detroit Erlang/Elixir meetup and as part of it I wanted to do a little coding exercise to help people to get their feet wet with Erlang and/or Elixir, as they chose. We simply worked through FizzBuzz and we came up with two different Elixir solutions and two different Erlang solutions. I never stop being surprised by developer creativity.
That said, I keep striving to improve the code I write and striving to use the tools that the language provides me. Elixir has module attributes and it’s also got module documentation as a first class citizen in the language. So I thought to myself why not extend my simple fizzbuzz code a bit to use these two features–to better learn how to use them. Here’s the code such as it is:
defmodule FizzBuzz do @fizz 3 @fizzmsg "Fizz" @buzz 5 @buzzmsg "Buzz" @moduledoc " Ye olde FizzBuzz test in all of its glory. If the number is a multiple of #{@fizz} then print #{@fizzmsg}. If the number is a multiple of #{@buzz} then print #{@buzzmsg}. If it's a multiple of both then print #{@fizzmsg<>@buzzmsg}. Else print the number itself. Example usage: iex> for i <- 1..100, do: FizzBuzz.getFB(i) 1 2 #{@fizzmsg} 4 #{@buzzmsg} " def getFB(n) do cond do rem(n,@fizz) == 0 and rem(n,@buzz) == 0 -> IO.puts @fizzmsg <> @buzzmsg rem(n,@fizz) == 0 -> IO.puts @fizzmsg rem(n,@buzz) == 0 -> IO.puts @buzzmsg true -> IO.puts "#{n}" end end end
Now the code itself isn’t anything very special. But the module attributes and the fact that I can avoid specifying magic numbers is just awesome. What if I wanted to change the code to print “Argh!” on 3 instead of “Fizz”? Of course were I to change the number for “Fizz” then I would need to make more extensive changes but this does cover one common type of change. With the code set up in this way, I only need to change things in one place and my docs will be updated as well as my code.
I know this is sort of a “Stupid Doc Trick” but it still seemed worth sharing with others. The idea of only needing to change a constant in one place and having everything else update is a very appealing one.