Skip to content

Instantly share code, notes, and snippets.

@osamutake osamutake/Hello.java
Last active Aug 29, 2015

Embed
What would you like to do?
http://bufferings.hatenablog.com/entry/2015/05/06/000943 で紹介されていた「手続き型で典型的」かつ、かなりアレなコードを自分なりにリファクタリングしてみました。
public Result execute(Input in) {
try {
Integer productId = in.getSelected();
List<Integer> coinsInserted = in.getCoins();
if ( !IsProductIdInRange(productId, 1, 10) ||
!IsCoinCountInRange(coinsInserted, 1, 100) ) {
throw new IllegalArgumentException();
}
List<Integer> coinsToReturn = new ArrayList<>();
int deposit = calcDeposit(coinsInserted, coinsToReturn);
Product product = dao.findById(productId);
if (!IsProductAvailable(product, deposit)) {
return createResultWitoutProduct(coinsInserted);
}
deposit -= product.getPrice();
calcChange(deposit, coinsToReturn);
Result result = new Result();
result.setProduct(product);
result.setCoins(coinsToReturn);
return result;
} catch (Exception e) {
LOG.error(e);
return createResultWitoutProduct(coinsInserted);
}
}
boolean IsProductIdInRange(Integer productId, int from, int to)
{
return productId != null && from <= productId && productId <= to;
}
boolean IsCoinCountInRange(List<Integer> coins, int from, int to)
{
return coins != null && from <= coins.size() && coins.size() <= to;
}
Result createResultWitoutProduct(List<Integer> coins)
{
result = new Result();
result.setCoins(coins);
result.setProduct(null);
return result;
}
// TODO: 本来なら定数を用意すべき
List<Integer> getValidCoinsDescending()
{
List<Integer> list = new ArrayList<>();
list.add(500);
list.add(100);
list.add(50);
list.add(10);
return list;
}
int calcDeposit(List<Integer> coins, List<Integer> coinsToReturn)
{
int deposit = 0;
List<Integer> validCoins = getValidCoinsDescending();
for (Integer coin : coins) {
if (validCoins.contains(coin)) {
deposit += coin;
} else {
coinsToReturn.add(coin);
}
}
return deposit;
}
void calcChange(int deposit, List<Integer> coinsToReturn)
{
for (Integer coin : getValidCoinsDescending()) {
while (deposit > coin) {
coinsToReturn.add(coin);
deposit -= coin;
}
}
// if (deposit != 0) {
// // product.Price() が 10 で割り切れない!
// throw new IllegalArgumentException();
// }
}
boolean isProductAvailable(Product product, int deposit)
{
return product != null && product.getPrice() <= deposit;
}
@osamutake

This comment has been minimized.

Copy link
Owner Author

commented May 13, 2015

編集履歴についてのコメントは http://dora.bk.tsukuba.ac.jp/~takeuchi/?プログラミング%2F作法%2FHello.java にあります。

Mitsuyuki.Shiiba さんのオリジナルのコードが Gist 上に https://gist.github.com/bufferings/9414995751687177e882 としてあるのですが、特定のリビジョンから Fork する方法が解らず、コピペで新しい Gist を作ることになってしまいました。たぶん間違った方法なんだと思うのですが、どうもすみません。

ここからも解るように、私は Gist も、実は Java もあまりよく分かっていません。普段は Ruby とか JavaScript とか C# とか良く書いてます。Java のコンパイル環境もないので、タイプミスについてもご容赦下さい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.