Не создавайте каждый раз valueEventListener - PullRequest
0 голосов
/ 27 февраля 2020

Как я могу оптимизировать свой код? В каждой функции я создал valueEventListener.

Вот весь код:

class TargetsPresenter(private val contract: SelectTargetViewContract) {

    var firebaseUser: FirebaseUser? = null
    var targetList: ArrayList<Goal> = ArrayList()
    private var databaseReference: DatabaseReference? = null
    private var targetsRef: DatabaseReference? = null
    private var uid: String? = null

    fun setInitialData() {
        firebaseUser = FirebaseAuth.getInstance().currentUser
        databaseReference = FirebaseDatabase.getInstance().reference
        uid = firebaseUser?.uid
        targetsRef = databaseReference?.child("targets")
            ?.child("users")?.child(uid.toString())
            ?.child("targets")
    }

    fun getTargetsFromDb() {
        val valueEventListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                targetList.clear()
                dataSnapshot.children
                    .mapNotNull { it.getValue(Goal::class.java) }
                    .toCollection(targetList)
                contract.updateViewContent()
            }

            override fun onCancelled(databaseError: DatabaseError) {
                Log.d("some", "Error trying to get targets for ${databaseError.message}")
            }
        }
        targetsRef?.addListenerForSingleValueEvent(valueEventListener)
    }

    fun getTargetsByPriority() {
        val valueEventListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                targetList.clear()
                dataSnapshot.children
                    .mapNotNull { it.getValue(Goal::class.java) }
                    .sortedBy { it.priority }
                    .toCollection(targetList)
                contract.updateViewContent()
            }

            override fun onCancelled(databaseError: DatabaseError) {
                Log.d("some", "Error trying to get targets for ${databaseError.message}")
            }
        }
        targetsRef?.addListenerForSingleValueEvent(valueEventListener)
    }

    fun getTargetsByDeadline() {
        val valueEventListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                targetList.clear()
                dataSnapshot.children
                    .mapNotNull { it.getValue(Goal::class.java) }
                    .sortedBy { it.deadline }
                    .toCollection(targetList)
                contract.updateViewContent()
            }

            override fun onCancelled(databaseError: DatabaseError) {
                Log.d("some", "Error trying to get targets for ${databaseError.message}")
            }
        }
        targetsRef?.addListenerForSingleValueEvent(valueEventListener)
    }
}

1 Ответ

1 голос
/ 27 февраля 2020

Оптимизация - неправильное слово для описания проблемы. Проблема заключается в повторении идентичного кода (нарушающего принцип DRY), что может быть проблемой, потому что оно вызывает ошибку, если вам нужно что-то изменить, и это менее читабельно.

В этом случае это не экстремально, но я думаю, что это может быть несколько улучшено. Вы можете объявить реализацию класса слушателя, который принимает параметр для сортировки списка.

class TargetsPresenter(private val contract: SelectTargetViewContract) {

    //...

    fun getTargetsFromDb() {
        targetsRef?.addListenerForSingleValueEvent(MyValueEventListener<String>())
    }

    fun getTargetsByPriority() {
        targetsRef?.addListenerForSingleValueEvent(MyValueEventListener(Goal::priority))
    }

    fun getTargetsByDeadline() {
        targetsRef?.addListenerForSingleValueEvent(MyValueEventListener(Goal::deadline))
    }

    private inner class MyValueEventListener<R: Comparable<R>>(
        private val sortCriteria: (Goal) -> R? = { null }
    ) : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            targetList.clear()
            dataSnapshot.children
                .mapNotNull { it.getValue(Goal::class.java) }
                .sortedBy(sortCriteria)
                .toCollection(targetList)
            contract.updateViewContent()
        }

        override fun onCancelled(databaseError: DatabaseError) {
            Log.d("some", "Error trying to get targets for ${databaseError.message}")
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...