[Документация Yandex Cloud](../../../../index.md) > [Yandex Cloud Functions](../../../index.md) > [Разработка на Kotlin](../index.md) > Модель программирования > Обзор

# Модель программирования на языке Kotlin

Сервис Cloud Functions предоставляет две модели программирования на языке Kotlin — с помощью [функций верхнего уровня](top-level-function.md) и интерфейса [YcFunction](yc-function.md). Интерфейс `YcFunction` в отличие от функций верхнего уровня дает доступ к [контексту вызова](../context.md).

Обе модели программирования позволяют взаимодействовать с сервисами Yandex Cloud при помощи [SDK](../sdk.md). Для этого добавьте SDK в [зависимости Gradle](../dependencies.md#gradle).

## Обособленные типы данных {#separate-types}

Для моделей программирования на языке Kotlin есть несколько обособленных типов: `InputStream`, `String` и `ByteArray`. Работа с ними отличается от работы с другими типами. Если аргумент в функции-обработчике принимает обособленный тип, среда выполнения не преобразовывает [входящий HTTPS-запрос](../../../concepts/function-invoke.md#http) в JSON-интерпретацию. Вместо этого среда выполнения передает запрос напрямую в пользовательский обработчик.

Работа с обособленными типами отличается, когда они становятся `Nullable`. Допустим, тело входного запроса — `null`, и пользователь вызвал функцию с параметром [?integration=raw](../../../concepts/function-invoke.md#http). Результат, который получает обработчик, зависит от типа агрумента:

* Если аргумент принимает тип `String?`, обработчику передается значение `null`.
* Если аргумент принимает тип `String`, обработчику передается строка, которая содержит текст `null`.

{% note info %}

В качестве библиотеки для сериализации и десериализации из JSON используется [Moshi](https://github.com/square/moshi).

{% endnote %}

## Требования к обработчику {#requirements}

Вне зависимости от выбранной модели загрузка проекта осуществляется одним из способов: в виде исходного кода, JAR-архива или Gradle-проекта. Также к классам с обработчиками применяются требования, которые различаются в зависимости от модели программирования:

* Для функции верхнего уровня:

   * Функция должна быть публичной.
   * Она не должна быть [обобщенной](https://kotlinlang.org/docs/java-interop.html#java-generics-in-kotlin).

* Для интерфейса `YcFunction`:

   * Класс, содержащий функцию-обработчик, должен быть публичным.
   * У класса должен быть публичный конструктор без аргументов.

      По умолчанию он есть. Но если вы создали свой конструктор, принимающий аргументы, создайте также конструктор, не принимающий никаких аргументов.

   * Класс не должен быть обобщенным.