본문 바로가기

Android/랜덤리즘

[랜덤리즘] 중복된 코드를 1개의 코드로 리팩토링하기

현재 중심이 되는 부분이 문제를 나타낼 수 있는, 문제와 관련있는 파일들이다.

가장 처음에 태그(알고리즘)랑 레벨을 통해서만 문제를 가져왔기 때문에 유스케이스를 GetProblemsByTag, GetProblemsByLevel 2개로만 만들었었다. 

그런데 2개 + 새로 만든 기능까지하면 유스케이스가 너무 많아지는데 이 코드가 똑같다는 점이 문제...다 ..

똑같은 코드인데 계속해서 새로 만들어 ..? 이건 아닌 것 같아서 수정해야겠다고 생각했다.

 

데이터 흐름 (리팩토링 전)

리팩토링하기 전의 데이터 흐름을 나타내면 아래와 같다.

 

 


리팩토링을 해야겠다고 생각하게 된 계기

기존에 있던 태그(알고리즘), 레벨을 통해서 가져오는 것 외에도 문제를 가져오는 경우가 추가적으로 더 생겼기 때문이다. (안그래도 중복되는 코드인데 ..)

1. 태그(알고리즘) -> 레벨을 선택하는 경우

2. 문제 출처를 통해 문제를 가져오는 경우

 

그런데 api 주소를 잘 살펴보니 변화가 있는 곳은 딱 1곳임을 알게되었다.

 

 

초록색으로 표시한 부분을 제외하면 모두 똑같다는 것을 알게되었다.

그리고 네트워크로부터 응답받는 형식은 모두 똑같았기에 응답받은 데이터 -> 화면에 보여줄 데이터로 변환하는 부분이 중복되어 있었다.


어떻게 수정하였는가?

중복되는 되지 않는 부분(태그, 레벨, 출처)은 ViewModel 에서 가공하여 UseCase의 인자로 넘겨주는 형태로 아래와 같이 수정해주었다.

 

// ProblemViewModel.kt

fun getProblemByTagAndLevel(tag: String, level: Int) {
    val replaceLevel = when (level) {
        0 -> "b"
        1 -> "s"
        2 -> "g"
        3 -> "p"
        4 -> "d"
        else -> "r"
    }
    val query = "%23$tag+*$replaceLevel"

    viewModelScope.launch { 
        try {
            _problems.value = getProblemsUseCase(query)
        } catch (exception: Exception) { ... }
    }
}

 

GetProblems ... 하고 시작했던 4개의 함수들은 GetProblemsUseCase 의 이름으로 통합시켜주었다!


데이터 흐름 (리팩토링 후)

리팩토링 전보다는 많이 간결해진 것 같다!


그런데 여기서 또 한가지 문제가 발생했다 ..

태그, 레벨, 문제 출처를 ProblemFragment 의 argument 로 넣어주어 생성하고 있는데 이것을 ... 어떻게 구분할지?

아악! 하지만 생각해봐야겠지.. 요 ..

 

// ProblemFragment.kt

arguments?.let {
    currentTag = it.getString("tag")
    currentLevel = it.getInt("level")
}

currentTag?.let { tag ->
    currentLevel?.let {  level ->
        // 태그(알고리즘) 문제를 가져오는 경우
        if (level == -1) problemViewModel.getProblemsByTag(tag)
        // 태그+레벨 문제를 가져오는 경우
        else problemViewModel.getProblemByTagAndLevel(tag, level)
    }
} ?: currentLevel?.let { level ->
    // 레벨 문제를 가져오는 경우
    problemViewModel.getProblemsByLevel(level)
}

 

일단 이렇게 구분을 해놓았다 .. 출처에 대한건 아직 코드를 작성하지 않았는데 이게 올바른 방법인가 ..?

생각을 좀 더 해봐야겟다. ... 따흐흑 

 

 

아무튼 계속 해야지 .. 해야지 .. 했던 부분을 리팩토링해서 기분이 좋다!