TL;DR: избегайте чрезмерного использования замыканий и функций. Инкапсулируйте их в объекты.
Проблемы
- Ремонтопригодность
- Тестируемость
- Повторное использование кода
- Скрытие реализации
- Отладка
Решения
- Оберните функции/замыкания
- Осуществление алгоритмов с использованием объекта метода / паттерна Стратегия
Образец кода
Неправильный
fun sortFunction( list: MutableList<Int>, fn: (Int, Int) -> Boolean ) { for (i in list.indices) { for (j in 0 until list.size - i - 1) { if (fn(list[j], list[j + 1])) { val temp = list[j] list[j] = list[j + 1] list[j + 1] = temp } } } } fun main() { val scores = mutableListOf(9, 5, 2, 7, 23, 1, 3) sortFunction(scores) { a, b -> a > b } }
Верно
class ElementComparator { fun greaterThen(firstElement: Int, secondElement: Int) = firstElement > secondElement // This is just an example. With more complex objects, // this comparison might not be so trivial... } class BubbleSortStrategy( private val elements: MutableList<Int>, private val comparator: ElementComparator ) { // We have a strategy; we can unit test it, change it to a // polymorphic implementation, or benchmark different algorithms, etc. fun sort() { for (i in elements.indices) { for (j in 0 until elements.size - i - 1) { if (comparator.greaterThen(elements[j], elements[j + 1])) { swap(j) } } } } private fun swap(index: Int) { val temp = elements[index] elements[index] = elements[index + 1] elements[index + 1] = temp } } fun main() { val scores = mutableListOf(9, 5, 2, 7, 23, 1, 3) BubbleSortStrategy(scores, ElementComparator()).sort() }
Заключение
Люди читают код, и, хотя программное обеспечение может выполнять анонимные функции, его ремонтопригодность страдает при использовании нескольких замыканий. Извлекая функциональность в объекты, мы можем улучшить повторное использование кода и удобство сопровождения.
Будьте в курсе моих последних мыслей и идей, подписавшись на мою рассылку новостей. Свяжитесь со мной в LinkedIn или Twitter. Оставайтесь на связи и продолжайте общение!
Кредиты
Первоначально опубликовано на https://yonatankarp.com.