전통적인 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)
}


}

 

 


 


Posted by yongary
,