현재 중심이 되는 부분이 문제를 나타낼 수 있는, 문제와 관련있는 파일들이다.
가장 처음에 태그(알고리즘)랑 레벨을 통해서만 문제를 가져왔기 때문에 유스케이스를 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)
}
일단 이렇게 구분을 해놓았다 .. 출처에 대한건 아직 코드를 작성하지 않았는데 이게 올바른 방법인가 ..?
생각을 좀 더 해봐야겟다. ... 따흐흑
아무튼 계속 해야지 .. 해야지 .. 했던 부분을 리팩토링해서 기분이 좋다!
'Android > 랜덤리즘' 카테고리의 다른 글
[랜덤리즘] Fragment와 ViewModel의 책임을 명확하게 하기 (0) | 2024.03.20 |
---|---|
[랜덤리즘] 예외 처리하기, 다이얼로그보다 사용자에게 선택권을 주기 (3) | 2024.03.12 |
[랜덤리즘] 설정화면에서 변경한 값을 다른 화면에서 사용해도 될까? (0) | 2024.02.28 |
[랜덤리즘] 관련 알고리즘 보이기/숨기기 기능 개발하기 -2 (1) | 2024.02.26 |
[랜덤리즘] 관련 알고리즘 보이기/숨기기 기능 개발하기 -1 (0) | 2024.02.23 |