오늘은 Kotlin 코드를 리팩토링하여 더 간결하고 명확하게 만드는 방법을 공유하고자 합니다. 주제로는 filterIsInstance와 firstOrNull을 사용하여 객체를 찾고 처리하는 방법을 다루겠습니다.
변경 전 코드
먼저, 기존의 toggleLike 함수 코드는 아래와 같았습니다.
fun toggleLike() {
val currentItems = _items.value.toMutableList()
val profileImagesIndex = currentItems.indexOfFirst { it is ProfileDetailModel.ProfileImages }
if (profileImagesIndex != -1) {
val profileImages = currentItems[profileImagesIndex] as ProfileDetailModel.ProfileImages
val isCurrentLiked = profileImages.isLiked
val updateProfileImages = profileImages.copy(
likeCount = if (isCurrentLiked) profileImages.likeCount - 1 else profileImages.likeCount + 1,
isLiked = !isCurrentLiked
)
currentItems[profileImagesIndex] = updateProfileImages
_items.value = currentItems
}
}
이 코드는 ProfileImages 인스턴스를 찾고 해당 인스턴스의 likeCount와 isLiked 값을 토글합니다. 하지만, 더 간결하고 명확하게 작성할 수 있는 방법이 있습니다.
변경 후 코드
새로운 코드는 filterIsInstance와 firstOrNull을 사용하여 개선되었습니다.
fun toggleLike() {
val currentItems = _items.value.toMutableList()
val profileImages = currentItems.filterIsInstance<ProfileDetailModel.ProfileImages>().firstOrNull()
profileImages?.let { item ->
val isCurrentLiked = item.isLiked
val updatedProfileImages = item.copy(
likeCount = if (isCurrentLiked) item.likeCount - 1 else item.likeCount + 1,
isLiked = !isCurrentLiked
)
val index = currentItems.indexOf(item)
if (index != -1) {
currentItems[index] = updatedProfileImages
_items.value = currentItems
}
}
}
개선된 부분 설명
- 객체 찾기:
- 변경 전: indexOfFirst를 사용하여 ProfileImages 객체의 인덱스를 찾고, 해당 인덱스를 통해 객체에 접근했습니다.
- 변경 후: filterIsInstance<ProfileDetailModel.ProfileImages>().firstOrNull()를 사용하여 리스트에서 ProfileImages 객체를 직접 찾습니다. 이렇게 하면 코드가 더 간결해지고, 타입 캐스팅을 피할 수 있습니다. - 존재 여부 확인:
- 변경 전: 인덱스 값이 -1인지 확인하여 객체의 존재 여부를 판단했습니다.
- 변경 후: firstOrNull()의 결과가 null인지 확인하여 객체의 존재 여부를 판단합니다. 이는 더 Kotlin-idiomatic한 방식입니다. - 객체 업데이트:
- 변경 전: 찾은 인덱스를 이용해 리스트에서 객체를 업데이트했습니다.
- 변경 후: filterIsInstance를 사용하여 찾은 객체의 인덱스를 다시 찾아 업데이트합니다.
결론
이번 리팩토링으로 toggleLike 함수가 더 간결하고 이해하기 쉬워졌습니다.
filterIsInstance와 firstOrNull을 사용하여 리스트에서 특정 타입의 객체를 안전하게 찾고 처리하는 방법을 알게 되었고,
이를 통해 코드의 가독성과 유지보수성이 크게 향상 됨을 느낄 수 있었습니다.
반응형
'Projects > ATeen' 카테고리의 다른 글
[Android/Kotlin] open 메서드를 활용한 다형성 구현 (2) | 2024.08.26 |
---|---|
[Android] AppBarLayout에 그림자가 생기는 문제 해결 방법 (0) | 2024.07.25 |