amacgregor

amacgregor

Exploring design patterns in Elixir

I wanted to reach out to the community and see who is using design patterns and what are the ones that are relevant to FP and Elixir, as well as an overall discussion on the validity and applicability of patterns.

Now, let me start with a couple of statements that might be valuable (I might be wrong; feel free to comment):

  • Design patterns are not recipes, meaning their value is not to be implemented to the letter
  • Most Creational and Structural patterns have little to no use in the functional programming world.
  • For FP and Elixir, the most valuable and applicable patterns are going to be architectural and behavioral

Within that realm, there are a few patterns that I have identified that seem useful:

  • Circuit Breaker for managing calls to external services
  • Event Sourcing for situations that require a highly reliable audit log; CQRS is also relevant

Curious what else is being used and tried for example Sagas? Proxy? Strategy? Maybe some unique to Functional languages?

Most Liked

tomekowal

tomekowal

There is the Token pattern that is very common in many Elixir libraries. https://rrrene.org/2018/05/14/flow-elixir-designing-apis/
I had a talk on it https://www.youtube.com/watch?v=arYOSYrjC8s but I didn’t know the name yet :smiley:

kokolegorille

kokolegorille

I have been translating this book…

…from Node to Elixir

I really like DDD and Event sourcing, I feel Elixir is a good fit for this kind of reactive programming.

It’s not a pattern, but I like to define domain events first.

al2o3cr

al2o3cr

A good place to start is the OTP Design Principles User’s Guide which describes the supervision and communication patterns used by the OTP + BEAM infrastructure.

One technique that’s seems a lot more common in languages with pattern matching is defunctionalization (and another presentation) - note that both of these require a little Haskell to fully understand the examples, but it looks kinda like Erlang.

al2o3cr

al2o3cr

There’s a lot of patterns described in the OTP design principles doc, but they aren’t as obvious as in OOP:

  • the OTP model is an implementation of the Actor pattern, using message-passing processes to emulate mutable state

  • I don’t know of a name for it, but the “tree of supervisors that restart children” patten is really important for producing a reliable system

  • the minimum-weight implementation of the Strategy pattern in BEAM languages is the module / function / args tuple (MFA tuple) that’s used in lots of places

  • gen_statem does implement a version of the State pattern, but the quantum of change is the function (changing the machine’s state changes which handlers are called) and not the module

Also take a look at things in Elixir like DynamicSupervisor and Registry used together.

Where Next?

Popular in Questions Top

stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
makeitrein
Hey all, just started picking up Elixir last week and am writing a scraper as a learning project. Baby step #1 is extracting the number ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

Other popular topics Top

stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
johnnyicon
Hi all, I've just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I'm trying to use Postg...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New

We're in Beta

About us Mission Statement