-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
#178 [refact] Rules 멀티 모듈로 Refactoring #179
base: develop
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
전체적으로 아주 잘했네용 😄 😄 😄
궁금한 점
- 좋습니다
- 이건 에러 처리 관련 뷰나 얘기가 나오면 그 때 얘기 해야 될 것 같습니다.
그래야 room의 사용 여부가 결정될 것 같습니다
tmpRuleMembers: List<String> | ||
): Any? | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
viewModel 보니까 반환 값이 딱히 필요 없는 로직 같아 보여서
Any 말고 Unit 또는 반환 값을 없애도록 바꾸는 것이 좋을 것 같습니다.
자바로 따지면
Any -> Object
Unit -> Void
이런 거라고 알고 있습니다
근데 다시 생각해보니 그냥 안 넣는게 나은 것 같은 기분,,,?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
-
정말 잘아시는군요!! 근데 Unit은 void+Void이긴합니당 ㅎ ㅅ ㅎ 여기서는 상관은없지만 ㅋㅋㅋ
관련 블로그 -
저는 RemonteDataSource에서
putTempManagerInfoList
에서 서버 통신에 실패했을 때null
을 보내주어서 null값을 반환 안 할 때만fetchToTodayList()
함수를 호출하도록 로직을 구현했습니다. 하지만, Unit은 Non-Null타입이기 때문에 Any?을 반환타입으로 잡았습니다. -
다른 put하는 함수에서는 모두 반환값을 없앴습니당!! 이 경우만 특수한 경우라 Any?타입으로 잡았네용
-
RemoteDataSourceIml
override suspend fun putTempManagerInfoList(
roomId: String,
ruleId: String,
tmpRuleMembers: TempManagerRequest
): Any? {
return runCatching {
rulesApi.putTempManagerInfoList(
ROOM_ID,
ruleId,
tmpRuleMembers
)
}.fold(
{}, {
Timber.e(it.message)
null // failure일 때 null 반환
}
)
}
- Repository
override suspend fun putTempManagerInfoList(
roomId: String,
ruleId: String,
tmpRuleMembers: List<String>
): Any? {
return remoteRulesTodayDataSource.putTempManagerInfoList(
roomId,
ruleId,
TempManagerRequest(tmpRuleMembers)
)
}
- viewModel
viewModelScope.launch {
rulesTodayRepository.putTempManagerInfoList(
"",
_todayTodoList.value!![tmpTodayToDoPosition.value!!].id,
clickedTmpManagerList
)?.let { fetchToTodayToDoList() }
// null이 아닐 떄만 fetchToTodayToDoList() 호출
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@murjune
아 통신 실패 시 null 값을 줘서 viewModel에서 null 일 때 에러 처리를 할 수 있겠군요~~
확인입니다~~!
null 값 처리 로직 timber라도 추가해주잉~~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@KWY0218 네넹!! 와 진짜 피드백 엄청 빠르네 이게 킹원용?! 저도 열심히 코드리뷰할게요~!~!
@KWY0218
이거 배워갑니다 👍
DayDataInfo("목", State.UNSELECT), | ||
DayDataInfo("금ø", State.UNSELECT), | ||
DayDataInfo("토", State.UNSELECT), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이거 금요일 옆에 저건 뭔가요,,,?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
엇?? 이게 왜들어갔지
return RulesTableInfo( | ||
response.data?.keyRules!!.map { it.toRuleInfo() }, | ||
response.data.rules.map { it.toRuleInfo() } | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return RulesTableInfo( | |
response.data?.keyRules!!.map { it.toRuleInfo() }, | |
response.data.rules.map { it.toRuleInfo() } | |
) | |
return RulesTableInfo( | |
response.data?.keyRules!!.map { keyRulesList -> keyRulesList.toRuleInfo() }, | |
response.data.rules.map { rulesList -> rulesList.toRuleInfo() } | |
) |
우리 가독성을 위해 it 사용을 지양해 봅시다..!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
네 알겠습니다!! 가독성 진짜 중요하죵 ㅎ ㅎ ㅎ
val rulesTodayInfo: RulesTodayInfo? = rulesTodayRepository.getTodayTodayInfoList("") | ||
rulesTodayInfo?.let { | ||
Timber.d("RulesViewModel init") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rulesTodayInfo가 null일 때 timber를 띄운다는 로직을 추가하면 좋을 것 같습니다.
아직은 에러 처리에 대한 로직이 없지만 추후에 추가한다면
timber 자리에 에러 로직만 추가하면 되기 때문에 와드 같은 역할을 할 것 같습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오호라~!~! 알겠씁니당
확장함수 추가/**
* 변수 2가지 이상 null 체크할 때 사용 */
inline fun <T1 : Any, T2 : Any, R : Any> safeLet(p1: T1?, p2: T2?, block: (T1, T2) -> R?): R? {
return if (p1 != null && p2 != null) block(p1, p2) else null
} 예시todayTodoList.value?.let { todayTodoList ->
tmpTodayToDoPosition.value?.let { tmpTodayToDoPosition ->
val id = todayTodoList[tmpTodayToDoPosition].id
rulesTodayRepository.putTempManagerInfoList(
"",
id,
clickedTmpManagerList
)
safeLet(todayTodoList.value, tmpTodayToDoPosition.value) {
todayTodoList: List<RuleInfo>, position: Int ->
rulesTodayRepository.putTempManagerInfoList(
"",
todayTodoList[position].id,
clickedTmpManagerList
)
} |
@murjune 바이럴 한번 하자면 stateFlow는 초기값이 무조건 들어가야 돼서 요런 일이 안 생긴답니다. 마지막으로 릴리즈 레포에서는 확장 함수 위에 전에 올려준 근데 생각해 보니까 릴리즈 레포가 private이라서 wiki는 못 쓸 거 같네요... 작업 하시느라 수고하셨습니다~ 👍 |
맞다!! kdocs양식 까먹었네유 ㅜㅜ |
작업 개요
작업 설명
1) Timber 추가
TimberDebugTree
추가 후, Timber를 사용할 수 있도록 함참고블로그.
2) ApiModule
3) 멀티 모듈화.
궁금한점
이렇게 처리해준 이유는 만약 나중에 저희가 Room을 도입하게 된다면, Repository의 코드길이가 너무 늘어날 것 같아서입니당
UseCase는 이따 올릴게여 넘 졸려서..