장's 개발생각

[개발생각] 리세마라 : 다시해보는 우테코 5기 4주차

장아장 2022. 12. 13. 16:42

한장 요약 : 이놈(enum)을 잘쓰자

 

Source Code : https://github.com/JangAJang/WoowaCourse_Preview/tree/main/4주차_다리_re

 

사실 시험기간이 겹치며 우테코 문제를 풀고 편하게 블로그를 쓸 여유가 없었다. 

블로그의 대부분의 글을 위해 5분정도 쓰는 내용들을 타이핑하고, 10분 정도 짤을 찾다보니(?) 조급한 시험기간에 글을 쓸 생각을 못하게 된다. 

 

일단 몇가지 스스로 고쳐야 할 사항들을 머리속에 새겨둔 상태였다. 

1. 일급 컬렉션(리스트 같은 변수)은 도메인을 따로 만들어서 그 외의 인스턴스가 없게 하자. 
- 이번 우테코 프리코스를 하며 다른 분들의 이야기를 들어보며 느낀건, List나 HashMap같은 인스턴스가 존재할 때 다른 인스턴스를 만들면 안된다는 이야기도 많았었다. 이 글을 보시면 이해가 빠를거시다. (감사합니다 랜선 센세)

나 같은 경우에는 이전에 풀었을 땐 생각없이 만들면서 일급 컬렉션외에 다른 인스턴스가 존재했었다. 

public class Player {

    private List<String> bridges;
    private int trialCount;

이전의 코드에서 이렇게 인스턴스를 여러개 써버린 것을, 

public class Player {

    List<Boolean> playerAnswers;
public class GameResult {
    private int trialCount;
    private GameStatus gameStatus;

두 개의 도메인으로 나누어 각자 할 일을 하게 했다. 

 

2. 도메인들이 일을 하는데, 최대한 다른 도메인들을 가져가서 일을 하지 않게 만들자. 
- 우아한 테크코스에서도 이야기를 듣고, 다른 곳에서도 이야기를 들었을 때 배운 것은, 도메인을 설계할 때 가장 작은 일 하나씩 나누어 이를 도메인으로 만들고, 이 도메인들이 서로에게 종속적이지 말라고 이야기한다. 

후에 유지보수를 할 때, 연결된 부분들까지 건드려야 하기 때문이다. 

 

기능목록이나 다른 부분들은 소스 코드에 정리되어있으니, 코드 설명은 스킵하겠다. 

 

약간의 특이점은 enum클래스를 최대한 활용해보자는 것이었다. 

public enum GameStatus {

    GOING("R", "성공"), QUIT("Q", "실패");
 

게임 상태의 입력/ 출력을 전부 관리하고 컨트롤러에서 게임을 계속 실행시킬지 정해주는 용도로도 인스턴스가 필요했다. 

이를 enum으로 빼내어 입력을 통해 enum클래스 타입을 바꾸어주는 방식으로 사용했다 .

public enum BridgeStatus {

    UPPER(1, "U"), DOWN(0, "D");

문제를 풀어본 사람들은 알겠지만, 0또는 1의 난수를 생성해 이 값을 U, D로 바꾸어야 한다. 이를 위해 속성들을 묶어 enum클래스로 만들어 사용했다. 

public enum BridgeMakingElements {

    STARTER("[ "),
    FINISHER("]"),
    CORRECT("O "),
    WRONG("X "),
    EMPTY("  "),
    DIVIDER("| ");

사실 이 부분을 이렇게 만들까 말까 고민을 했다. 그래도 만들려고 했던 이유가, 

"enum 클래스를 통해 지저분하게 상수를 계속 생성하고 사용하는 일을 줄일 수 있다. "

라는 장점을 느꼈고, 이를 적용하기 위해서 따로 빼내었다. 

원래 이 문자열들은 (내 코드 기준) BridgeConstructor라는 클래스에서 사용한다. 

다리를 출력문으로 만드는 클래스이다. 

 

여기에서 출력문을 만드는 과정을

  1. 다리의 정답여부
  2. 위 다리인지 아래 다리인지 여부

이를 통해 한 다리당 4개의 경우가 나오고, 이를 길이만큼 반복시켜주어야 한다. 

또한, 정답을 확인해주어야 하고, 정답인 다리가 위 다리인지 아래 다리인지 알려주는 메서드도 필요하다. 

그래서 뺐다. 

모르겠다고?

 

사실 메서드를 분리하는 것도, 상수들의 이름을 대문자로만 쓰는 것도, enum을 이용해 전역으로 사용하는 상수들을 묶는 것도, clean한 코드를 만드는 것이 목적이지 않을까?

 

그래서 최대한 치워버리려고 한다. 

깔끔한게 짱이지...!!