본문 바로가기

BE & Spring

[COTATO] 백엔드 네트워킹 - Gilded Rose 코드 리팩토링

1. 안 쓰는 코드는 삭제하자

기존 Gilded Rose 코드를 주석처리해서 남겨놓았던 부분을 삭제했다

 

 

2. 매직넘버를 잘 활용하자

매직 넘버를 잘 활용해서 보기 편했다는 코드 리뷰를 받았다 :)

 

아이템의 품질은 50을 넘길 수 없다(Sulfuras는 전설의 아이템이기 때문에 예외)는 조건이 있어서

MAX_QUALITY와 MIN_QUALITY를 매직 넘버로 관리했다.

 

매직 넘버로 관리하지 않으면

코드에 있는 숫자만을 보고 그 숫자가 무엇을 의미하는지 파악하기 어렵고

추후에 값을 수정하고 싶을 때 그 값이 쓰여진 모든 코드를 수정해야 하는 번거로움이 있기 때문에 매직넘버를 활용하면 좋다

public abstract class AbstractItemUpdateStrategy implements ItemUpdateStrategy {
    protected static final int MAX_QUALITY = 50;
    protected static final int MIN_QUALITY = 0;
    ...
}

 

 

3. 인터페이스와 추상클래스의 역할을 정확히 알고 사용하자

코드 리뷰에서 이부분에 질문을 많이 받았다..! 왜 추상클래스와 인터페이스를 동시에 사용한 건지 많이 물어봐주셨다

 

 

나는 인터페이스 - 추상클래스 - 구현클래스 디자인 패턴을 적용했다

모든 종류의 아이템은 매일 상태가 update 되어야 하는 건 공통적이다

update 메서드를 가진 인터페이스를 만들었다

public interface ItemUpdateStrategy {
    void update(Item item);
}

 

하지만 아이템의 종류에 따라 update 되는 방식은 다르다

날짜가 지남에 따라 판매 기한과 품질이 변경되는 방식이 여러가지인데
판매 기한 감소, 품질 감소, 품질 증가 등의 메서드들이 적절히 사용되어야 한다

그래서 이 메서드들을 추상클래스에 구현했다

public abstract class AbstractItemUpdateStrategy implements ItemUpdateStrategy {
    protected static final int MAX_QUALITY = 50;
    protected static final int MIN_QUALITY = 0;

    protected void increaseQualityLessThanMax(Item item) {
        if (item.quality < MAX_QUALITY)
            item.quality++;
    }

    protected void decreaseSellIn(Item item) {
        item.sellIn--;
    }

    protected void decreaseQualityMoreThanMin(Item item) {
        if (item.quality > MIN_QUALITY)
            item.quality--;
    }

    protected void decreaseQualityTwiceAsFast(Item item) {
        if (item.quality > MIN_QUALITY)
            item.quality = Math.max(item.quality - 2, MIN_QUALITY);
    }
}

 

그리고 실제 구현 클래스에서는 아이템 종류에 알맞게 update 메서드를 구현하는 방식으로 만들었다.

public class StandardItemUpdateStrategy extends AbstractItemUpdateStrategy {
    @Override
    public void update(Item item) {
        decreaseSellIn(item);

        if (item.sellIn < 0) {
            decreaseQualityTwiceAsFast(item);
        } else {
            decreaseQualityMoreThanMin(item);
        }
    }
}

 

 


지금까지는 내 코드에 누군가가 질문을 할 일이 없었으니 대충 잘 돌아가게만 짜왔던 것 같다

처음으로 코드리뷰를 해보고 질문을 받아보면서

코드 하나도 근거를 가지고 왜 이렇게 짜는지 생각하는 기회가 되었다

질문을 받지 않았으면 그냥 넘어갔을법 한 중요한 개념을 다시 공부하게 됐다!

 

백엔드 파트장님이

코드 리뷰를 할 때는 "내가 어떻게 감히 남의 코드를 평가하냐"는 마인드를 갖는게 아니라

상대방도 질문을 받으면서 고민하고 성장할 수 있다고 강조하셨는데

이번 과제를 통해서 코드 리뷰는 함께 성장하는 기회라는 것을 제대로 깨닫게 되었다 ~~

 

 

 

https://github.com/u-genuine/10th-BE-Networking-1/tree/u-genuine/1

 

GitHub - u-genuine/10th-BE-Networking-1: 10기 백엔드 네트워킹 - 1

10기 백엔드 네트워킹 - 1. Contribute to u-genuine/10th-BE-Networking-1 development by creating an account on GitHub.

github.com

 


let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });