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.