Skip to main content

OOP vs. FP. The pursuit of extensibility part #1

Picture of Adam Gajek, null

Adam Gajek

Nov 21, 2018|8 min read
Image Alt

Software entities ( classes, modules, functions, etc.) should be open for extension, but closed for modification.

1val expression = Add(Add(Number(2), Number(3)), Number(4))
1(2 + 3) + 4
1trait Expr {
2 def eval: Double
3}
1case class Number(value: Double) extends Expr {
2 override def eval = value
3}
1case class Add(a: Expr, b: Expr) extends Expr {
2 override def eval = a.eval + b.eval
3}
1val expression = Add(Add(Number(2), Number(3)), Number(4))
2expression.eval
3//res0: Double = 9.0
1trait Expr
2case class Number(value: Double) extends Expr
3case class Add(a: Expr, b: Expr) extends Expr
1def evaluate(expression: Expr): Double = expression match {
2
3 case Number(a) => a
4 case Add(a, b) => evaluate(a) + evaluate(b)
5}
1val expression = Add(Add(Number(2), Number(3)), Number(4))
2val printed = print(expression)
3//res1: String = ((2.0 + 3.0) + 4.0)
1def print(expression: Expr): String = expression match {
2 case Number(a) => a.toString
3 case Add(a, b) => s”(${print(a)} + ${print(b)})”
4}
1trait Expr {
2 def eval: Double
3 def print: String
4}
1case class Number(value: Double) extends Expr {
2 override def eval = value
3 override def print = value.toString
4}
1case class Add(a: Expr, b: Expr) extends Expr {
2 override def eval = a.eval + b.eval
3 override def print = s”(${a.print} + ${b.print})”
4}
1val expression = Add(Add(Number(2), Neg(Number(3))), Number(4))
1(2 + (-3)) + 4
1case class Neg(a: Expr) extends Expr
2def evaluate(expression: Expr): Double = expression match {
3 case Number(a) => a
4 case Add(a, b) => evaluate(a) + evaluate(b)
5 case Neg(a) => — evaluate(a)
6}
1def print(expression: Expr): String = expression match {
2 case Number(a) => a.toString
3 case Add(a, b) => s”(${print(a)} + ${print(b)})”
4 case Neg(a) => s”-${print(a)}”
5}
1case class Neg(a: Expr) extends Expr {
2 override def eval = — a.eval
3 override def print = s”-${a.print}”
4}

Subscribe to our newsletter and never miss an article