FP in scala 1 장

Jin·2020년 12월 25일
0

학습 포인트

  • 함수형 프로그래밍의 유용성
  • 참조 투명성, 순수함수

함수형 프로그래밍의 유용성

커피 주문 예제를 통해 함수형 프로그래밍의 좋은점을 알아보자!

1. 부수효과가 있는 함수

class Cafe {
  def buyCoffee(cc: creditCard): Coffee = {
    val cup = new Coffee()
    
    cc.charge(cup.price) // 부수효과 발생

    cup
  }
}

buyCoffee 를 테스트 할때 마다, 실제 charge (결제)가 발생한다.
테스트하기 어렵다.

2. 인수로 전달

class Cafe {
  def buyCoffee(cc: creditCard, p: Payments): Coffee = {
    val cup = new Coffee()
    
    p.charge(cc, cup.price) // 부수효과 발생

    cup
  }
}

결제 모듈을 의존성으로 받으면 모킹을 이용해서 실제 결제가 일어나지 않아도 테스트가 가능해진다. 하지만, 만약 10잔의 커피를 주문한다면, 10번의 독립적인 결제가 일어나게 된다. 커피를 10잔 샀는데 4000원씩 10장의 영수증을 받게 되는 셈이다.

3. Batch

커피 한잔

class Cafe {
  def buyCoffee(cc: creditCard): Coffee = {
    val cup = new Coffee()
	(cup, Charge(cc, cup.price))  // 결제 정보를 함께 반환
  }
}

결제, 합치기

class Charge {
  def combine(other: Charge): Charge =
    if (cc == other.cc)
      Charge(cc, amount + other.amount)
    else
      throw new Exception("Cannot combine different cards")
}

한꺼번에 결제

class Cafe {
  def buyCoffees(cc: creditCard, n: Int): (List[Coffee], Charge) = {
	val purchases: List[(Coffee, Charge)] = List.fill(n)(buyCoffee(cc))
	val (coffees, charges) = purchases.unzip
	(coffees, charges.reduce((c1, c2) => c1.combine(c2))
  }
}

이처럼 부수효과를 제거하면, 여러잔의 커피를 사는 경우에도 금액을 합쳐서 계산할 수 있고, 외부와 독립적으로 테스트도 가능한 모듈을 얻을 수 있다.

참조 투명성

See

Functional Programming in Scala https://www.manning.com/books/functional-programming-in-scala

0개의 댓글