Простая разработка с Erlang

На днях решил побаловаться чем-нибудь интересным, так сказать, расширить свой кругозор в мире программирования. Под руку попался 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.

Подводя итоги, всем рекомендую посмотреть на этот язык, я не говорю о том что все должны на нем начинать писать, а всего лишь хочу сказать то что, лишним не будет посмотреть на программирование с нового ракурса.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *