На днях решил побаловаться чем-нибудь интересным, так сказать, расширить свой кругозор в мире программирования. Под руку попался Erlang. Википедия про него говорит следующее:
Erlang [ˈɜːlæŋ] — функциональный язык программирования со строгой динамической типизацией, предназначенный для создания распределённых вычислительных систем. Разработан и поддерживается компанией Ericsson. Язык включает в себя средства порождения параллельных облегчённых процессов и их взаимодействия через обмен асинхронными сообщениями в соответствии с моделью акторов.
Поиск хорошей литературы указывал всегда в книгу Джо Армстронга «Programming Erlang»
С первых страниц книга располагает к себе, а вот язык не совсем, но это только на первый взгляд.
Когда дело дошло до кода чуть сложнее Hello World, сразу в глаза бросились преимущества этого языка. Одну из фишек я и хочу показать.
Возьмем пример вычислений площади геометрической фигуры
На PHP с ООП это выглядело бы вот так:
interface FigureArea { public function area(); } class Circle implements FigureArea { protected $r; public function __construct($r) { $this->r = $r; } public function area() { return M_PI*($this->r*$this->r); } } class Rictangle implements FigureArea { protected $a; protected $b; public function __construct($a, $b) { $this->a = $a; $this->b = $b; } public function area() { return $this->a*$this->b; } } $rectangle = new Rectangle(5,7); $circle = new Circle(5); $rectangle->area(); $circle->area();
Громоздко выглядит. Конечно в процедурном стиле будет немного короче, но тут нужно создать сначала необходимый объект, причем заведомо нужно знать что это за фигура и знать есть ли класс описывающий поведение для такой фигуры, а потом только посчитаешь площадь фигуры. Конечно можно воспользоваться каким нибудь паттерном, например Фабрикой, для упрощения этого действия, но тут снова возникают проблемы с тем что нужно городить огород.
Ещё один минус данного подхода это то что нам необходимо создавать еще один класс для высчитывания площади, например, эллипса.
Взглянем же на подход к подобной задаче в эрланге.
Здесь я не буду пояснять языковых структур, потому что к этому языку надо подходить спереди, а не заскакивать наскоком. Просто сравните код, который делает одно и тоже.
-module(geometry). -export([area/1]). area({rectangle, Width, Height}) -> Width * Height; area({circle, R}) -> 3.14159 * R * R.
Здесь создали модуль geometry и определили метод для расчета площади. Идем дальше:
Rectangle = {rectangle, 10, 5}. Circle = {circle, 2.4}.
Здесь мы создали переменные. А теперь посчитаем площадь каждой из фигур.
geometry:area(Rectangle). geometry:area(Circle).
Вот и все, мы используем метод с одним именем для разных типов фигур и не заботимся больше ни о чем.
В этот модуль легко добавить еще один способ расчета, например для квадрата, а вызов метода не изменится.
Конечно и здесь не без недостатков, здесь так же необходимо создать переменную с определенной структурой, но это меньшая проблема, чем в случае с PHP.
Подводя итоги, всем рекомендую посмотреть на этот язык, я не говорю о том что все должны на нем начинать писать, а всего лишь хочу сказать то что, лишним не будет посмотреть на программирование с нового ракурса.