2017-01-13 3 views
0

저는 자동 판매기를 구현하는 프로젝트를 가지고 있습니다. VendingMachine 개체가 있는데, 내부에 CoinOp라는 다른 개체가 있습니다. CoinOp 객체가 다양한 값의 동전을 받아들이기를 원합니다. VendingMachine은 CoinOp에 사용자가 입력 한 금액을 알려달라고 요청할 수 있습니다. 실제로 작동하려면 CoinOp가 내부에있는 금액을 변경할 수 있어야합니다.스칼라와 스카라로 시간이 지남에 따라 변경되는 객체를 포함하는 프로젝트를위한 순수한 기능 아키텍처 구현 방법

정의한 VendingMachine은 다음과 같습니다

class CoinOp { 
    var money = 0.0f 

    def addCoins(amount: Float) = money += amount 
} 

가 대신 내가 뭔가를 할 필요가 :

class VendingMachine { 
    val coinOp = new CoinOp() 
} 

내가 바로 옵션으로 CoinOp의 구현을 제거하는 기능적인 방법으로이 작업을 수행 할 수 좋아요 :

case class CoinOp(money: Float) { 
    def addCoins(amount: Float): CoinOp = CoinOp(money + amount) 
} 

나는이 같은 것을하기 위해 스카 파를 사용할 수 있습니다. . scalaz에서의 구현은 실제로이 질문의 초점이 아닙니다.

내 질문은 : 내가 CoinOp가 가지고있는 금액을 기능적으로 업데이트 할 수 있다고 가정하면 변경된 VendingMachine을 어떻게 표시합니까?

addCoins에서 새 CoinOp 개체를 만드는 것은 훌륭하지만 모든 것이지만 새로운 개체이며 VendingMachine에 참조가있는 개체를 변경하지 않습니다. 어떤 좋은 영속성, 함수 프로그래밍의 모든 부분입니다. 그러나 addCoins()가 클래스 정의에있는 객체 대신 생성하는 객체를 사용하려면 VendingMachine이 필요합니다. 어떻게해야합니까?

제가 생각할 수있는 유일한 점은 VendingMachine에서 coinOp 객체를 만드는 것입니다. var는 CoinOp # addCoins에 대한 호출에 응답하여 설정할 수 있습니다. 그러나 그것은 저에게 좋은 해결책처럼 보이지 않습니다.

누군가가 어떻게 설정 될지 설명해 주시겠습니까?

+1

가 보인다 자체 내부에 상태를 유지, Akka 배우이다. –

답변

-2

addCoins 방법을 호출 할 때 당신은 당신이 그래서

case class CoinOp(money: Float) { 
    def addCoins(amount: Float): CoinOp = CoinOp(money + amount) 
    def addCoins(amount: CoinOp): CoinOp = CoinOp(money + amount.money) 
} 

그와 함께했던 것처럼 당신이 말했듯이, 부작용 및 불변의 구조가없는 방법에 최대한 충실 함수형 프로그래밍을하고 싶은 경우 새 CoinOp 인스턴스가 반환됩니다.

하지만 문제는 여기에 있습니다. 자동 판매기를 사용하면 유지해야 할 몇 가지 상태가 있음을 의미합니다. 상태는 불행히도 var입니다.

스레드 안전성이 필요하지 않은 경우 CoinOp 유형의 개인 변수를 만들고 비용을 추가 할 때 CoinOp의 다른 인스턴스를이 var에 할당하기 만하면됩니다. 이 방법을 사용하면 CoinOp 클래스를 변경할 수 없지만 VendingMachine 클래스는 상태를 가지며 변경할 수 있습니다.

class VendingMachine{ 
    var funds: CoinOp = CoinOp(0) 

    def addFunds(amount: CoinOp): CoinOp = { 
    funds = funds.addCoins(amount.money) 
    // or rather use addCoins(CoinOP): 
    // funds = funds.addCoins(amount) 
    } 
} 

당신이 당신의 자금 상태로 동기화 된 액세스 할 수 있도록하려면

- 스칼라 방법은 국가 모나드를 찾고있는 것처럼

+0

나는 이것이 문제를 전혀 해결하지 못한다고 생각합니다. 그것은 상태를 제거하지 않고 그냥 다른 곳으로 옮깁니다. – puhlen

+0

제가 알기로 - 상태는 몇 가지 문제의 본질입니다. 이것은 akka 배우와 같은 도서관이 전혀 존재하지 않는 이유입니다. 따라서 주를 소유하는 것은 VendingMachine 성격의 일부입니다. 그리고 당신은 그것을 처리 할 필요가 있습니다. –

+0

OP는 동시 컨텍스트에서 상태를 관리하는 것에 대해 아무 것도 묻지 않았습니다. 그 이유는 먼저 액터에 도달하는 이유입니다. –