전통적인 consumer/supplier 예제를 간단히 변형해서
2개의 은행에서 각자 고객 수자를 관리하다가
전체 고객의 합을 구하는 형태를 문제가 있게 OLD한 방법으로 일부러 작성해보면 다음과 같다.
///////////////////////////////////////////////////////////////
class Bank {
var numKid:Int = 0
var numAdult:Int = 0
var numAged:Int = 0
def addNum (k:Int,a:Int,g:Int) = {
numKid += k
numAdult += a
numAged += g
Main.totalKid += numKid //no need on FP
Main.totalAdult += numAdult
Main.totalAged += numAged
}
}
////global FOR: Bank Sum total : OLD ///////////////
var totalAll:Int = 0 //NO NEED on FP
var totalKid:Int = 0
var totalAdult:Int = 0
var totalAged:Int = 0
// main
def main(args:Array[String]) = {
//// Bank Sum total :OLD ///////////////
val actorBank1 = actor {
val bank1 = new Bank
while (true) {
bank1.addNum(0, 1, 0)
Thread.sleep(10)
}
}
val actorBank2 = actor {
val bank2 = new Bank
while (true) {
bank2.addNum(2, 2, 1)
Thread.sleep(10)
}
}
//WHEN WANT TO PRINT
while (true) {
//SUM
Main.totalAll = Main.totalKid + Main.totalAdult + Main.totalAged //SUM
//NO MATCH?
if( totalAll != (totalKid+totalAdult+totalAged))
println("total:" + totalAll + ", Kid:" + totalKid + ", Adult:" + totalAdult + ", Aged:" + totalAged)
Thread.sleep(20)
}
이게 돌다보면 totalALL합이 맞지 않는 경우가 자주발생하도록 한 코드인데..
FP 스타일로 바꿔보면 다음과 같다.
================================> FP Style 로 전환
1. 가능하면 tuple을 이용
2. 전체적인 합 같은 totalAll 같은 변수를 아예 없앤다.
(그 외에 좀 더 sum2Bank같은 함수를 sum리턴안하게 좀 하고 싶은데.. 연구 중.)
class Bank {
var numKAG = (0,0,0)
def addNum (k:Int,a:Int,g:Int):Unit = {
numKAG = (numKAG._1 + k, numKAG._2 + a, numKAG._3 + g)
}
}
def sum2Bank (b1:Tuple3[Int,Int,Int], b2:Tuple3[Int,Int,Int] ) = {
val sum = ( b1._1 + b2._1, b1._2 + b2._2, b1._3 + b2._3 )
sum
}
def main(args:Array[String]) = {
//// Bank Sum total :OLD ///////////////
val bank1 = new Bank
val bank2 = new Bank
val actorBank1 = actor {
while (true) {
bank1.addNum(0, 1, 0)
Thread.sleep(10)
}
}
val actorBank2 = actor {
while (true) {
bank2.addNum(2, 2, 1)
Thread.sleep(10)
}
}
//WHEN WANT TO PRINT
while (true) {
//SUM
val sum = sum2Bank(bank1.numKAG, bank2.numKAG)
val totalAll = sum._1 + sum._2 + sum._3
//Always MATCH cause there is no toalALL variable
if( totalAll != (sum._1 + sum._2 + sum._3))
println("total:" + totalAll + ", Kid:" + sum._1)
Thread.sleep(20)
}
}