From c29949a4913af293a7619bc5f4c121750f11deab Mon Sep 17 00:00:00 2001 From: Atul Anand Date: Mon, 14 Sep 2020 01:04:08 +0530 Subject: [PATCH] Refactored GildedRose Signed-off-by: Atul Anand --- .../scala/com/gildedrose/GildedRose.scala | 149 ++++++++++++------ 1 file changed, 99 insertions(+), 50 deletions(-) diff --git a/scala/src/main/scala/com/gildedrose/GildedRose.scala b/scala/src/main/scala/com/gildedrose/GildedRose.scala index 9f9fdd2b..cfc5bf56 100644 --- a/scala/src/main/scala/com/gildedrose/GildedRose.scala +++ b/scala/src/main/scala/com/gildedrose/GildedRose.scala @@ -2,57 +2,106 @@ package com.gildedrose class GildedRose(val items: Array[Item]) { - def updateQuality() { - for (i <- 0 until items.length) { - if (!items(i).name.equals("Aged Brie") - && !items(i).name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items(i).quality > 0) { - if (!items(i).name.equals("Sulfuras, Hand of Ragnaros")) { - items(i).quality = items(i).quality - 1 - } - } - } else { - if (items(i).quality < 50) { - items(i).quality = items(i).quality + 1 - - if (items(i).name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items(i).sellIn < 11) { - if (items(i).quality < 50) { - items(i).quality = items(i).quality + 1 - } - } - - if (items(i).sellIn < 6) { - if (items(i).quality < 50) { - items(i).quality = items(i).quality + 1 - } - } - } - } - } - - if (!items(i).name.equals("Sulfuras, Hand of Ragnaros")) { - items(i).sellIn = items(i).sellIn - 1 - } - - if (items(i).sellIn < 0) { - if (!items(i).name.equals("Aged Brie")) { - if (!items(i).name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items(i).quality > 0) { - if (!items(i).name.equals("Sulfuras, Hand of Ragnaros")) { - items(i).quality = items(i).quality - 1 - } - } - } else { - items(i).quality = items(i).quality - items(i).quality - } - } else { - if (items(i).quality < 50) { - items(i).quality = items(i).quality + 1 - } - } - } + for (i <- items.indices) { + if (isItemNotIncremental(i)) { + if (isQualityPositive(i)) + incrementQuality(i, -1) + } else + incrementQualityForIncrementalItems(i) + decrementSellInIfNotSulfuras(i) + if (isSellInLessThanThreshold(i, 0)) + updateQualityIfSellInZero(i) } } + + private def incrementQualityForIncrementalItems(i: Int): Unit = { + if (isQualityLessThan50(i)) { + incrementQuality(i, 1) + additionalIncrementForBackstagePasses(i) + } + } + + private def updateQualityIfSellInZero(i: Int): Unit = { + if (isAgedBrie(i)) + incrementQualityBy1IfLessThan50(i) + else if (isBackstagePass(i)) + dropQualityTo0(i) + else if (!isSulfuras(i) && isQualityPositive(i)) + incrementQuality(i, -1) + } + + private def additionalIncrementForBackstagePasses(i: Int): Unit = { + if (isBackstagePass(i)) + incrementBackstagePassQuality(i) + } + + private def incrementBackstagePassQuality(i: Int): Unit = { + incrementForBackstagePassesIfSellInBetween5and10(i) + incrementForBackstagePassesIfSellInBetween0and5(i) + } + + private def incrementForBackstagePassesIfSellInBetween0and5(i: Int): Unit = { + if (isSellInLessThanThreshold(i, 6)) + incrementQualityBy1IfLessThan50(i) + } + + private def incrementForBackstagePassesIfSellInBetween5and10(i: Int): Unit = { + if (isSellInLessThanThreshold(i, 11)) + incrementQualityBy1IfLessThan50(i) + } + + private def decrementSellInIfNotSulfuras(i: Int): Unit = { + if (!isSulfuras(i)) + decrementSellIn(i) + } + + private def incrementQualityBy1IfLessThan50(i: Int): Unit = { + if (isQualityLessThan50(i)) + incrementQuality(i, 1) + } + + private def isSellInLessThanThreshold(i: Int, threshold: Int) = { + items(i).sellIn < threshold + } + + private def decrementSellIn(i: Int): Unit = { + items(i).sellIn = items(i).sellIn - 1 + } + + private def isQualityPositive(i: Int) = { + items(i).quality > 0 + } + + private def isQualityLessThan50(i: Int) = { + items(i).quality < 50 + } + + private def incrementQuality(i: Int, delta: Int): Unit = { + items(i).quality = items(i).quality + delta + } + + private def dropQualityTo0(i: Int): Unit = { + items(i).quality = 0 + } + + private def isItemNotIncremental(i: Int) = { + !isAgedBrie(i) && !isBackstagePass(i) && !isSulfuras(i) + } + + private def isBackstagePass(i: Int) = { + items(i).name.equals("Backstage passes to a TAFKAL80ETC concert") + } + + private def isAgedBrie(i: Int) = { + items(i).name.equals("Aged Brie") + } + + private def isSulfuras(i: Int) = { + items(i).name.equals("Sulfuras, Hand of Ragnaros") + } + + private def isConjured(i: Int) = { + items(i).name.equals("Conjured Mana Cake") + } } \ No newline at end of file