Что пишут на kotlin

Что пишут на kotlin

Kotlin применяется для разработки мобильных, серверных, десктопных и web-приложений. Он полностью совместим с Java и поддерживается большинством популярных фреймворков. Благодаря этому язык используют как в новых проектах, так и для модернизации существующих решений.

Для Android Kotlin стал официальным языком разработки с 2017 года. Подавляющее большинство современных мобильных приложений на платформе создаются именно на нём. Jetpack Compose, архитектурные компоненты, coroutines – всё это позволяет быстро создавать интерфейсы, обрабатывать асинхронные задачи и уменьшать объём шаблонного кода.

На сервере Kotlin работает с Ktor, Spring Boot и Micronaut. Ktor подходит для написания легковесных REST API и микросервисов. Spring Boot с Kotlin удобен в крупных системах, особенно если требуется интеграция с Java-кодом. Kotlin DSL позволяет писать конфигурации и роутинг без XML и аннотаций, что упрощает сопровождение.

Для десктопных приложений используется Kotlin/JavaFX или Kotlin Multiplatform. Первый вариант подходит, если необходима традиционная GUI-программа под Windows, macOS или Linux. Второй позволяет писать логику, которую можно использовать на разных платформах, включая мобильные и web-интерфейсы.

Kotlin/JS применяют для создания web-приложений. Он позволяет писать клиентскую часть на том же языке, что и сервер, и использовать библиотеки типа React через Kotlin wrappers. Это снижает порог входа для команд, работающих на Kotlin, и уменьшает дублирование логики между фронтендом и бэкендом.

Отдельный интерес представляет Kotlin Multiplatform. С его помощью можно писать общую бизнес-логику для Android, iOS, Web и Desktop. Примеры – синхронизация данных, работа с сетью, форматирование, хранение и валидация. Такая модель позволяет ускорить разработку и упростить тестирование.

Создание REST API с использованием Ktor

Создание REST API с использованием Ktor

Для начала необходимо добавить зависимости в файл build.gradle.kts:

dependencies {
implementation("io.ktor:ktor-server-core:2.3.7")
implementation("io.ktor:ktor-server-netty:2.3.7")
implementation("io.ktor:ktor-server-content-negotiation:2.3.7")
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")
}

Базовая настройка сервера включает подключение Netty-движка, конфигурацию маршрутов и сериализации. Пример инициализации:

fun main() = embeddedServer(Netty, port = 8080) {
install(ContentNegotiation) {
json()
}
routing {
route("/api") {
get("/status") {
call.respond(mapOf("status" to "ok"))
}
}
}
}.start(wait = true)

Для структурирования кода рекомендуется выносить обработчики в отдельные функции или классы. Валидацию входящих данных удобно реализовывать с помощью kotlinx.serialization и пользовательских проверок. Пример DTO:

@Serializable
data class UserRequest(val name: String, val age: Int)

Обработка POST-запроса с телом запроса:

post("/users") {
val user = call.receive<UserRequest>()
if (user.age < 0) call.respond(HttpStatusCode.BadRequest, "Возраст не может быть отрицательным")
else call.respond(HttpStatusCode.Created, user)
}

Для тестирования можно использовать curl, Postman или Ktor Client. Ktor также поддерживает подключение JWT, CORS, логирование и работу с базами данных через Koin, Exposed или другие библиотеки.

Проект легко масштабируется за счёт модулей и собственной DSL. Для разработки крупных REST API удобно использовать слои: маршруты, сервисы, репозитории и модели данных.

Разработка телеграм-бота на Kotlin с библиотекой Kotlin Telegram Bot

Библиотека kotlin-telegram-bot предоставляет прямой доступ к Bot API и хорошо интегрируется с Kotlin-корутинами. Для начала требуется создать Telegram-бота через BotFather и получить токен.

  • Добавьте зависимость в Gradle: implementation("io.github.kotlin-telegram-bot.kotlin-telegram-bot:telegram:6.1.0")
  • Создайте объект Bot с использованием токена и обработчиков событий.
val bot = bot {
token = "ВАШ_ТОКЕН"
dispatch {
command("start") {
bot.sendMessage(chatId = message.chat.id, text = "Бот запущен")
}
message {
bot.sendMessage(chatId = message.chat.id, text = "Вы сказали: ${message.text}")
}
}
}

Для запуска бота используйте:

fun main() {
bot.startPolling()
}

Если требуется асинхронная обработка, можно обернуть обработчики в корутины и использовать runBlocking или CoroutineScope с нужным диспетчером.

Дополнительно:

  • Поддерживаются inline-кнопки через InlineKeyboardMarkup
  • Можно обрабатывать фото, документы и другие типы сообщений
  • Для хранения состояния удобно использовать Map с chatId в качестве ключа

Библиотека активно обновляется, имеет открытый исходный код и пригодна для создания как простых, так и сложных Telegram-ботов.

Написание Android-приложения с архитектурой MVVM

MVVM (Model-View-ViewModel) позволяет разделить бизнес-логику, отображение и управление состоянием. Это упрощает тестирование, сопровождение и масштабирование Android-приложений на Kotlin.

  • ViewModel – класс, наследуемый от ViewModel из Android Architecture Components. Он не должен ссылаться на Android-контекст. Данные хранятся в LiveData или StateFlow.
  • ViewActivity или Fragment. Наблюдает за LiveData из ViewModel и обновляет UI. Обработка пользовательского ввода делегируется ViewModel.
  • Model – слой, содержащий бизнес-логику и доступ к данным (например, через Retrofit, Room или DAO-интерфейсы).

Пример реализации ViewModel:

class UserViewModel(private val repository: UserRepository) : ViewModel() {
private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>> get() = _users
fun loadUsers() {
viewModelScope.launch {
_users.value = repository.fetchUsers()
}
}
}

В Activity или Fragment:

viewModel.users.observe(viewLifecycleOwner) { userList ->
adapter.submitList(userList)
}

Рекомендации:

  1. Передавайте зависимости через конструктор ViewModel с использованием Hilt или Koin.
  2. Для управления состоянием используйте StateFlow вместо LiveData, если требуется более точный контроль.
  3. Избегайте бизнес-логики в ViewModel – она должна быть в Model-слое (например, в UseCase или Repository).
  4. Изолируйте внешние источники данных через интерфейсы. Это упрощает тестирование и замену реализаций.
  5. Для асинхронных операций используйте viewModelScope и Dispatchers.IO.

MVVM в связке с Kotlin-корутинами, Room и DataBinding/Jetpack Compose позволяет добиться высокой читаемости и контроля над архитектурой приложения без избыточной связности компонентов.

Разработка CLI-утилит с использованием Kotlin и kotlinx.cli

Библиотека kotlinx.cli предоставляет строго типизированный способ описания аргументов командной строки. Она включена в набор официальных Kotlin Multiplatform-библиотек и подходит как для JVM, так и для Native-платформ.

Для начала потребуется зависимость в Gradle-проекте:

dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-cli:0.3.6")
}

Основная структура утилиты включает наследование от CliktCommand и определение параметров через делегаты option и argument. Пример простейшей утилиты для копирования файла:

import kotlinx.cli.*
fun main(args: Array<String>) {
val parser = ArgParser("copy-tool")
val source by parser.argument(ArgType.String, description = "Путь к исходному файлу")
val target by parser.argument(ArgType.String, description = "Путь назначения")
parser.parse(args)
val input = java.io.File(source)
val output = java.io.File(target)
input.copyTo(output, overwrite = true)
}

Допустим, требуется реализовать опции флагов: например, --verbose. Это делается через:

Для организации нескольких подкоманд используется метод subcommands. Это позволяет разделять функциональность, как в утилитах git или docker:

val parser = ArgParser("my-tool")
parser.subcommands(BuildCommand(), CleanCommand())
parser.parse(args)

Kotlinx.cli не требует отражения и подходит для статической компиляции, что делает её удобной для использования с Kotlin/Native. Можно собирать утилиты для Linux, Windows и macOS без внешних зависимостей.

Рекомендуется явно указывать типы аргументов и использовать делегаты с required() или default(), чтобы избежать непредсказуемого поведения при отсутствии значений. Для тестирования CLI-утилит удобно использовать массивы аргументов и unit-тесты с параметрами.

Интеграция Kotlin-приложения с базой данных через Exposed


dependencies {
implementation("org.jetbrains.exposed:exposed-core:0.45.0")
implementation("org.jetbrains.exposed:exposed-dao:0.45.0")
implementation("org.jetbrains.exposed:exposed-jdbc:0.45.0")
implementation("org.postgresql:postgresql:42.6.0") // пример для PostgreSQL
}

Настройка подключения к базе данных:


Database.connect(
url = "jdbc:postgresql://localhost:5432/testdb",
driver = "org.postgresql.Driver",
user = "user",
password = "password"
)

Пример описания таблицы с использованием DSL:


object Users : Table() {
val id = integer("id").autoIncrement()
val name = varchar("name", 50)
val email = varchar("email", 100)
override val primaryKey = PrimaryKey(id)
}

Инициализация таблицы:


transaction {
SchemaUtils.create(Users)
}

Добавление записи:


transaction {
Users.insert {
it[name] = "Андрей"
it[email] = "andrey@example.com"
}
}

Чтение данных:


transaction {
Users.selectAll().forEach {
println("${it[Users.id]}: ${it[Users.name]}, ${it[Users.email]}")
}
}

Обновление строки:


transaction {
Users.update({ Users.id eq 1 }) {
it[name] = "Иван"
}
}

Удаление строки:


transaction {
Users.deleteWhere { Users.id eq 1 }
}

Для масштабируемых проектов стоит использовать DAO-реализацию. Пример:


object Articles : IntIdTable() {
val title = varchar("title", 100)
}
class Article(id: EntityID) : IntEntity(id) {
companion object : IntEntityClass
(Articles) var title by Articles.title }

Использование DAO:


transaction {
val article = Article.new {
title = "Новая статья"
}
article.title = "Обновлённый заголовок"
article.delete()
}

Exposed удобно интегрируется с Ktor, Spring Boot и другими фреймворками. Для корректной работы в асинхронной среде следует использовать отдельный dispatcher и избегать запуска транзакций вне блоков withContext(Dispatchers.IO) или newSuspendedTransaction.

Создание десктопного интерфейса с Jetpack Compose for Desktop

Jetpack Compose for Desktop позволяет разрабатывать нативные интерфейсы на Kotlin без использования XML или сторонних UI-фреймворков. Библиотека поддерживает Windows, macOS и Linux, предоставляя единый API.

Для начала необходимо добавить зависимость в Gradle-файл:

dependencies {
implementation(compose.desktop.currentOs)
}

Главная точка входа – функция application { } из модуля org.jetbrains.compose. Внутри неё создаются окна с помощью Window. Пример:

fun main() = application {
Window(onCloseRequest = ::exitApplication, title = "Пример") {
AppContent()
}
}

Интерфейс формируется с использованием декларативного подхода. Элементы описываются как функции с состоянием. Вместо Swing или JavaFX используются компоненты Button, TextField, Row, Column и др.

Для управления состоянием применяется mutableStateOf и remember. Пример поля ввода с состоянием:

@Composable
fun AppContent() {
var text by remember { mutableStateOf("") }
Column {
TextField(value = text, onValueChange = { text = it })
Text("Введено: $text")
}
}

Для разметки используется Modifier. Он позволяет задавать отступы, размеры, обработчики событий. Например:

Button(
onClick = { println("Нажато") },
modifier = Modifier.padding(8.dp)
) {
Text("Нажми")
}

Поддерживаются темы, иконки, кастомные шрифты, локализация и работа с системным буфером обмена. Также доступны Canvas, Drag&Drop, доступ к файловой системе и горячие клавиши.

Jetpack Compose for Desktop активно развивается и интегрируется с Gradle Multiplatform, что упрощает совместное использование кода между Android и десктопом.

Разработка микросервисов на Kotlin с использованием Spring Boot

При создании микросервисной архитектуры на Kotlin чаще всего выбирают Spring Boot благодаря его интеграции с Spring Cloud, поддержке реактивного программирования и возможности настройки через аннотации. Kotlin добавляет лаконичность и снижает вероятность ошибок за счёт строгой типизации и расширенных возможностей стандартной библиотеки.

Для запуска минимального микросервиса достаточно зависимости spring-boot-starter-web и настройки @RestController. Kotlin позволяет использовать функции верхнего уровня, упрощая структуру проекта. Например, инициализацию контроллера можно выполнить без лишнего шаблонного кода.

Сборка проекта обычно осуществляется через Gradle с использованием Kotlin DSL. Это облегчает конфигурацию и делает скрипт более читаемым. Пример подключения зависимостей:

build.gradle.kts

dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}

Для взаимодействия между сервисами рекомендуется использовать OpenFeign или WebClient. Kotlin-корутины позволяют эффективно обрабатывать асинхронные вызовы, снижая задержки без усложнения кода. Пример вызова через WebClient с использованием корутин:

suspend fun fetchData(): Response = webClient
.get()
.uri("/api/data")
.retrieve()
.bodyToMono<Response>()
.awaitSingle()

Для конфигурации и балансировки часто используют Spring Cloud с Eureka или Consul. Kotlin совместим с этими инструментами без дополнительных настроек. Для безопасной передачи данных стоит применять Spring Security в связке с JWT или OAuth2, используя библиотеку spring-security-oauth2-resource-server.

Тестирование можно реализовать с помощью JUnit5 и KotlinTest. Поддержка аннотаций Spring сохраняется, при этом синтаксис тестов остаётся компактным. Пример:

@Test
fun `GET /status returns 200`() {
mockMvc.perform(get("/status"))
.andExpect(status().isOk)
}

Организация логирования выполняется через Logback или Logstash с использованием Kotlin-библиотеки kotlin-logging. Это упрощает ведение структурированного логирования без потери контекста.

Kotlin и Spring Boot образуют связку, подходящую для микросервисов, где важны читаемость, производительность и простота поддержки. Использование корутин, DSL и аннотаций даёт гибкость при построении распределённых систем.

Вопрос-ответ:

Можно ли использовать Kotlin для написания серверной части приложений?

Да, Kotlin подходит для серверной разработки. Он хорошо интегрируется с такими фреймворками, как Ktor, Spring и Vert.x. Ktor, например, разработан JetBrains специально для Kotlin и позволяет быстро создавать веб-приложения и API. При этом язык остаётся лаконичным и читаемым, а его совместимость с Java-экосистемой даёт доступ к широкому выбору библиотек. Kotlin также поддерживает сопрограммы, что упрощает работу с асинхронным кодом на сервере.

Какие мобильные приложения можно создавать на Kotlin?

Kotlin используется для разработки Android-приложений. Он поддерживается Google как основной язык для Android с 2017 года. Можно писать как нативные приложения, так и мультиплатформенные, используя Kotlin Multiplatform Mobile (KMM). Это позволяет переиспользовать код между Android и iOS. Благодаря этому разработка мобильных решений может занимать меньше времени и ресурсов. Kotlin также работает с Jetpack Compose — современным инструментом для создания интерфейсов на Android.

Подходит ли Kotlin для создания десктопных программ?

Да, на Kotlin можно писать десктопные приложения. Он совместим с Java-библиотеками, такими как JavaFX и Swing, что позволяет разрабатывать интерфейсные программы под Windows, macOS и Linux. Помимо этого, существует библиотека Compose Multiplatform от JetBrains, с помощью которой можно писать десктопные приложения в стиле Jetpack Compose. Такой подход делает интерфейсы проще в реализации и обслуживании.

Можно ли на Kotlin писать игры?

Да, хотя Kotlin не является основным языком в игровой индустрии, он всё же используется для разработки простых игр, особенно 2D. Например, можно использовать библиотеку libGDX, которая поддерживает Kotlin благодаря совместимости с Java. Также можно применять Kotlin в игровых инструментах, скриптах, игровых редакторах или вспомогательных приложениях. Однако для больших проектов обычно выбирают другие языки, такие как C++ или C#.

Ссылка на основную публикацию