From d84a836ca6effb301d5a8e7c3c29a9a1696ff518 Mon Sep 17 00:00:00 2001 From: Manali Mogre Date: Sun, 16 Aug 2020 18:03:19 +0200 Subject: [PATCH] - Code Refactoring : Adding code for Custom Items --- .../GildedRose/CustomisedItemFactory.swift | 27 +++++++++++++++ swift/Sources/GildedRose/GildedRose.swift | 10 +++++- .../GildedRose/GlidedRoseConstants.swift | 6 ++++ .../GildedRose/Items/AgedBrieItem.swift | 9 +++-- .../Items/BackstagePassesItem.swift | 23 ++++++++++++- .../GildedRose/Items/CustomisedItem.swift | 34 +++++++++++++++++++ .../GildedRose/Items/StandardItem.swift | 18 +++++++++- .../GildedRose/Items/SulfurasItem.swift | 2 +- 8 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 swift/Sources/GildedRose/CustomisedItemFactory.swift diff --git a/swift/Sources/GildedRose/CustomisedItemFactory.swift b/swift/Sources/GildedRose/CustomisedItemFactory.swift new file mode 100644 index 00000000..40410e2e --- /dev/null +++ b/swift/Sources/GildedRose/CustomisedItemFactory.swift @@ -0,0 +1,27 @@ +// +// File.swift +// +// +// Created by Manali Mogre on 16/08/2020. +// + +import Foundation + +class CustomisedItemFactory { + func getCustomisedItem(item: Item) -> CustomisedItemProtocol { + switch item.name { + case ItemNameConstants.kAgedBrieItem: + return AgedBrieItem(item: item) + case ItemNameConstants.kBackstagePassesItem: + return BackstagePassesItem(item: item) + case ItemNameConstants.kSulfurasItem: + return SulfurasItem(item: item) + default: + return StandardItem(item: item) + } + } +} + + + + diff --git a/swift/Sources/GildedRose/GildedRose.swift b/swift/Sources/GildedRose/GildedRose.swift index a25d8117..7790197b 100644 --- a/swift/Sources/GildedRose/GildedRose.swift +++ b/swift/Sources/GildedRose/GildedRose.swift @@ -6,6 +6,14 @@ public class GildedRose { } public func updateQuality() { + for item in items { + let customFactoryObj = CustomisedItemFactory() + let customItem = customFactoryObj.getCustomisedItem(item: item) + customItem.updateCustomItemQuality() + } + } + + /* public func updateQuality() { for item in items { switch item.name { case ItemNameConstants.kBackstagePassesItem: @@ -37,7 +45,7 @@ public class GildedRose { } } - /* public func updateQuality() { + public func updateQuality() { for i in 0.. 0) { diff --git a/swift/Sources/GildedRose/GlidedRoseConstants.swift b/swift/Sources/GildedRose/GlidedRoseConstants.swift index a869beec..4d4161e0 100644 --- a/swift/Sources/GildedRose/GlidedRoseConstants.swift +++ b/swift/Sources/GildedRose/GlidedRoseConstants.swift @@ -12,3 +12,9 @@ struct ItemNameConstants { static let kBackstagePassesItem: String = "Backstage passes to a TAFKAL80ETC concert" static let kSulfurasItem: String = "Sulfuras, Hand of Ragnaros" } + +struct ValueConstants { + static let kHightestQualityValue = 50 + static let kLowestQualityValue = 0 +} + diff --git a/swift/Sources/GildedRose/Items/AgedBrieItem.swift b/swift/Sources/GildedRose/Items/AgedBrieItem.swift index be140852..92191db2 100644 --- a/swift/Sources/GildedRose/Items/AgedBrieItem.swift +++ b/swift/Sources/GildedRose/Items/AgedBrieItem.swift @@ -7,13 +7,18 @@ import Foundation -struct AgedBrieItem: CustomisedItemProtocol { +struct AgedBrieItem: CustomisedItemProtocol, ItemSellInDaysProtocol, ItemQualityProtocol { var item: Item public init(item: Item) { self.item = item } func updateCustomItemQuality() { - + // update the sell in days + reduceSellInDaysByOne(item: item) + // Increment the Item quality by 1 if the quality is less than 50 + guard isItemUnderHighestQuality(item: item) else {return} + increaseQuality(for: item, by: 1) } + } diff --git a/swift/Sources/GildedRose/Items/BackstagePassesItem.swift b/swift/Sources/GildedRose/Items/BackstagePassesItem.swift index 35c2b6b3..ab5ffeaf 100644 --- a/swift/Sources/GildedRose/Items/BackstagePassesItem.swift +++ b/swift/Sources/GildedRose/Items/BackstagePassesItem.swift @@ -7,13 +7,34 @@ import Foundation -struct BackstagePassesItem: CustomisedItemProtocol { +struct BackstagePassesItem: CustomisedItemProtocol, ItemQualityProtocol, ItemSellInDaysProtocol { var item: Item public init(item: Item) { self.item = item } func updateCustomItemQuality() { + reduceSellInDaysByOne(item: item) + if isSellInDaysMoreThanOrEqualTo(days: 10) { + increaseQuality(for: item, by: 1) + } + else if isSellInDaysMoreThanOrEqualTo(days: 5) { + increaseQuality(for: item, by: 2) + } + else if isSellInDaysMoreThanOrEqualTo(days: 0) { + increaseQuality(for: item, by: 3) + } + if HasSellInDatePassed(item: item) { + item.quality = ValueConstants.kLowestQualityValue + } + if !isItemUnderHighestQuality(item: item) { + item.quality = ValueConstants.kHightestQualityValue + } } + + private func isSellInDaysMoreThanOrEqualTo(days: Int) -> Bool { + return item.sellIn >= days + } + } diff --git a/swift/Sources/GildedRose/Items/CustomisedItem.swift b/swift/Sources/GildedRose/Items/CustomisedItem.swift index 2bacf60b..b3beff4e 100644 --- a/swift/Sources/GildedRose/Items/CustomisedItem.swift +++ b/swift/Sources/GildedRose/Items/CustomisedItem.swift @@ -12,3 +12,37 @@ protocol CustomisedItemProtocol { } +protocol ItemSellInDaysProtocol { + func reduceSellInDaysByOne(item: Item) +} + +extension ItemSellInDaysProtocol { + func reduceSellInDaysByOne(item: Item) { + item.sellIn -= 1 + } + + func HasSellInDatePassed(item: Item) -> Bool { + return item.sellIn < 0 + } +} + +protocol ItemQualityProtocol { + +} + +extension ItemQualityProtocol { + func isItemUnderHighestQuality(item: Item) -> Bool { + return item.quality < ValueConstants.kHightestQualityValue + } + func reduceQuality(for item: Item, by value:Int) { + item.quality -= value + } + + func increaseQuality(for item: Item, by value:Int) { + item.quality += value + } + + func isItemOverLowestQuality(item: Item) -> Bool { + return item.quality > ValueConstants.kLowestQualityValue + } +} diff --git a/swift/Sources/GildedRose/Items/StandardItem.swift b/swift/Sources/GildedRose/Items/StandardItem.swift index 85110f12..6552e96e 100644 --- a/swift/Sources/GildedRose/Items/StandardItem.swift +++ b/swift/Sources/GildedRose/Items/StandardItem.swift @@ -7,7 +7,7 @@ import Foundation -struct StandardItem: CustomisedItemProtocol { +struct StandardItem: CustomisedItemProtocol, ItemQualityProtocol, ItemSellInDaysProtocol { var item: Item @@ -15,6 +15,22 @@ struct StandardItem: CustomisedItemProtocol { self.item = item } func updateCustomItemQuality() { + // Reduce the sellIn days for Item by 1 + reduceSellInDaysByOne(item: item) + // Reduce the item quality by 1 , if the sell in date is passed decrement by 2 + HasSellInDatePassed(item: item) ? reduceQuality(for: item, by: decreasingValueForZeroOrLessDaysToSell()) : reduceQuality(for: item, by: decreasingValueOverZeroDaysToSell()) + guard isItemOverLowestQuality(item: item) else { + item.quality = ValueConstants.kLowestQualityValue + return + } + } + + func decreasingValueOverZeroDaysToSell() -> Int { + return 1 + } + + private func decreasingValueForZeroOrLessDaysToSell() -> Int { + return 2 * decreasingValueOverZeroDaysToSell() } } diff --git a/swift/Sources/GildedRose/Items/SulfurasItem.swift b/swift/Sources/GildedRose/Items/SulfurasItem.swift index ae2006f7..8ede0b84 100644 --- a/swift/Sources/GildedRose/Items/SulfurasItem.swift +++ b/swift/Sources/GildedRose/Items/SulfurasItem.swift @@ -14,6 +14,6 @@ struct SulfurasItem: CustomisedItemProtocol { self.item = item } func updateCustomItemQuality() { - + // No code as there is no change in quality or sell in days of sulfuras item } }