Base setup for Items upgrade/degrade Quality

This commit is contained in:
Vijay G 2023-06-12 21:16:23 +05:30
parent a674623c1c
commit fb969858cb
5 changed files with 158 additions and 0 deletions

View File

@ -0,0 +1,8 @@
package com.gildedrose.enums;
public enum AttributeType {
SELL,
QUALITY;
}

View File

@ -0,0 +1,9 @@
package com.gildedrose.enums;
public enum CountType {
PLUS,
MINUS,
NONE;
}

View File

@ -0,0 +1,32 @@
package com.gildedrose.generic;
import com.gildedrose.Item;
/***
* EventHandler helps to upgrade/degrade the items
* @author VIJAY G
*
*/
public interface EventHandler {
default void increaseQualityByValue(Item item, Integer value) {
item.quality += value;
}
default void decreaseQualityByValue(Item item, Integer value) {
item.quality -= value;
}
default void increaseSellInByValue(Item item, Integer value) {
item.sellIn += value;
}
default void decreaseSellInByValue(Item item, Integer value) {
item.sellIn -= value;
}
default void neutralizeQuality(Item item) {
item.quality = 0;
}
}

View File

@ -0,0 +1,49 @@
package com.gildedrose.generic;
import com.gildedrose.Item;
import com.gildedrose.enums.CountType;
import com.gildedrose.enums.AttributeType;
/***
* IItemType helps to update the quality of the item
* on daily basis and type of item invokes
* @author VIJAY G
*
* @param <T> - Type of item
*/
public interface IItemType<T> extends EventHandler {
int MIN = 0;
int MAX = 50;
int INCREMENTOR = 1;
default void updateQuality(Item item) {
if(isValid(item, AttributeType.QUALITY) && CountType.PLUS.equals(getT().getQualityType())) {
increaseQualityByValue(item, getIncrementor(item));
} else if(isValid(item, AttributeType.QUALITY) && CountType.MINUS.equals(getT().getQualityType())) {
decreaseQualityByValue(item, getIncrementor(item));
}
if(isValid(item, AttributeType.SELL) && CountType.PLUS.equals(getT().getSellType())) {
increaseSellInByValue(item, getIncrementor(item));
} else if(isValid(item, AttributeType.SELL) && CountType.MINUS.equals(getT().getSellType())) {
decreaseSellInByValue(item, getIncrementor(item));
}
if(isNeutralized(item)) {
neutralizeQuality(item);
}
}
default int getIncrementor(Item item) {
return INCREMENTOR;
}
default boolean isNeutralized(Item item) {
return false;
}
boolean isValid(Item item, AttributeType dayType);
ItemType<T> getT();
}

View File

@ -0,0 +1,60 @@
package com.gildedrose.generic;
import com.gildedrose.Item;
import com.gildedrose.enums.CountType;
import com.gildedrose.enums.AttributeType;
/***
* ItemType provides as a template for all types of items,
* which can be appendable/detachable to the system at any time.
* @author VIJAY G
*
* @param <T>
*/
public abstract class ItemType<T> implements IItemType<T> {
private boolean validationRequired;
private CountType sellType;
private CountType qualityType;
protected ItemType(boolean validationRequired, CountType sellType, CountType qualityType) {
this.validationRequired = validationRequired;
this.sellType = sellType;
this.qualityType = qualityType;
}
public boolean isValid(Item item, AttributeType dayType) {
boolean validationRequired = getT().isValidationRequired();
if(!validationRequired) {
return true;
}
if(dayType.equals(AttributeType.QUALITY) && CountType.PLUS.equals(getT().getQualityType())) {
return item.quality < MAX;
} else if(dayType.equals(AttributeType.QUALITY) && CountType.MINUS.equals(getT().getQualityType())) {
return item.quality > MIN;
}
if(dayType.equals(AttributeType.SELL) && CountType.PLUS.equals(getT().getQualityType())) {
return item.sellIn < MAX;
} else if(dayType.equals(AttributeType.SELL) && CountType.MINUS.equals(getT().getQualityType())) {
return item.sellIn > MIN;
}
return false;
}
public ItemType<T> getT() {
return this;
}
public CountType getSellType() {
return sellType;
}
public CountType getQualityType() {
return qualityType;
}
public boolean isValidationRequired() {
return validationRequired;
}
}