온보딩 problem2 리팩토링

MINJU·2022년 12월 5일
0
post-thumbnail

문제 2

지난 PR 셀프 리뷰

구현해야하는 기능이 작아서 그런지, 생각보단 더 잘해놨었더라 🙄

problem1 리팩토링과 마찬가지로 MVC 패턴을 적용하고자 노력해봤다!

기능 정의

[ 기능 ]
- [ ] 암호문 입력 받기
- [ ] 중복 문자 인덱스 구하기
- [ ] 해당 인덱스 삭제하기

[ 예외 ] 
- [ ] 암호문 길이가 1이상 1000이하가 아닌 경우
- [ ] 암호문이 알파벳 소문자가 아닌 다른 형식으로 구성된 경우

구현

커밋 로그

crpytogram을 다루는 클래스

일급컬렉션을 활용하고 싶어서, String으로 관리했던 암호문을 Queue를 활용해 관리했다.

일급 컬렉션으로 해당 Queue를 wrapping 했는데, 생성자 주입을 받을 때 밖에서부터 Queue를 주입받을까 고민했지만, 그 부분은 객체 안에서 알아서 생성해주는 것이 맞는 것 같아서 String으로 주입받고, 객체 안에서 Queue로 바꿔주는 과정을 거쳤다.

public class Cryptogram {
    Queue<Character> cryptoCharacters;

    public Cryptogram(String cryptogram) {
        Validator.validateCryptogram(cryptogram);
        cryptoCharacters = new LinkedList<>();
        for (int index = 0; index < cryptogram.length(); index++) {
            cryptoCharacters.add(cryptogram.charAt(index));
        }
    }

    public Queue<Character> getCryptoCharacters() {
        return new LinkedList<>(cryptoCharacters);
    }

    public void updateCryptogram() {
        Queue<Character> tmp = new LinkedList<>();
        Character zero = ' ';
        while (!cryptoCharacters.isEmpty()) {
            Character first = cryptoCharacters.poll();
            Character second = cryptoCharacters.peek();
            if (first != zero && first != second) {
                tmp.add(first);
            }
            zero = first;
        }
        this.cryptoCharacters = tmp;
    }

    public boolean isSameSize(Queue<Character> originCryptoCharacters) {
        return cryptoCharacters.size() == originCryptoCharacters.size();
    }

}

해당 클래스 내부에서 중복 문자를 제거해주는 updateCryptogram() 메소드도 구현했고, 외부 컨트롤러에서 중복 문자열이 남았는지 체킹하기위해 필요한 `isSameSize() 메소드도 구현했다.

근데 Queue를 사용해서 그런지, 인접한 중복 문자열 제거 로직이 조금 복잡해졌다😭

String을 활용해서 겹치는 index를 체킹하는 것이 조금 더 나은 로직이었나?하는 생각이 든다~

사용하는 최종 컨트롤러 메인 로직은 아래와 같다.

    public void run() {
        outputView.printInputGuide();
        Cryptogram cryptogram = getCryptogram();
        updateResult(cryptogram);
        outputView.printResult(cryptogram);
    }

아래는 원래 작성한 solution() 메소드인데,

    public static String solution(String cryptogram) {
        sb = new StringBuilder();
        initDuplicatedIndexList(cryptogram);
        while (duplicatedIndexList.size() > 0) {
            cryptogram = createNewCryptogram(cryptogram);
            addDuplicatedIndex(cryptogram);
        }
        return cryptogram;
    }

해당 메소드가 해야하는 요구사항이 다르지만, 그래도 나름 가독성을 위해 노력한 흔적이 드러나지 않나...! 싶다..!

이전 코드도 나름 괜찮았다고 생각하긴 하지만 ^____^

0개의 댓글