Skip to content

Commit

Permalink
Merge pull request #221 from ricemery/BankAccount
Browse files Browse the repository at this point in the history
Rework interface definition to cleanly show openAccount. Add HINTS.md…
  • Loading branch information
ErikSchierboom authored Dec 1, 2016
2 parents b066e22 + 239650a commit d4f60ce
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 9 deletions.
11 changes: 11 additions & 0 deletions exercises/bank-account/HINTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## Hints

This exercise is testing mutable state that can be accessed saftely from multiple threads. Scala provides a variety of ways to protect
mutable state. For developers familiar with Java concurrency, Scala can utilize the Java concurrency support such as the Java synchronized block.

### Common Pitfalls

In Scala there are two ways to achieve mutable state: Use a "var" or a mutable object.
Two common mistakes here are:
- Do not use a "var" that is also a mutable object. One is enough, but not both together.
- Don't expose the "var" or mutable object to the outside world. So make them "private" and change the mutable object into immutable before you return it as a value.
6 changes: 2 additions & 4 deletions exercises/bank-account/example.scala
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ protected case class Account(var balance: Option[Int] = Some(0)) extends BankAcc
}
}

object BankAccount {
def apply(): BankAccount = Account()
object Bank {
def openAccount(): BankAccount = Account()
}


13 changes: 13 additions & 0 deletions exercises/bank-account/src/main/scala/BankAccount.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
trait BankAccount {

def closeAccount(): Unit

def getBalance: Option[Int]

def incrementBalance(increment: Int): Option[Int]
}

object Bank {
def openAccount(): BankAccount = ???
}

10 changes: 5 additions & 5 deletions exercises/bank-account/src/test/scala/BankAccountTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ import org.scalatest.{Matchers, FunSuite}

class BankAccountTest extends FunSuite with Matchers with Conductors with IntegrationPatience {
test("open account") {
BankAccount().getBalance should be (Some(0))
Bank.openAccount().getBalance should be (Some(0))
}

test("incrementing and checking balance") {
pending
val acct = BankAccount()
val acct = Bank.openAccount()
acct.getBalance should be (Some(0))
acct.incrementBalance(10) should be (Some(10))
acct.getBalance should be (Some(10))
Expand All @@ -18,7 +18,7 @@ class BankAccountTest extends FunSuite with Matchers with Conductors with Integr

test("closed account should hold no balance") {
pending
val acct = BankAccount()
val acct = Bank.openAccount()
acct.closeAccount()
acct.incrementBalance(10)
acct.incrementBalance(10)
Expand All @@ -30,7 +30,7 @@ class BankAccountTest extends FunSuite with Matchers with Conductors with Integr
val conductor = new Conductor
import conductor._

val acct = BankAccount()
val acct = Bank.openAccount()

thread("t1") {
acct.incrementBalance(10)
Expand All @@ -54,7 +54,7 @@ class BankAccountTest extends FunSuite with Matchers with Conductors with Integr
val conductor = new Conductor
import conductor._

val acct = BankAccount()
val acct = Bank.openAccount()

thread("t1") {
for (a <- 1 to 10)
Expand Down

0 comments on commit d4f60ce

Please sign in to comment.