[24.07.19] TIL - 036

🎧 0. 오늘의 추천곡

공부가 끝나고 난 후...

📗 1. 레포지토리 패턴 적용

오늘은 레포지토리 패턴을 기존 과제(주소록)에 적용시켜보았습니다.

코드가 너무 많아서 적용한 방법을 설명하기만 하겠습니다.

먼저, 기본적인 데이터를 contactList를 통해 받아옵니다.

이 과정에서 loadContactData로 연락처 목록을 받아오게 됩니다.

그리고, 이 기본적인 데이터들을 DataSource라는 오브젝트로 이런 기본적인 데이터들의 집합을 가져옵니다.

그리고 getContactList() 함수를 통해 이 데이터들을 가져옵니다.

이후, 이 데이터들을 레포지토리를 거쳐서 정제 과정을 거칩니다.

이때, 레포지토리 클래스에 DataSource 의존성 주입을 합니다.

그리고 그 레포지토리 인스턴스를 뷰모델에서 의존성 주입을 하고, 뷰모델 팩토리로 뷰모델 객체를 받아옵니다.

아직 완벽하게 적용시키진 못했지만, 일단 뷰모델 코드만 올려보겠습니다.

package com.android.nbc_c_assignment1.challenge4_1.presentation.main

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewmodel.CreationExtras
import com.android.nbc_c_assignment1.challenge4_1.data.database.DataSource
import com.android.nbc_c_assignment1.challenge4_1.data.entity.ContactListDataEntity
import com.android.nbc_c_assignment1.challenge4_1.data.repository.ContactListRepositoryImpl
import com.android.nbc_c_assignment1.challenge4_1.presentation.model.ContactListDataModel
import com.android.nbc_c_assignment1.challenge4_1.presentation.repository.ContactListRepository

class ContactListViewModel(private val contactListRepository: ContactListRepository) : ViewModel() {

    private val _contactListData = MutableLiveData<List<ContactListDataModel>>()
    val contactListData: LiveData<List<ContactListDataModel>> get() = _contactListData

    fun setContactListData() {
        _contactListData.value = contactListRepository.getContactList().sortModel()
    }

    fun setFavorite(position: Int) {
        val isFavorite = contactListData.value?.get(position)?.isFavorite
        changeFavorite(position, isFavorite ?: false)
    }

    private fun changeFavorite(position: Int, isFavorite: Boolean) {
        _contactListData.value = contactListData.value?.mapIndexed { index, item ->
            if(position == index) {
                ContactListDataModel(
                    item.img,
                    item.name,
                    item.phoneNumber,
                    !isFavorite
                )
            } else {
                ContactListDataModel(
                    item.img,
                    item.name,
                    item.phoneNumber,
                    item.isFavorite
                )
            }
        }?.sortModel()
    }

    private fun List<ContactListDataModel>.sortModel(): List<ContactListDataModel> {
        return this.sortedWith(
            compareBy(
                { !it.isFavorite },
                { it.name },
            )
        )
    }
    fun getList() = contactListData.value
}

class ContactListViewmodelFactory: ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
        return ContactListViewModel(
            ContactListRepositoryImpl(DataSource)
        ) as T
    }
}

🎯 2. 끝

내일도 열심히 공부해서 저 패턴을 완성하고 싶습니다...

끝.

profile
여기는 공부 기록용 블로그

0개의 댓글