У Котлина есть возможность стать Крысоловом для вашего творчества. Лично для меня Расширения и Функции высшего порядка - это функции, которые сделали программирование на Kotlin восхитительным. Это заставило меня по-другому взглянуть на проблемы.

Расширения позволяют нам расширять класс без накладных расходов на инициализацию конструкторов или реализацию методов. Это заставляет нас сосредоточиться на создании пользовательских функций поверх выбранного нами класса, полностью устраняя необходимость в служебных классах.

Например, предположим, что у нас есть переменная, в которой имена наших пользователей хранятся в виде значений имени и фамилии, разделенных запятыми. Как мы можем использовать расширения, чтобы строковые переменные могли получать информацию о наших пользователях?

getUser () - это функция расширения. Префикс имени функции сообщает нам, что мы расширяем объект String, позволяя нам использовать метод split String внутри тела нашей функции. Кроме того, все объекты String могут вызывать этот метод.

Функции высшего порядка позволяют нам написать функцию, которая принимает функцию в качестве параметра. Это упрощает написание * вставки логики здесь *, особенно полезно при определении повторяющегося шаблона, который раньше был громоздким (👋 Интерфейсы!).

Например, сотрудник должен пройти оценку, чтобы получить повышение. Сотрудника оценит отдел кадров и его руководитель. Оценщики будут иметь свои собственные оценочные баллы и критерии с общим порогом, чтобы определить, повышен ли сотрудник по службе или нет.

isPromotableEmployee () не беспокоится о реализации скоринга, поскольку он делегировал ответственность оценивать. Однако он ориентирован на сравнение оценочного балла с порогом, позволяющим функции назначить сотрудника как способного продвигаться по службе.

Мы можем еще больше улучшить это, введя расширения; Функции расширения и Функциональные литералы с приемниками. Функции Литералы с получателями аналогичны функциям расширения с ключевым отличием на уровне абстракции. Функция расширения требует, чтобы у вас было конкретное определение функции, в то время как последняя позволяет вам определить функцию высшего порядка для класса, на котором вы строите.

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

Следовательно, функции высшего порядка позволяют писать код, избегая любой внутренней зависимости, то есть версии управления.

Приступаем к сути нашего обсуждения; API базы данных на Android многословен, особенно Курсор. Если подумать, мы, по сути, делаем то же самое при запросе данных с небольшими отличиями.

Каждая транзакция базы данных включает следующие шаги:

  1. Инициализируйте свой экземпляр базы данных,
  2. Напишите запрос к базе данных,
  3. Получите соответствующий курсор,
  4. Перебрать курсор; проверяя размер курсора,
  5. Отображение информации из курсора на объект,
  6. Закрытие курсора и
  7. Закрытие базы данных.

Только шаги 2 и 5 будут иметь разные реализации во всем приложении. Большой вопрос сейчас в том, можем ли мы написать на Kotlin многоразовую функцию общего назначения для решения этой проблемы?

Давайте посмотрим, что стандартная библиотека Kotlin может предложить в использовании, которая является функцией расширения для интерфейса Closable. use принимает функцию более высокого порядка в качестве параметра для * вставки логики *, обеспечивая при этом закрытие объекта Closable и возвращение методом желаемого результата.

По совпадению и SQLiteDatabase, и Cursor являются закрываемыми реализациями. С use наши запросы к базе данных могут выглядеть следующим образом:

Нам не нужно беспокоиться о закрытии ни курсора, ни базы данных; use делает это за нас. Напротив, сейчас в нашем коде есть странное это. Это it относится к параметру внутри нашей функции высшего порядка. Когда мы впервые используем базу данных, это относится к базе данных; когда мы используем курсор, он относится к курсору. Однако зачем использовать это, когда мы можем добавлять приемники?

Вы действительно начинаете ценить влияние приемников на плавность кода. Ушли в прошлое it s; доступ к методу теперь беспрепятственный.

Сейчас наша цель - создать абстрактную реализацию того, что мы только что сделали. Начнем с шага 5. Отображение информации из курсора на объект. Вы ожидаете, что вам вернут объект или список объектов.

Логика отображения здесь будет функцией высшего порядка, а для курсора останется только определить логику итерации.

Функция встроена, чтобы уменьшить влияние выделения памяти в результате использования функций высшего порядка.

Переходим к шагу 2; Напишите запрос к базе данных, что является довольно простой задачей.

Эта реализация дополняет шаг 5; он дает вам ваш объект или объекты.

Наконец, наши обращения к базе данных отфильтровываются от всего шума. В целом у нас теперь есть сфокусированный и гибкий синтаксис.

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

Убирайся и Котлин все вещи 😊