Skip to content

Commit

Permalink
Replaced multiple IFs in the AccountAppraisalDelegate by implementing…
Browse files Browse the repository at this point in the history
… State pattern to represent the AccountSide of the Account implementation
  • Loading branch information
ghacupha committed Apr 11, 2018
1 parent 5ecf210 commit 6023932
Show file tree
Hide file tree
Showing 7 changed files with 162 additions and 18 deletions.
5 changes: 5 additions & 0 deletions src/main/java/io/github/ghacupha/keeper/book/api/Account.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import io.github.ghacupha.keeper.book.balance.AccountBalance;
import io.github.ghacupha.keeper.book.balance.AccountSide;
import io.github.ghacupha.keeper.book.base.AccountAppraisalDelegate;
import io.github.ghacupha.keeper.book.base.AccountDetails;
import io.github.ghacupha.keeper.book.unit.time.TimePoint;
import io.github.ghacupha.keeper.book.util.MismatchedCurrencyException;
import io.github.ghacupha.keeper.book.util.UntimelyBookingDateException;
Expand Down Expand Up @@ -90,4 +91,8 @@ public interface Account {
* @return Returns this object's current copy of the {@link Entry} items
*/
List<Entry> getEntries();

AccountDetails getAccountDetails();

void setAccountSide(AccountSide accountSide);
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
import io.github.ghacupha.keeper.book.api.Entry;
import io.github.ghacupha.keeper.book.balance.AccountBalance;
import io.github.ghacupha.keeper.book.balance.AccountSide;
import io.github.ghacupha.keeper.book.base.state.AccountCreditState;
import io.github.ghacupha.keeper.book.base.state.AccountDebitState;
import io.github.ghacupha.keeper.book.base.state.AccountState;
import io.github.ghacupha.keeper.book.unit.money.Cash;
import io.github.ghacupha.keeper.book.unit.money.HardCash;
import io.github.ghacupha.keeper.book.unit.time.DateRange;
Expand All @@ -42,9 +45,18 @@ public class AccountAppraisalDelegate {

private final Account account;

private AccountState accountSideState;

private final AccountState debitAccountState;
private final AccountState creditAccountState;

AccountAppraisalDelegate(Account account) {

this.account = account;
debitAccountState = new AccountDebitState(this.account);
creditAccountState = new AccountCreditState(this.account);

this.accountSideState = account.getAccountSide() == DEBIT ? debitAccountState : creditAccountState;
}

public AccountBalance balance(DateRange dateRange){
Expand All @@ -59,24 +71,9 @@ public AccountBalance balance(DateRange dateRange){
} else if(debits.isZero() && !credits.isZero()){
return new AccountBalance(credits, CREDIT);
}
} else if (account.getAccountSide() == DEBIT) {

if (credits.isMoreThan(debits)) {
return new AccountBalance(credits.minus(debits).abs(), CREDIT);
}
} else {

if (!credits.isMoreThan(debits)) {
return new AccountBalance(credits.minus(debits).abs(), DEBIT);
}
} else if (account.getAccountSide() == CREDIT) {

if (debits.isMoreThan(credits)) {
return new AccountBalance(debits.minus(credits).abs(), DEBIT);
}

if (!debits.isMoreThan(credits)) {
return new AccountBalance(debits.minus(credits).abs(), CREDIT);
}
return accountSideState.getAccountBalance(debits,credits);
}

return new AccountBalance(HardCash.of(0.0,account.getCurrency()),account.getAccountSide());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,15 @@ public AccountSide getAccountSide() {
public List<Entry> getEntries() {
return null;
}

@Override
public AccountDetails getAccountDetails() {
return accountDetails;
}

@Override
public void setAccountSide(final AccountSide accountSide) {

this.accountSide = accountSide;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import io.github.ghacupha.keeper.book.api.Entry;
import io.github.ghacupha.keeper.book.balance.AccountBalance;
import io.github.ghacupha.keeper.book.balance.AccountSide;
import io.github.ghacupha.keeper.book.base.state.AccountState;
import io.github.ghacupha.keeper.book.unit.time.DateRange;
import io.github.ghacupha.keeper.book.unit.time.SimpleDate;
import io.github.ghacupha.keeper.book.unit.time.TimePoint;
Expand Down Expand Up @@ -63,6 +64,8 @@ public final class SimpleAccount implements Account {
private final AccountDetails accountDetails;
private volatile AccountSide accountSide;

private AccountState accountState;

private volatile List<Entry> entries = new CopyOnWriteArrayList<>();

/**
Expand All @@ -83,7 +86,7 @@ public final class SimpleAccount implements Account {
this.entries = entries;
}

SimpleAccount(final AccountSide accountSide, Currency currency, AccountDetails accountDetails) {
public SimpleAccount(final AccountSide accountSide, Currency currency, AccountDetails accountDetails) {
this.currency = currency;
this.accountSide = accountSide;
this.accountDetails = accountDetails;
Expand Down Expand Up @@ -197,4 +200,16 @@ public AccountSide getAccountSide() {
// The original accountSide remains. No side effects
return this.accountSide == DEBIT ? DEBIT : CREDIT;
}

@Override
public AccountDetails getAccountDetails() {

return accountDetails;
}

@Override
public void setAccountSide(final AccountSide accountSide) {

this.accountSide = accountSide;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package io.github.ghacupha.keeper.book.base.state;

import io.github.ghacupha.keeper.book.api.Account;
import io.github.ghacupha.keeper.book.balance.AccountBalance;
import io.github.ghacupha.keeper.book.balance.AccountSide;
import io.github.ghacupha.keeper.book.unit.money.Cash;

import static io.github.ghacupha.keeper.book.balance.AccountSide.DEBIT;

public class AccountCreditState implements AccountState {

private Account account;
public AccountCreditState(Account account) {
this.account = account;
}

/**
* Get AccountBalance given the sum of debits and sum of credits
*
* @param debits
* @param credits
* @return
*/
@Override
public AccountBalance getAccountBalance(final Cash debits,final Cash credits) {

if(credits.isMoreThan(debits)){
return new AccountBalance(credits.minus(debits).abs(),account.getAccountSide());
}

// The journal side of the account changes to DEBIT
account.setAccountSide(DEBIT);

return new AccountBalance(credits.minus(debits).abs(),DEBIT);
}

/**
* @return {@code AccountSide} of the Account
*/
@Override
public AccountSide getAccountSide() {

return account.getAccountSide();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package io.github.ghacupha.keeper.book.base.state;

import io.github.ghacupha.keeper.book.api.Account;
import io.github.ghacupha.keeper.book.balance.AccountBalance;
import io.github.ghacupha.keeper.book.balance.AccountSide;
import io.github.ghacupha.keeper.book.base.SimpleAccount;
import io.github.ghacupha.keeper.book.base.state.AccountState;
import io.github.ghacupha.keeper.book.unit.money.Cash;

import static io.github.ghacupha.keeper.book.balance.AccountSide.CREDIT;

public class AccountDebitState implements AccountState {

private Account account;

public AccountDebitState(Account account) {
this.account = account;
}

@Override
public AccountBalance getAccountBalance(Cash debits, Cash credits) {

if(debits.isMoreThan(credits)){
return new AccountBalance(debits.minus(credits).abs(),account.getAccountSide());
}

account.setAccountSide(CREDIT);

return new AccountBalance(credits.minus(debits).abs(),CREDIT);
}

@Override
public AccountSide getAccountSide() {
return account.getAccountSide();
}

@Override
public String toString() {

return "Debit state";
}

public Account getAccount() {
return account;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.github.ghacupha.keeper.book.base.state;

import io.github.ghacupha.keeper.book.balance.AccountBalance;
import io.github.ghacupha.keeper.book.balance.AccountSide;
import io.github.ghacupha.keeper.book.unit.money.Cash;

/**
* Experimental representation of the states of the account
*/
public interface AccountState {

/**
* Get AccountBalance given the sum of debits and sum of credits
* @param debits
* @param credits
* @return
*/
AccountBalance getAccountBalance(Cash debits,Cash credits);

/**
*
* @return {@code AccountSide} of the Account
*/
AccountSide getAccountSide();
}

0 comments on commit 6023932

Please sign in to comment.