Kotlin course

OOP

Выбрать предметную область(только не "животные" и не "студенты/преподаватели").
Описать не менее 3-х классов, имеющих общего предка в виде абстрактного класса или реализующие общий интерфейс. Классы должны иметь свойства, в том числе и private, иметь
перегруженные методы(достаточно выполнить перегрузку в 1 классе), реализовывать абстрактный метод интерфейса или метод абстрактного класса, каждый класс должен иметь общий со
своим супертипом и уникальный функционалы(в виде свойств и методов).
Создать точку входа в виде консольного приложения с функцией main.
В функции main создать экземпляры объектов всех классов, продемонстрировать работу с общим функционалом, используя ссылку на супер-класс или интерфейсную ссылку.
Продемонстрировать работу функционала, характерного только для конкретного класса.

Collections Part1

Реализовать стеки и очереди на Котлин.

Требования для очередей:

реализовать метод enqueue, добавляющий элемент в конец очереди
реализовать метод dequeue, возвращающий первый элемент очереди и удаляющий его из коллекции.
Опционально: сделать DSL по примеру существующих(например, listOf())
Требования для стеков:

реализовать метод push, добавляющий элемент в стек.
реализовать метод pop, возвращающий верхний элемент и удаляющий его из коллекции
Опционально: сделать DSL по примеру существующих(например, listOf())

Collections Part 2

Выбрать предметную область
Создать два класса данных, не менее 3х полей у каждого.
Одно из полей должно каким-то образов связывать эти классы( как ключи в БД) - пример ниже
Создать два источника данных, имитирующих DAO - по факту просто два класса с заранее заполненными неизменяемыми списками объектов из п2. Каждый из них должен иметь методы,
возвращающие всю коллекцию целиком, один из них - дополнительно иметь метод, возвращающий элемент коллекции по тому полю, которое объединяет оба класса данных.
Создать третий класс данных, объединяющий поля классов из п.2
Создать класс-сервис, реализующий следующие методы:
Метод, собирающий данные из первого класса-источника, и преобразовывающий их в список элементов класса из п4 с использованием данных, полученных из второго класса источника
Метод, возвращающий отсортированный по какому-либо полю список из пункта 5а
Метод, группирующий элементы списка из 5а по какому-либо заранее выбранному полю
Метод, возвращающий количество элементов списка из 5а соответствующих переданному условию, должен принимать на вход предикат.

Пример классов данных:

data class User(val id: Int, val name: String)
data class UserFriends(val userId: Int, val friendsIds: List)

data class UserWithFriend(val id: Int, val name: String, val friendsIds: List)

DataBases

Выбрать предметную область (можно такую же как и в 4 задание, по коллекция )
Создать три класса данных, не менее 3х полей у каждого. Одно из полей должно каким-то образов связывать эти классы.
Реализовать в этих классах связку один ко многим и многие-ко-многим (для этого понадобится еще 1 класс( таблица в БД) )
На основе DAO классов созданных выше, написать sql скрипты для создание таблиц в БД/ Реализовать в приложение следующие сервисы:
Класс - клиент, который будет отвечать за подключение к БД. Всю информацию по подключению можно хранить как внутри класса, так и передавать в его конструктор например. Внутри класса можно реализовать методы подключения к БД, обработки каких либо sql запросов.
Класс инициализации (создания исходных таблиц) и удаление этих таблиц. На основе скриптов п.4 можно создать класс, который будет содержать скрипты по созданию и удалению таблиц (реализацию данного класса можно изменить по своему усмотрению)
Класс сервис, который должен содержать методы получения данных из БД по какой-либо логике. Он внутри себя должен обращаться к классу Клиенту 5a, передавать запрос в него и потом обрабатывать ответ самостоятельно. Необходимо реализовать логику, которая будет описана в п.6 Логика выборки данных из таблиц:
Найти 1 значению в таблице по id (идентификатору)
Найти все элементы в таблице которые имеют идентификатор > 2 (или какое нить другое поле, и условие на ваш выбор)
Сделать выборку из связанных таблиц (операторы JOIN, LEFT JOIN) (Возможно при маппинге из ResultSet понадобится новая сущность (необходимо будет создать))
Сделать выборку с группировкой по какому нибудь полю
Сделать выборку и отсортировать в порядке убывания значений.
Все операции надо реализовать через SQL, а не обрабатывать результат уже после получения. Результат необходимо вывести в консоль приложения.

Если по какой то причине при работе с БД произошла ошибка (неправильный синтаксис SQL выражения), ее необходимо обработать и вывести соотетствующее сообщение, при это программа должна продолжить работу а не упасть. (Для обработки исключения, можно создать свое собственное исключение.)

Tests

  1. Выбрать предметную область.
  2. Создать класс с 2 методами, один возвращает булевое значение, другой – отличный от булевого тип. Оба методы должны иметь минимум 1 входной параметр, в зависимости от которого формируется логика каждого метода.
  3. Создать файл с функцией расширения, которая добавляет функционал к какому-либо типу. Функция расширения должна кидать исключение для определенного значения этого типа. Выделить классы эквивалентности и написать тесты, протестировать тип выбрасываемого исключения и сообщение об ошибке в нем.
  4. Создать класс для тестирования DSL c не менее чем 2 полями и 1 методом с входными/выходными параметрами. Для класса создать одноименную функцию, которая будет принимать в качестве параметра лямбду вида block: ClassName.() -> Unit и будет возвращать новый экземпляр класса, с примененной к нему лямбдой. Написать тест с использованием mock’a, настроить mock, чтобы для каждого свойства и метода возвращалось определённое значение.
  5. Создать интерфейс DAO, имитирующий получение объектов из БД. В нем 2 абстрактных метода – поиск сущности по id и получение всех сущностей. Создать mock, настроить его, причем если id < 5, то mock возвращает сущность и null в противном случае. С помощью verify проверить количество вызовов метода поиска по id.
  6. Тесты должны покрывать все независимые линейные маршруты кода, т.е. для п.2 должно быть минимум 4 теста, для п.3 – 2, для п.4 – 1, для п.5 – 3.

Concurrency

Coroutines

Http

Ktor // Pull request

Queues // Pull request

Kotlin-DSL // Pull request

Docker // Pull request