This post is to show how you can implement a simple Map with only Put, Get and Size operations. This map implementation does not take care of any thread safety and just here to illustrate what all may needed to implement a map kind of data structure.
It took me almost two years to realized how important is the blog post and more important is how to keep it going.. I always had hard time in writing specially how to express my self. To make thing easy I promised my self to write a small post about bi-weekly basis on what I have learned
I have read recently clean coder - A handbook of Agile software craftsmanship written by Robert C. Martin and now I know what it takes to become a professional programmer.
The earlier book Clean code was all about code and clean coder was all about about profession. I felt both the books are two side of a coin and a professional programmer is who write clean code and a professional at the same time.
I recommended the book to two of my colleagues also and I would recommend to everyone who care about professionalism. Thanks to uncle bob for such a simple yet powerful book on professionalism.
What is a design pattern? - Someone has already solved your problem - (Head First Design Pattern).
When should we use it? - Depend upon what kind of problem you want to solve .. there might be already a mature solution (in design) for the problem.. so that means you need to spend some time understanding existing design patterns and where you should apply them.. if you think none of the existing design pattern suits to your problem then you can share your experience with the community and you never know .. might be the next design pattern belongs to you..
Why should we use it? As already said - Someone has already solved your problem.. and when you apply it your code it make self explanatory . so that if some one else is looking to your code can easily make what kind of problem you are trying to solve.. ah you got free documentation...
private void denominationIsCorrect(int withDrawAmount) { if(!Denomination.isCorrect(withDrawAmount)) { throw new InvalidDenominationException(String.format("This amount [%s] is not valid. Please enter multilier of [%s]", withDrawAmount,Denomination.names())); } }
private void userHaveEnoughMoney(UserAccount userAccount, int withDrawAmount) { if(getBalance(userAccount) <> getBalance(userAccount)) { throw new InsufficientBalanceException(String.format("Account [%s] has insufficient balance [%s].Requested amount [%s]", userAccount, getBalance(userAccount), withDrawAmount)); } } }
@Before public void filledUserAccountWithBalance() { client = ATMClient.instanceOf(); userAccount = new UserAccount("123455632", "pin"); final int tenThousand = Denomination.FIVE_HUNDRED.getNote() * 20; client.filledUserAccountWithInitialBalance(userAccount, tenThousand); }
@Test(expected=InvalidUserAccountExcetion.class) public void shouldThrowAnExceptionIfAccountDoesNotExist() { final UserAccount invalidUserAccount = new UserAccount("", ""); Assert.assertEquals(10000, client.checkBalance(invalidUserAccount)); }
@Test public void userShouldAbleSeeTotalAvailableBalance() { Assert.assertEquals(10000, client.checkBalance(userAccount)); }
@Test public void userShouldAbleToWithdrawAmountWithCorrectDenomination() { final Map denominationToCount = client.withdrawThisMuchAmount(userAccount, 2200);
1. ATM Client - Today I was thinking of writing a sample program which can be used as an ATM client.
Problem - Write a simple java program which act as an ATM client and do following :- a) User should able to populate their account with some initial amount .. sound funny? latter one we will change this. so that only admin can do that b) Support for 50, 100 and 500 denomination. c) Error handling for invalid account, denomination, over flow requested amount. d) User should able to check account balance. e) User should able to withdraw valid amount.. in return ATM machine should return the total no of notes for each denomination.
Ok.. enough writing about the problem .. Let us write some code.. code? or test cases .. I vote for test cases..
What all you need - 1. JDK 5 2. Eclipse 3. Junit 4