SOLID reasons to take a look at functional programming
Functional programming is fashion
There is a freight train barreling down the tracks towards us, with multi-core emblazoned on it; and you’d better be ready by the time it gets here.
-- Uncle Bob
SOLID
Single Responsability Principle
S
SRP in Functional Programming
- Functions return ALWAYS the same output for the same input (Referential Trasparency)
- In functional programming you should avoid side-effects
Then can we consider the single responsibility principle inherent in the functional paradigm?
It violates the Single Responsibility Principle because there is more than one reason for it to change.
-- Robert C. Martin
public Money calculatePay(Employee e)
throws InvalidEmployeeType {
switch (e.type) {
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlyPay(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}
Open Close Principle
O
OOP
FP
defmodule Car do
def slow_down brake_system do
brake_system
end
end
defmodule Brake do
def simple do
IO.puts "Hope you're not on ice!"
end
def abs do
IO.puts "Press as you want..."
end
end
Car.slow_down Brake.simple
# or
Car.slow_down Brake.abs
Liskov Substitution Principle
L
LSP in OOP
class Rectangle
{
private $topLeft;
private $width;
private $height;
public function setHeight($height)
{
$this->height = $height;
}
public function setWidth($width)
{
$this->width = $width;
}
public function getArea()
{
return $this->width
* $this->height;
}
}
class Square extends Rectangle
{
public function setHeight($value)
{
$this->width = $value;
$this->height = $value;
}
public function setWidth($value)
{
$this->width = $value;
$this->height = $value;
}
}
class RectangleTest
{
public function testArea(Rectangle $r)
{
$r->setWidth(5);
$r->setHeight(4);
if($r->getArea() != 20) {
throw new \Exception("Ms. Liskov crying!");
}
return true;
}
}
LSP in FP
Functional languages emphasize substitutability and deemphasize implementation reuse since reuse is better achieved through composition
Most ambitions of the Liskov substitution principle are effectively trivial in a functional language.
Interface Segregation Principle
I
ISP in FP
list = [key: "value"]
map = %{key: "value"}
Dict.get(:key, map) # "value"
Dict.get(:key, list) # "value"
There is no augmented concept of role-based interfaces because function roles are explicit at the onset. Functions are segregated by default.
Dependency Inversion Principle
D
DIP in OOP
- Inversion of control
- Dependency Injection Container
DIP in FP
In object-oriented programming, high-level modules depend on infrastructure modules primarily to invoke side-effects. In functional programming, side-effects are more naturally triggered in response to domain behavior as opposed to being directly invoked by domain behavior. Thus dependencies become not merely inverted, but pushed to outer layers all together.
Claudio D'Alicandro
@_cdali on twitter
Developer @chupamobile
Developer @AdEspresso
tomorrow
today
Questions?
Thanks!
SOLID reasons to take a look at functional programming
By Claudio D'Alicandro
SOLID reasons to take a look at functional programming
PUG Roma Lighting talk
- 1,875