Conversation
| tmpRuleMembers: List<String> | ||
| ): Any? | ||
|
|
There was a problem hiding this comment.
viewModel 보니까 반환 값이 딱히 필요 없는 로직 같아 보여서
Any 말고 Unit 또는 반환 값을 없애도록 바꾸는 것이 좋을 것 같습니다.
자바로 따지면
Any -> Object
Unit -> Void
이런 거라고 알고 있습니다
근데 다시 생각해보니 그냥 안 넣는게 나은 것 같은 기분,,,?
There was a problem hiding this comment.
-
정말 잘아시는군요!! 근데 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.
@murjune
아 통신 실패 시 null 값을 줘서 viewModel에서 null 일 때 에러 처리를 할 수 있겠군요~~
확인입니다~~!
null 값 처리 로직 timber라도 추가해주잉~~
There was a problem hiding this comment.
@KWY0218 네넹!! 와 진짜 피드백 엄청 빠르네 이게 킹원용?! 저도 열심히 코드리뷰할게요~!~!
@KWY0218이거 배워갑니다 👍
| DayDataInfo("목", State.UNSELECT), | ||
| DayDataInfo("금ø", State.UNSELECT), | ||
| DayDataInfo("토", State.UNSELECT), |
| return RulesTableInfo( | ||
| response.data?.keyRules!!.map { it.toRuleInfo() }, | ||
| response.data.rules.map { it.toRuleInfo() } | ||
| ) |
There was a problem hiding this comment.
| 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.
네 알겠습니다!! 가독성 진짜 중요하죵 ㅎ ㅎ ㅎ
| val rulesTodayInfo: RulesTodayInfo? = rulesTodayRepository.getTodayTodayInfoList("") | ||
| rulesTodayInfo?.let { | ||
| Timber.d("RulesViewModel init") |
There was a problem hiding this comment.
rulesTodayInfo가 null일 때 timber를 띄운다는 로직을 추가하면 좋을 것 같습니다.
아직은 에러 처리에 대한 로직이 없지만 추후에 추가한다면
timber 자리에 에러 로직만 추가하면 되기 때문에 와드 같은 역할을 할 것 같습니다
확장함수 추가/**
* 변수 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는 이따 올릴게여 넘 졸려서..