Search code examples
oopstructureooad

Assigning responsibility: a Game that has Players which each has a BankAccount


I've been studying some Object Oriented Analysis and Design lately, and I feel that I got a pretty good overall feel for it.

But this little scenario keeps bugging me.

Let's say I'm designing a simple board game. I have class Game which holds info about the board and the players. Players are created from the class Player. All players have a bank account created from the class BankAccount.

My Game handles the logic about what should happen following a move. Most of the time this involves withdrawing or depositing some amount from a players bank account.

My BankAccount has the methods for withdrawing, depositing and returning the balance. But my Game doesn't know about a players bank account. Only about the player. Do I give my Player class a method getAccount, so i can call playerObject.getAccount().withdraw()? Or how do I go about assigning the responsibility for this behaviour? Should my Player class implement a method withdraw() that just calls account.withdraw() on it's associated account object?


Solution

  • A Bank ought to have control of the BankAccounts, not the player objects.

    In other words a Bank should be a collection of BankAccounts plus some additional methods for managing those accounts.

    This is so you can do things like:

    bank.WithDrawMoney(player, amount);
    

    or

    bank.TransferMoney(playerFrom, playerTo, amount);
    

    In this case the bank would "look up" the account that that player has and remove the appropriate funds from it.

    Imagine if it was a real bank account. A person doesn't carry that account with them, only a reference to it. A Bank is responsible for transfer of funds (deposits, withdrawals..).

    So, at a top level, you are going to have a Game which contains objects such as Players, Bank, and Board. It may have top methods such RollDice(). The Board may have a method such as Move(player, distance);