Introduction
There is a popular statement, that principles from object oriented programming (OOP) are not be applicable in functional languages and particularly in Erlang. Let's try to analyse it.The main concepts of object oriented design (OOD) are
- Encapsulation.
- Polymorphism.
- Inheritance
Encapsulation
Encapsulation concept in Erlang could be found at least in process model.
Processes
One of Erlang's "design pattern" is process per message, which encourages to spawn a process for each concurrent instance in a system. In case of HTTP service requests' handling is concurrent, but having encapsulation only on that level is not enough for a good Web framework. Also good people never force client to call gen_server:call/2 for a gen_server they've implemented, they wrap such calls with functions in client API modules.
Modules
Erlang module has export attribute, which allows to call some functions implemented in it from outside. What else is it, if not splitting to public and private functions in OOP language?Modules can represent objects even in easier way than processes. For example, queue and proplists. One can say that there is no protection from module's function being called with wrong argument, but the same situation is in Python, where private functions are distinguished from public only by naming conventions.
Conclusion
Erlang has two levels on encapsulation, which could be combined in order to create a good design for system.To be continued.