지난번 동아리 백엔드 네트워크 과제였던 "java로 Gilded Rose 구현"하기 과제 리팩토링을 진행하였다.
매직넘버 관리, 추상클래스 사용, 공통 함수 작성, 주석 추가를 진행하였다.
1. 매직넘버 관리
이전 코드에서는 매직넘버를 관리하지 않아서 유지보수에 좋지 않다는 코드 리뷰를 받았었다.
매직 넘버란 소스 코드에서 의미를 사진 숫자나 문자를 그대로 표현한 것을 말한다.
이러한 표현들은 코드를 읽기 어렵게 만든다는 단점이 있어, 코드를 파악하기에 많은 시간이 소요되게 한다고 한다.
@Override
public void update(Item item) {
if (item.quality < 50) {
item.quality++;
}
item.sellIn--;
if (item.sellIn < 0) {
item.quality++;
}
}
처음에는 위에 처럼 50, 0 매직넘버를 사용해서 유지보수 측면에서 부족한 점이 있었다
@Override
public void update(Item item) {
increaseQuality(item, DEFAULT_QUALITY_INCREMENT);
decreaseSellIn(item);
if (item.sellIn < QUALITY_MIN) {
increaseQuality(item, DEFAULT_QUALITY_INCREMENT);
}
}
DEFAULT_QUALITY_INCREMENT,QUALITY_MIN 등등을 사용하여 매직 넘버를 관리하였다.
2.처음에는 인터페이스를 통해 구현하였는데, 추상클래스로 코드를 변경하였다.
원래 코드는 다음과 같았다.
public interface UpdateLogic {
void update(Item item);
}
변경한 코드는 다음과 같다
public abstract class UpdateLogic {
//판매일(SellIn) 감소
public void decreaseSellIn(Item item) {
item.sellIn--;
}
//품질(Quality)를 지정한 increment만큼 증가
public void increaseQuality(Item item, int increment) {
item.quality = Math.min(item.quality + increment, QUALITY_MAX); // QUALITY_MAX 이상으로 증가하지 않음
}
//품질(Quality)를 지정한 decrement만큼 감소
public void decreaseQuality(Item item, int decrement) {
item.quality = Math.max(item.quality - decrement, QUALITY_MIN); // QUALITY_MIN 이하로 감소하지 않음
}
public abstract void update(Item item);
}
추상 클래스를 사용함으로써 공통 로직의 재사용을 하여 코드의 중복성을 줄여 유지보수성을 높였다.
추상 클래스와 인터페이스 관한 내용은 다음 글을 참고하였다.
추상 클래스 VS 인터페이스
원래 코드에는 다음과 같은 코드가 반복이 되어 코드가 직관적이지 못하고 유지보수성이 떨어지는 문제점이 있었다.
그래서 다음과 같이 공통 함수로 만들어서 문제점을 해결하였다.
package com.gildedrose.update;
import static com.gildedrose.update.ItemConstants.*;
import com.gildedrose.Item;
public abstract class UpdateLogic {
//판매일(SellIn) 감소
public void decreaseSellIn(Item item) {
item.sellIn--;
}
//품질(Quality)를 지정한 increment만큼 증가
public void increaseQuality(Item item, int increment) {
item.quality = Math.min(item.quality + increment, QUALITY_MAX); // QUALITY_MAX 이상으로 증가하지 않음
}
//품질(Quality)를 지정한 decrement만큼 감소
public void decreaseQuality(Item item, int decrement) {
item.quality = Math.max(item.quality - decrement, QUALITY_MIN); // QUALITY_MIN 이하로 감소하지 않음
}
public abstract void update(Item item);
}
이 과정에서 Math.min과 Math.max 함수도 함께 사용하였다.
이 함수들을 사용하면 값을 특정 범위 내로 제한하거나, 코드의 가독성과 안정성을 높여준다고 한다.
4. 주석 처리를 해주어 코드 해석에 용이하도록 해주었다.
이번 과제를 통해 추상클래스,인터페이스, 매직넘버 관리 등에 대해 배워볼 수 있고 코드에 대해 고민을 해볼 수 있었던 시간을 가졌던 것 같다. 저번 과제에서는 보이지 않았던 것들이 이번 과제를 통해 조금씩 눈에 보였던 것 같았다.