[Unity] 같은 종류 다른 타입 리팩토링ReFactoring

고현규·2024년 1월 8일
0

전전 글에 작성한 내용으로
3가지 색깔의 열쇠와 문을 스위치문으로 작성했었다.

public string GetInteractPrompt()
{
    switch (lockedDoor.DisPlayName)
    {
        case "Blue":
            if (Main.Player.KeyCheck.Blue == true)
                return string.Format("Open {0} Door", lockedDoor.DisPlayName);
            else
                return string.Format("Need {0} Key", lockedDoor.DisPlayName);

        case "Red":
            if (Main.Player.KeyCheck.Red == true)
                return string.Format("Open {0} Door", lockedDoor.DisPlayName);
            else
                return string.Format("Need {0} Key", lockedDoor.DisPlayName);

        case "Green":
            if (Main.Player.KeyCheck.Green == true)
                return string.Format("Open {0} Door", lockedDoor.DisPlayName);
            else
                return string.Format("Need {0} Key", lockedDoor.DisPlayName);
    }
    //return string.Format("Open {0} Door", lockedDoor.DisPlayName);
    return string.Format("Need {0} Key", lockedDoor.DisPlayName);
}

이를 좀 더 좋은 코드로 수정하기 위해 첫번째로 시도한 것은 Enum이다.
Enum을 선언하고, 각 게임오브젝트의 Inspector에서 해당 색깔을 지정했다.

enum Color {Blue, Green, Red };
[SerializeField] private Color _keycolor;

public string GetInteractPrompt()
{
    if (Main.Player.KeyCheck.Blue == true && _keycolor == Color.Blue)
        return string.Format("Open {0} Door", _keycolor);

    else if (Main.Player.KeyCheck.Red == true && _keycolor == Color.Red)
        return string.Format("Open {0} Door", _keycolor);

    else if (Main.Player.KeyCheck.Green == true && _keycolor == Color.Green)
        return string.Format("Open {0} Door", _keycolor);

    else
        return string.Format("Need {0} Key", _keycolor);
}

 public void OnInteract()
 {
     if (Main.Player.KeyCheck.Blue == true && _keycolor == Color.Blue)
         DoorInteraction();          
     if (Main.Player.KeyCheck.Red == true && _keycolor == Color.Red)
         DoorInteraction();
     if(Main.Player.KeyCheck.Green == true && _keycolor == Color.Green)
         DoorInteraction();
 }

어느정도 코드가 정리되었지만, 이렇게 봐도 중복되는 느낌이 강하고
코드가 아직도 지저분하다는 느낌을 받는다.

그래서 튜터님께 물어본 결과 전략 패턴, 그중에서 상태 패턴의 디자인 패턴을 사용하라고 말씀해주셨다.

인터페이스를 하나 구현하여 위의 작성한 함수 2개를 인터페이스 안에 넣고
자물쇠 마다 클래스를 구현하여 3개의 클래스를 작성하자

이와 같은 패턴으로 작성한다. 다음 글에 이와 같이 작성하는 방법을 사용해볼 것이다.

profile
게임 개발과 기획

0개의 댓글