arrow-left

All pages
gitbookPowered by GitBook
1 of 27

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Лабораторная работа 9

hashtag
Тема: Исключения в Java. Обработка исключений.

hashtag
Цель лабораторной работы:

  • Ознакомиться с механизмом исключений;

  • Научиться обрабатывать исключения в программе (блок try-catch, ключевое слово throws);

  • Разобраться с различными видами исключений;

  • Научиться добавлять собственные типы исключений в программу;

  • Изучить использование блока finally и try-with-resources.

Задание на лабораторную работу

hashtag
Задание 1.

Создать Spring Boot проект, запустить проект и убедиться, что application server запущен и на нем установлен проект

hashtag
Задание 2.

Придумать предметную область для веб-службы.

circle-info

Возможные варианты: электронный журнал группы, электронная регистратура в больнице, электронная библиотека.

Придумать несколько классов, которые описывают предметную область. Придумать поля для этих классов.

hashtag
Задание 3.

Для каждой сущности написать класс REST-контроллера, который содержит конечные точки для основных действий над сущностями.

hashtag
Задание 4.

С помощью приложения Postman () протестировать работу приложения на сервере, убедиться, что сервер возвращает корректный ответ в тех или иных ситуациях.

https://www.getpostman.com/downloads/arrow-up-right

Python

hashtag
Ссылки на материалы:

file-pdf
617KB
AByteofPythonRussian-2.01.pdf
PDF
arrow-up-right-from-squareOpen
A byte of Python
  • Комментарии - стр. 35

  • Метод format - стр. 36 - 37

  • Отступы - стр. 42 - 43

  • Оператор if - стр. 51 - 54

  • Цикл for - стр. 55 - 57

  • Функции - стр. 59 - 60

  • Списки - стр. 79 - 81

  • Последовательности - стр. 85 - 87

Материал по "срезам" (slices, используйте при работе со списками, для работы с частями списка):

Конспекты с краткой информацией:

https://pythonworld.ru/osnovy/indeksy-i-srezy.htmlarrow-up-right
https://itproger.com/course/python/8arrow-up-right
https://colab.research.google.com/drive/1VYtjviK0Kxo0FyKQ16hyls1nf_nZBuEparrow-up-right
https://colab.research.google.com/drive/1ys0X64uEUE-ea136EITxUoHvv8lJqD47arrow-up-right

Лабораторные работы

Задание на лабораторную работу

hashtag
Задания для выполнения:

hashtag
1. Программное обеспечение для университета

circle-exclamation

При выполнении задания продумайте следующие аспекты:

  • имена полей и типы данных;

  • как реализовать "уникальность" номера зачетной книжки и номера группы в рамках приложения;

hashtag
1.1 Класс Student

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

В классе должны быть следующие поля:

  • имя;

  • фамилия;

  • год поступления;

hashtag
В классе должны быть следующие конструкторы:

  • принимает на вход имя и фамилию. При использовании данного конструктора, в номер зачетной книжки записывается 0;

  • принимает на вход имя, фамилию, номер зачетной книжки.

hashtag
В классе должны быть следующие методы:

  • метод возвращает имя студента;

  • метод изменяет имя студента;

  • метод возвращает фамилию студента;

hashtag
1.2 Класс Group

Создайте публичный класс Group – студенческой группы. Класс не хранит явным образом специальность и название университета.

В классе должны быть следующие поля:

  • уникальный номер (в пределах специальности);

  • массив студентов.

hashtag
В классе должны быть следующие конструкторы:

  • принимает на вход номер группы (в этом случае, количество студентов записывается как 0);

  • принимает на вход номер группы, количество студентов (инициализация массива, но его элементы остаются пустыми);

  • принимает на вход массив студентов.

hashtag
В классе должны быть следующие методы:

  • метод возвращает номер группы;

  • метод изменяет номер группы;

  • метод возвращает общее число студентов группы;

hashtag
1.3 Класс Main

В классе Main напишите код, чтобы протестировать функциональность созданных классов и реализованных методов

hashtag
1.4 Модификация класса Group

Класс Group содержит внутри себя массив студентов. Методы класса Group требуют увеличения или уменьшения размера массива, вставки элемента внутри массива, вывод данных массива в отсортированном порядке.

Итого, есть данные и операции над данными (вставка, удаление, изменение размера, вывод в отсортированном порядке).

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

модификаторы доступа для полей и методов;

  • тип методов, которые требуется реализовать;

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

  • уникальный шестизначный номер зачетной книжки.
    метод изменяет фамилию студента;
  • метод возвращает номер зачетной книжки;

  • метод изменяет номер зачетной книжки;

  • метод возвращает год поступления;

  • метод изменяет год поступления.

  • метод возвращает ссылку на студента по номеру зачетной книжки;
  • метод удаляет студента из группы по номеру зачетной книжки (помните про корректное удаление элемента из массива);

  • метод добавляет нового студента в группу (принимает на вход ссылку на объект Student, если массив уже полностью заполнен - реализуйте расширение массива);

  • метод возвращает массив студентов;

  • метод возвращает массив студентов, отсортированный по фамилиям (подумайте, как это сделать; если фамилии одинаковы - сортируйте по имени; если имена одинаковы - по номеру зачетной книжки).

  • 1. Инкапсуляция

    Инкапсуляция в Java реализована с помощью использования модификаторов доступа.

    Язык Java предоставляет несколько уровней защиты, которые позволяет настраивать область видимости данных и методов. В Java имеется четыре категории видимости элементов класса:

    • private– члены класса доступны только членам данного класса. Всё что объявлено private, доступно только конструкторам и методам внутри класса и нигде больше. Они выполняют служебную или вспомогательную роль в пределах класса и их функциональность не предназначена для внешнего пользования. Закрытие (private) полей обеспечивает инкапсуляцию;

    • по умолчанию (package-private) – члены класса доступны классам, которые находятся в этом же пакете;

    • protected– члены класса доступны классам, находящимся в том же пакете, и подклассам – в других пакетах;

    • public– члены класса доступны для всех классов в этом и других пакетах.

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

    Когда член класса обозначается модификатором доступа public, он становится доступным для любого другого кода в программе, включая и методы, определенные в других классах.

    Когда член класса обозначается модификатором private, он может быть доступен только другим членам этого класса. Следовательно, методы из других классов не имеют доступа к закрытому члену класса.

    При отсутствии модификатора доступа, члены класса доступны другим членам класса, который находится в этом же пакете.

    Модификатор доступа protected связан с использованием механизма наследования и будет рассмотрен позже.

    Модификатор доступа указывается перед остальной частью описания типа отдельного члена класса (то есть, именно с модификатора доступа начинается объявление члена класса).

    Член класса (переменная, конструктор, методы), объявленный public, доступен из любого метода вне класса.

    Всё что объявлено private, доступно только конструкторам и методам внутри класса и нигде больше. Они выполняют служебную или вспомогательную роль в пределах класса и их функциональность не предназначена для внешнего пользования. Закрытие (private) полей обеспечивает инкапсуляцию.

    hashtag
    Сокрытие полей класса

    В подавляющем большинстве случаев, поля класса объявляются как private (это не касается статических переменных и констант, там ситуация может быть другая). Должны быть веские основания объявить поле класса общедоступным. Манипулирование данными должно осуществляться только с помощью методов.

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

    Геттер возвращает значение приватного поля, тогда как сеттер меняет значение приватного поля (новое значение передается в качестве аргумента метода).

    Хотя сигнатура и имена геттеров и сеттеров могут быть любыми, приучите себя соблюдать строгий шаблон для объявления геттеров и сеттеров.

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

    Сеттер должен иметь префикс set, после которого идет название поля с большой буквы. Сеттер принимает на вход новое значение поля. Возвращаемый тип, как правило, void.

    circle-info

    Большинство IDE для Java имеют механизм для генерации геттеров и сеттеров. В IntelliJ IDEA нажмите комбинацию Alt+Insert находясь в окне редактирования java-файла. Откроется контекстное меню Generate, где вы можете выбрать генерацию геттера и сеттера, после чего указать поля, для которых необходимо сгенерировать методы.

    hashtag
    5. Пример использования инкапсуляции

    Представим, что нам необходимо создать класс «Корзина» (Cart), который хранит в себе набор объектов класса «Товар» (Item).

    Какие методы «Корзина» должна предоставлять для внешнего использования? Это могут быть, например, методы «Добавить товар», «Убрать последний добавленный товар», «Подсчет суммы цен товаров в корзине», «Повышение цен в корзине на N процентов» и «Снижение цен в корзине на N процентов».

    Как вы можете заметить, это публичные методы, а значит, их можно вызвать через оператор-точку имея ссылку ну объект.

    Перечень этих публичных методов и составляет интерфейс класса – то есть, с помощью этих методов объект класса будет взаимодействовать с внешним миром.

    Эти методы имеют вполне четко определенные входные аргументы и могут возвращать значения четко определенных типов, и никак иначе. По аналогии с этим, поворот колес автомобиля осуществляется четко определенным образом – поворотом руля, и бензин надо заливать в четко определенное отверстие крышки бензобака, а не как-то еще.

    То – как будет реализовано хранение товаров в корзине – это внутренняя логика класса и она не должна быть доступна внешнему миру, она должна быть скрыта от внешнего вмешательства. Другие классы, которые будут использовать объекты класса Cartне должны знать и не должны иметь доступ к тому – как там «внутри» реализовано хранение товаров, подсчет цен и изменение цены на определенный процент и так далее, они могут только лишь использовать предоставленные им публичные методы. Давайте реализуем «Корзину» с помощью структуры «стек», которая, в свою очередь, реализована обычным массивом.

    Как мы видим, массив с товарами, указать на вершину стек объявлены как privateчлены класса. Это значит, что мы не можем получить к ним доступ извне – они доступны только внутри данного класса.

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

    Для него объект класса Cart это некоторый объект, который предоставляет «услугу» в виде корзины товаров и с этой корзиной можно работать с помощью определенных публичных методов.

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

    C#

    Книга "C# на примерах", страницы 80 - 102arrow-up-right

    Снизить цены товаров в корзине на определенный процент (значение процента передается как аргумент метода).

    Название метода

    Описание

    public Cart(int capacity)

    Конструктор с 1 параметром – максимальным количеством товаров в корзине.

    public boolean addItem(Item item)

    Добавление товара в корзину. Возвращает успешность операции.

    public Item deleteLastAddedItem()

    Удаление последнего добавленного товара в корзину. Возвращает удаленный товар.

    public double calculateItemPrices()

    Подсчет суммы цен всех товаров в корзине.

    public void raiseItemPrices(double percent)

    Поднять цены товаров в корзине на определенный процент (значение процента передается как аргумент метода).

    public void cutItemPrices(double percent)

    public String errMessage;
    private AccountBalance balance;
    
    private boolean isError(byte status) {}
    public class Account {}
    Account.java
    public class Account {
    
        private double balance;
    
        public double getBalance() {
            return balance;
        }
    
        public void setBalance(double balance) {
            this.balance = balance;
        }
    }
    Cart cart = new Cart();
    cart.addItem(new Item("Клавиатура", 2000));
    Cart.java
    public class Cart {
    
        private Item[] stack; // массив для реализации стека
        private int topIndex; // указатель на вершину стека
    
        // При создании корзины мы должны
        // указать максимальное количество элементов
        // в корзине
        public Cart(int capacity) {
            stack = new Item[capacity];
            topIndex = -1;
        }
    
        // Добавление нового товара в корзину
        public boolean addItem(Item item) {
            return push(item);
        }
    
        // Приватный метод, который реализует добавление в стек
        private boolean push (Item item) {
            // Добавляем товар в стек
            return true; // или false если не стек переполнен
        }
        
        // Удаление последнего добавленного товара в корзину
        public Item deleteLastAddedItem() {
            return pop();
        }
    
        // Приватный метод, который реализует извлечение из стека
        private Item pop() {
            return new Item(); // Извлеченный из стека товар
        }
    }
    Cart cart = new Cart();
    cart.addItem(new Item("Клавиатура", 2000));
    
    // Данная инструкция вызовет ошибку компиляции
    cart.topIndex = 4;

    2. Основы синтаксиса

    Лабораторная работа 3

    В данной лабораторной работе рассматривается принцип инкапсуляции и механизм перегрузки методов.

    hashtag
    Тема: Инкапсуляция и перегрузка методов

    hashtag
    Цель лабораторной работы:

    • изучить принцип инкапсуляции;

    • рассмотреть реализацию принципа инкапсуляции в языке Java;

    • изучить механизм перегрузки методов и его использование при создании классов.

    Лабораторная работа 6

    hashtag
    Тема: Абстрактные классы и интерфейсы.

    hashtag
    Цель лабораторной работы:

    • изучить назначение и синтаксис абстрактных классов;

    • рассмотреть механизм интерфейсов.

    Теоретические вопросы

    hashtag
    Теоретические вопросы:

    1. Зачем необходимо повторное использование кода?

    2. Что такое отношение наследования?

    3. Как реализовано наследование в Java?

    4. Расскажите, что такое цепочка вызовов конструкторов?

    5. Зачем необходимо ключевое слово super?

    6. В чем заключается механизм переопределения методов? Как он реализуется?

    7. Что такое класс Object и метод toString()?

    8. В чем заключается отличие композиции от наследования?

    Задание на лабораторную работу

    hashtag
    Задания для выполнения:

    hashtag
    1. Программное обеспечение для университета

    circle-exclamation

    При выполнении задания продумайте следующие аспекты:

    • имена полей и типы данных;

    • как реализовать "уникальность" номера зачетной книжки и номера группы в рамках приложения;

    hashtag
    1.1 Класс Student

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

    В классе должны быть следующие поля:

    • имя;

    • фамилия;

    • год поступления;

    hashtag
    В классе должны быть следующие конструкторы:

    • принимает на вход имя и фамилию. При использовании данного конструктора, в номер зачетной книжки записывается 0;

    • принимает на вход имя, фамилию, номер зачетной книжки.

    hashtag
    В классе должны быть следующие методы:

    • метод возвращает имя студента;

    • метод изменяет имя студента;

    • метод возвращает фамилию студента;

    hashtag
    1.2 Класс Group

    Создайте публичный класс Group – студенческой группы. Класс не хранит явным образом специальность и название университета.

    В классе должны быть следующие поля:

    • уникальный номер (в пределах специальности);

    • массив студентов.

    hashtag
    В классе должны быть следующие конструкторы:

    • принимает на вход номер группы (в этом случае, количество студентов записывается как 0);

    • принимает на вход номер группы, количество студентов (инициализация массива, но его элементы остаются пустыми);

    • принимает на вход массив студентов.

    hashtag
    В классе должны быть следующие методы:

    • метод возвращает номер группы;

    • метод изменяет номер группы;

    • метод возвращает общее число студентов группы;

    hashtag
    1.3 Класс Payment

    Создайте класс Payment - платы за обучение.

    В классе должны быть следующие поля:

    • дата (экземпляр класса java.util.Date);

    • размер суммы, переведенной студентом на счет университета.

    hashtag
    В классе должны быть следующие конструкторы:

    • без параметров (дата содержит null, сумма - 0);

    • с двумя параметрами - датой оплаты и суммой.

    hashtag
    В классе должны быть следующие методы:

    • геттеры и сеттеры для приватных полей.

    hashtag
    1.4 Класс ContractStudent

    Создайте класс ContractStudent, расширяющий класс Student. Данный класс добавляет следующие члены:

    Поля:

    • приватное поле - массив платежей;

    • приватное поле - стоимость обучения за семестра (предполагается, что эта стоимость в течение всего периода обучения меняться не будет).

    Конструкторы:

    • конструктор с именем и фамилией студента (номер зачетной книжки - 0, создает массив платежей нулевой длины);

    • конструктор, который принимает на вход имя, фамилию, номер книжки (создает массив платежей нулевой длины);

    Методы:

    • геттер для массива платежей и стоимости обучения за семестр;

    • метод, возвращающий размер задолженности студента на текущий момент. Исходите из того, что плата за обучение не меняется. Зная текущую дату и год поступления, можно выяснить, сколько семестров студент проучился и определить сумму, которую он должен внести за проведенные в университете семестры. Сравните эту сумму с тем, что студент оплатил по факту;

    • метод, добавляющий новый платеж в конец списка платежей;

    hashtag
    1.5 Интерфейс Event

    Создайте интерфейс Event - мероприятия, в котором принимает участие студент. Интерфейс определяет следующие методы:

    • геттеры и сеттеры для даты проведения мероприятия (методы работают с объектами типа java.util.Date);

    • геттеры и сеттеры для названия города, в котором проводилось мероприятие.

    hashtag
    1.6 Класс Olympics

    Определите класс Olympics - студенческой олимпиады. Класс реализующий интерфейс Event.

    В классе должны быть следующие поля:

    • дата проведения олимпиады;

    • название города, где проходила олимпиада;

    • место, которое занял студент на олимпиаде.

    hashtag
    В классе должны быть следующие конструкторы:

    • конструктор с тремя полями (дата, город, место).

    hashtag
    В классе должны быть следующие методы:

    • геттеры и сеттеры для приватных полей.

    hashtag
    1.7 Класс Conference

    Определите класс Conference - студенческой конференции. Класс должен реализовывать интерфейс Event.

    В классе должны быть следующие поля:

    • дата проведения конференции;

    • город, где проходила конференция;

    • название доклада, с которым студент выступал на конференции.

    hashtag
    В классе должны быть следующие конструкторы:

    • конструктор с тремя полями (дата, город, название доклада).

    hashtag
    В классе должны быть следующие методы:

    • геттеры и сеттеры для приватных полей.

    hashtag
    1.8 Класс Competition

    Определите класс Competition - студенческого соревнования. Класс должен реализовывать интерфейс Event.

    В классе должны быть следующие поля:

    • дата проведения соревнования;

    • город, где проходило соревнование;

    • название студенческого проекта;

    hashtag
    В классе должны быть следующие конструкторы:

    • конструктор с четырьмя полями (дата, город, название проекта, сумма).

    hashtag
    В классе должны быть следующие методы:

    • геттеры и сеттеры для приватных полей.

    hashtag
    1.9 Интерфейс Activist

    Определите интерфейс Activist - участника различных конкурсов, олимпиад и так далее. Интерфейс определяет следующие методы:

    • метод возвращает общее количество мероприятий, в которых принимал участие студент;

    • метод возвращает число призовых мест (с 1 по 3), занятых на олимпиадах;

    • метод возвращает число докладов на конференциях;

    hashtag
    1.10 Модификация класса Student

    Измените класс Student. Он теперь должен реализовывать интерфейс Activist. Реализуйте методы интерфейса. Помимо этого, в класс необходимо добавить следующие члены класса:

    Поля:

    • массив событий, в которых принимал участие студент.

    Методы:

    • добавление нового события в массив событий;

    • поиск событий по дате (метод возвращает ссылку на объект события);

    • удаление события по дате.

    Внесите изменения в конструктор(-ы) класса Student, чтобы они инициализировали массив событий.

    hashtag
    1.11 Модификация класса Group

    Измените класс Group. Добавьте следующие методы:

    • метод возвращает массив студентов-активистов (студенты, которые принимали участие хотя бы в одном событии);

    • метод возвращает список студентов-призеров (которые хотя бы раз занимали призовое место на олимпиаде или выигрывали какую-то сумму в соревновании);

    • метод возвращает количество студентов-активистов;

    hashtag
    1.12 Класс Main

    В классе Main напишите код, чтобы протестировать функциональность созданных классов и реализованных методов

    hashtag
    2. Приложение Draw

    Модифицируйте приложение Draw из лабораторной работы №5, что приложение использовало механизм абстрактных классов.

    hashtag
    3. Приложение SortingList

    Скачайте архив с проектом по этому адресу -

    Данная программа выводит список студентов и позволяет отсортировать их по имени, фамилии и по среднему баллу.

    В программе уже реализована сортировка студентов по имени.

    Задание состоит в следующем:

    • доделать программу, чтобы по нажатию на соответствующие кнопки происходила сортировка студентов по фамилии и по среднему баллу;

    • задание на дополнительные баллы - доработайте программу так, чтобы при повторном нажатии на ту же кнопку сортировки, осуществлялась обратная сортировка студентов. То есть, при первом нажатии на кнопку "Сортировка по имени" студенты сортировались в прямом порядке (по возрастанию), а при повторном нажатии на эту же кнопку, студенты сортировались в обратном порядке (по убыванию).

    circle-exclamation

    Список студентов находится в коллекции students, для сортировки необходимо вызвать у коллекции метод sort() и в этот метод передать объект компаратора.

    Что такое компаратор. Базовая операция для почти любой сортировки – сравнение двух элементов. Если вы сортируете обычные числа или строки, сравнение происходит элементарно по известным всем правилам. Но как быть, если вы хотите отсортировать объекты, которые могут иметь десятки полей различных типов?

    Для этого существует так называемый компаратор. Компаратор в Java – это объект класса, который реализует интерфейс Comparator. Интерфейс определяет всего один метод compare(), который принимает на вход два объекта типаObject. Если первый объект «меньше» – метод возвращает отрицательное число (обычно это просто -1, но может быть и любое другое отрицательное число), если первый объект «больше» – метод возвращает положительное число (обычно это 1, но может быть и любое другое положительное число), если объекты «равны» – метод возвращает 0.

    Задача программиста - прописать нужную логику сравнения и вернуть -1/0/1 в том или ином случае.

    Вы создаете класс, указываете, что этот класс реализует интерфейс Comparator и в методе compare() описываете логику сравнения двух объектов. В случае со сравнением двух студентов по имени, код компаратора выглядит следующим образом

    Обратите внимание, что сначала мы должны убедиться, что оба объекта являются объектами класса Student, после чего делаем нисходящее преобразование.

    В данном случае мы сравниваем два поля name у двух объектов класса Student. Так как это тип String, нам нет нужды сравнивать строки «вручную», мы просто можем воспользоваться методом compareTo(), который есть у любого объекта класса String.

    Теоретические вопросы

    hashtag
    Теоретические вопросы:

    1. Что такое перегрузка методов и зачем она нужна?

    2. Как реализовать перегрузку методов в Java?

    3. Что такое инкапсуляция? Зачем нужна инкапсуляция?

    4. Как реализована инкапсуляция в Java?

    модификаторы доступа для полей и методов;

  • тип методов, которые требуется реализовать;

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

  • уникальный шестизначный номер зачетной книжки.
    метод изменяет фамилию студента;
  • метод возвращает номер зачетной книжки;

  • метод изменяет номер зачетной книжки;

  • метод возвращает год поступления;

  • метод изменяет год поступления.

  • метод возвращает ссылку на студента по номеру зачетной книжки;
  • метод удаляет студента из группы по номеру зачетной книжки (помните про корректное удаление элемента из массива);

  • метод добавляет нового студента в группу (принимает на вход ссылку на объект Student, если массив уже полностью заполнен - реализуйте расширение массива);

  • метод возвращает массив студентов;

  • метод возвращает массив студентов, отсортированный по фамилиям (подумайте, как это сделать; если фамилии одинаковы - сортируйте по имени; если имена одинаковы - по номеру зачетной книжки).

  • выигранная сумма (0, если студент ничего не выиграл).
    метод возвращает строку, состоящую из названий проектов (названия разделены переходом на новую строку), за которые студент получил какую-то сумму на соревнованиях.

    метод возвращает число "бюджетников" в группе;

  • метод возвращает число контрактных студентов в группе;

  • метод возвращает количество студентов-должников (вовремя не оплативших контракт).

  • http://bit.ly/2RzoLDoarrow-up-right
    public class NameSorter implements Comparator {
        @Override
        public int compare(Object o1, Object o2) {
            if (o1 instanceof Student && o2 instanceof Student) {
                Student s1 = (Student) o1;
                Student s2 = (Student) o2;
                return s1.getName().compareTo(s2.getName());
            }
            return 0;
        }
    }

    Лабораторная работа 4

    В данной лабораторной работе рассматривается механизм наследования.

    hashtag
    Тема: Механизм наследования.

    hashtag
    Цель лабораторной работы:

    • изучить принцип наследования;

    • рассмотреть реализацию наследования в языке Java;

    • изучить механизм переопределения методов и его роль в наследовании.

    Лабораторная работа 8

    hashtag
    Тема: Работа с потоками (Stream API) в Java

    hashtag
    Цель лабораторной работы:

    • изучить предназначение потоков в Java;

    • рассмотреть процесс создания потоков и источники потоков в Java;

    • изучить промежуточные и терминальные операции для работы с потоками.

    2. Перегрузка методов

    hashtag
    1. Что такое перегрузка методов

    В Java разрешается в одном и том же классе определять два или более метода с одинаковым именем, если только объявления их параметров отличаются. В этом случае методы называются перегружаемыми, а сам процесс – перегрузкой метода (method overloading).

    Если у методов одинаковые имена, как Java узнает, какой именно из них вызывается? Ответ прост: перегружаемые методы должны отличаться по типу и/или количеству входных параметров. Даже разного порядка аргументов достаточно для того, чтобы методы считались разными (хотя это не рекомендуется).

    Перегрузка по возвращаемым значениям

    Логично спросить, почему при перегрузке используются только имена классов и списки аргументов? Почему не идентифицировать методы по их возвращаемым значениям?

    Идентифицировать их нельзя, потому что Java в этом случае не может определить, какая версия метода должна выполняться.

    При вызове перегружаемого метода для определения нужного варианта в Java используется тип и\или количество аргументов метода. Следовательно, перегружаемые методы должны отличаться по типу и\или количеству их параметров. Возвращаемые типы перегружаемых методов могут отличаться, но самого возвращаемого метода недостаточно, чтобы отличить два разных варианта метода. Когда в исполняющей среде Java встречается вызов перегружаемого метода, в ней просто выполняется тот вариант, параметры которого соответствуют аргументам, указанным в вызове.

    Перегрузка методов позволяет поддерживать принцип «один интерфейс, несколько методов».

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

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

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

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

    Перегрузка конструкторов

    Наряду с перегрузкой обычных методов можно также выполнять перегрузку конструкторов. Перегружаемые конструкторы – это норма и часто используемый прием.

    Соответствующий перегружаемый конструктор вызывается в зависимости от параметров, указываемых при выполнении оператора new.

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

    class MyClass {
        
        public void foo() {
            // ... код
        }
        
        public void foo(String s) {
            // ... код
        }
    }
    // ДАННЫЙ КОД ВЫЗОВЕТ ОШИБКУ КОМПИЛЯЦИИ!
    
    class MyClass {
    
        public int foo() {
            return 0;
        }
    
        public double foo() {
            return 0;
        }
    }
    class MyClass {
        
        public MyClass() {
            // какой-то код
        }
        
        public MyClass(int arg0) {
            // какой-то код
        }
        
        public MyClass (int arg0, String arg1) {
            // какой-то код
        }
    }
    class MyClass {
    
        public MyClass() {
            // Вызываем конструктор MyClass(int arg0)
            this(0);
        }
    
        public MyClass(int arg0) {
            // Вызываем конструктор MyClass (int arg0, String arg1)
            this(arg0, " ");
        }
    
        public MyClass(int arg0, String arg1) {
            // какой-то код
        }
    }

    Лабораторная работа 10

    hashtag
    Тема: Создание веб-службы с помощью Spring Boot. Разработка REST-контроллеров.

    hashtag
    Цель лабораторной работы:

    • изучить структуру и основные компоненты клиент-серверных систем;

    • разобраться с созданием приложения с помощью Spring Boot;

    • изучить структуру протокола HTTP;

    • разобраться с использованием архитектурного стиля REST;

    • изучить процесс создания конечных точек и использование атрибутов для создания конечных точек.

    Лабораторная работа 11

    hashtag
    Тема: Создание веб-службы с помощью Spring Boot. Разработка сервисов. Подключение СУБД для хранения и манипулирования данных.

    hashtag
    Цель лабораторной работы:

    • изучить назначение и порядок создания классов служб;

    • изучить процесс работы с базами данных, понятие драйвера, протокола JDBC;

    • разобраться с технологией ORM, ее предназначением, преимуществами и недостатками;

    • подключить необходимые библиотеки и настроить работу приложения вместе с СУБД;

    • модифицировать классы предметной области для работы с технологией ORM.

    Задание на лабораторную работу

    hashtag
    Задание 1.

    Подключить требуемые зависимости для работы с выбранной СУБД (СУБД выбирается студентом самостоятельно);

    Создать и сконфигурировать настроечный файл application.yml для работы с выбранной СУБД.

    hashtag
    Задание 2.

    Модифицировать классы предметной области для преобразования их в классы сущностей для работы с Hibernate;

    hashtag
    Задание 3.

    Создать интерфейсы репозитория для каждой сущности.

    hashtag
    Задание 4.

    Написать классы сервисов для каждой сущности, предусмотреть методы для выполнения действий с репозиторием каждой сущности;

    hashtag
    Задание 5.

    Модифицировать классы REST-контроллеров, внедрить классы соответствующих сервисов.

    Задание на лабораторную работу

    hashtag
    Задания для выполнения:

    circle-exclamation

    Ссылка на репозиторий с проектом - https://github.com/MykolaHodovychenko/Lab4arrow-up-right

    hashtag
    1. Класс Point3D

    Дан класс Point, который моделирует точку в двумерном пространстве. Класс включает в себя следующие конструкторы и публичные методы:

    Создайте класс Point3D, который расширяет класс Point через наследование. Он должен вести себя как Point, за исключением того что это должна быть точка в трехмерном пространстве, которая хранит значение координаты Z.

    Вы должны предоставить те же методы, что и суперкласс, а также реализовать дополнительное поведение

    Класс Point3D() должен переопределить требуемые методы, чтобы они работали корректно с учетом третьей координаты. Также класс Point3D должен вести себя иначе в следующих ситуациях:

    • при вызове метода setLocation(int x, int y), координата z должна быть выставлена в 0;

    • при вызове метода toString(), строка должна выводить три координаты, а не две;

    hashtag
    2. Класс DiscountBill

    Дан класс GroceryBill, который моделирует чек и хранит список товаров, который покупает человек в супермаркете. Класс включает в себя следующие конструкторы и публичные методы:

    Объект GroceryBill взаимодействует с объектами класса Item. Класс Item включает следующие публичные методы:

    К примеру, товар стоит 1.35, а размер скидки 0.25 для постоянных покупателей. Это означает, что постоянный покупатель должен заплатить 1.10. Некоторые товары могут не иметь скидки (размер скидки 0.0). В классе GroceryBill не предусмотрена логика для учета скидки, то есть учитывается только полная стоимость товара.

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

    Класс DiscountBill должен реализовывать собственную логику метода getTotal() для постоянных покупателей. Например, если полная сумма равна 80 гривен, а скидка для постоянного клиента составила 20 гривен, метод должен возвращать 60 гривен.

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

    Помимо переопределенных методов, класс DiscountBill должен иметь следующие конструкторы и публичные методы:

    Если покупатель не является регулярным, класс DiscountBill должен вести себя как будто общая скидка равна 0 и все товары учтены по их полной стоимости.

    Теоретические вопросы

    hashtag
    Теоретические вопросы:

    1. Что такое абстрактный метод, зачем нужны абстрактные методы?

    2. Чем абстрактный класс отличается от обычного?

    3. Что такое интерфейс и что он описывает?

    4. Зачем нужны интерфейсы в ООП?

    5. Чем интерфейс отличается от абстрактного класса?

    Возвращает строку в виде "(x,y)"

    public int distanceFromOrigin()

    Возвращает расстояние от начала координат (0, 0) до точки по формуле расстояния Евклида

    метод distanceFromOrigin() должны учитывать координату z и возвращать расстояние по формуле (x1−x2)2+(y1−y2)2+(z1−z2)2\sqrt{(x_1-x_2)^2 + (y_1-y_2)^2 + (z_1-z_2)^2}(x1​−x2​)2+(y1​−y2​)2+(z1​−z2​)2​ .

    Сигнатура

    Описание

    public Point()

    Создает точку с координатами (0, 0)

    public Point(int x, int y)

    Создает точку с координатами (x, y)

    public void setLocation(int x, int y)

    Устанавливает новые координаты точки

    public int getX()

    Возвращает значение координаты X

    public int getY()

    Возвращает значение координаты Y

    Сигнатура

    Описание

    public Point3D()

    Создает точку с координатами (0, 0, 0)

    public Point3D(int x, int y, int z)

    Создает точку с координатами (x, y, z)

    public void setLocation(int x, int y, int z)

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

    public int getZ()

    Возвращает координату Z

    Сигнатура

    Описание

    public GroceryBill(Employee clerk)

    Создает объект GroceryBill для данного clerk

    public void add(Item i)

    Добавляет товар в чек

    public double getTotal()

    Возвращает итоговую стоимость товаров

    public void printReceipt()

    Распечатывает список товаров

    Сигнатура

    Описание

    public double getPrice()

    Возвращает стоимость товара

    public double getDiscount()

    Возвращает скидку для этого товара

    Сигнатура

    Описание

    public DiscountBill (Employee clerk, boolean regularCustomer)

    Создает объект DiscountBill для данного clerk

    public int getDiscountCount()

    Возвращает количество товаров со скидкой

    public double getDiscountAmount()

    Возвращает общую скидку в гривнах

    public double getDiscountPercent()

    Возвращает процент скидки для товаров (на сколько процентов покупатель заплатил меньше)

    public String toString()

    (x1−x2)2+(y1−y2)2 \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}(x1​−x2​)2+(y1​−y2​)2​

    Лабораторная работа 7

    hashtag
    Тема: Работа с коллекциями в Java.

    hashtag
    Цель лабораторной работы:

    • изучить предназначение коллекций и их отличие от обычных структур данных;

    • рассмотреть типы коллекций в Java;

    • изучить использование различных типов коллекций.

    Теоретические вопросы

    hashtag
    Теоретические вопросы:

    1. Что такое коллекции? Чем отличаются коллекции от обычных структур данных?

    2. Какие типы коллекций вы знаете?

    3. В чем особенность коллекции List? Какие классы реализуют List и чем они отличаются?

    4. В чем особенность коллекции Queue? Какие классы реализуют Queue и чем они отличаются?

    5. В чем особенность коллекции Set? Какие классы реализуют Set и чем они отличаются?

    6. В чем особенность коллекции Map? Какие классы реализуют Map и чем они отличаются?

    Задание на лабораторную работу

    hashtag
    Задания для выполнения:

    hashtag
    I. Задачи на сайте Practice-It

    hashtag
    1. Зайдите на сайт и зарегистрируйтесь.

    circle-info

    В качестве "Desired username" указать фамилию и группу латиницей, например, ivanov171.

    hashtag
    2. После регистрации и входа в аккаунт, нажмите кнопку "Start practicing!", перейдите в раздел "Building Java Programs, 5th edition", после чего найдите главу 11 "BJP5 Chapter 11: Java Collections Framework"

    3. Вам необходимо выполнить все задачи в этой главе (3 вопроса и 14 упражнений).

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

    hashtag
    5. Если вы ответили правильно, то система оповестит вас что все тесты пройдены и можно переходить к другой задаче.

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

    hashtag
    7. Для успешного решения упражнения, ваш код должен пройти все тесты.

    circle-info

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

    hashtag
    II. Задачи на выбор коллекции

    1. Дан список из 100 целочисленных значений от -1000 до 1000 (создайте и сгенерируйте список). Не используя вспомогательных объектов, переставьте отрицательные элементы данного списка в конец, а положительные – в начало списка. Не используйте методы сортировки.

    2. Дан случайный текст – . Выделить все различные слова. Слова, отличающиеся только регистром букв, считать одинаковыми (подумайте о том – какую коллекцию лучше использовать).

    3. Дан случайный текст – . Выделить все различные слова. Для каждого слова подсчитать частоту его встречаемости (сколько раз слово встречается / общее количество слов). Слова, отличающиеся регистром букв, считать различными (подумайте о том – какую коллекцию лучше использовать).

    4. Дан случайный текст – . Разбить текст на предложения, каждое предложение записать в список. Выполнить сортировку строк, используя метод sort() из класса Collections. Результат вывести на экран.

    https://practiceit.cs.washington.edu/arrow-up-right
    http://pastebin.com/JEwMJVbharrow-up-right
    http://pastebin.com/JEwMJVbharrow-up-right
    http://pastebin.com/JEwMJVbharrow-up-right

    Задание на лабораторную работу

    hashtag
    Задание 1.

    Развернуть разработанное приложение (10 и 11 лабораторные работы) в облачной платформе по выбору (в инструкции рассматривается разворачивание облака на платформе Heroku).

    hashtag
    Задание 2.

    Активировать и подключить базу данных облачной платформы.

    hashtag
    Задание 3.

    С помощью приложения Postman продемонстрировать корректную работу приложения.

    Пример выполнения лабораторной работы

    hashtag
    1. Настройка Heroku и подключения к БД

    Создадим аккаунт на сервисе Heroku

    Зайдем в аккаунт и создадим новое приложение (new app)

    Зайдем в раздел Resources, в пункте Add-ons добавим Heroku Postgres

    Перейдем в настройки базы данных

    На страничке адд-она перейдем в раздел Settings и выберем View Credentials

    Таким образом, мы получим credentials для подключения к базе.

    Перейдем в application.yml и укажем настройки для БД на heroku

    circle-info

    После указания настроек, можете сразу запустить приложение, чтобы убедиться, что вы правильно указали настройки для подключения БД.

    hashtag
    2. Установка git и heroku

    Заходим на сайт , скачиваем последнюю версию установщик и устанавливаем Git.

    Заходим в командную строку и настраиваем имя и почту разработчика

    Возвращаемся в Heroku, скачиваем и настраиваем Heroku CLI

    Заходим в командую строку и логинимся на heroku с помощью команды heroku login

    Переходим в директорию проекта, после чего инициализируем git-репозиторий с помощью команды git init

    Далее устанавливаем удаленный репозиторий

    Начинаем отслеживать файлы проекта с помощью команды git add ., после чего делаем коммит с помощью команды git commit -am "initial commit".

    Теперь можно пушить проект на удаленный репозиторий с помощью команды git push heroku master.

    Как видим, мы успешно развернули проект на Heroku. Проверим работу веб-сервиса. Перейдем в браузер и укажем адрес

    Теперь попробуем осуществить REST-запросы к серверу. Добавим группу, добавим студента, получим список групп.

    Добавляем группу

    Добавляем студента

    Получаем список групп

    https://git-scm.com/arrow-up-right
    https://opnu-ej.herokuapp.com/arrow-up-right
    application.yml
    spring:
      jpa:
        database: POSTGRESQL
        show-sql: true
        hibernate:
          ddl-auto: create-drop
        properties:
          hibernate:
            dialect: org.hibernate.dialect.PostgreSQLDialect
      datasource:
        platform: postgres
        url: jdbc:postgresql://ec2-176-34-183-20.eu-west-1.compute.amazonaws.com:5432/d60ukqmkatvcpg
        username: xvlmxbawwxafdu
        password: a1439fbcffbfdd6ad208df91670a37c73d8ed12d18cd6de91c1485c5841774b9
        driverClassName: org.postgresql.Driver
    Microsoft Windows [Version 10.0.18362.476]
    (c) Корпорация Майкрософт (Microsoft Corporation), 2019. Все права защищены.
    
    C:\Users\nickg>git config --global user.name "Mykola Hodovychenko"
    
    C:\Users\nickg>git config --global user.email hodovychenko@opu.ua
    
    C:\Users\nickg>git config --list
    http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
    http.sslbackend=openssl
    diff.astextplain.textconv=astextplain
    core.autocrlf=true
    core.fscache=true
    core.symlinks=false
    core.editor="C:\\Program Files\\Notepad++\\notepad++.exe" -multiInst -notabbar -nosession -noPlugin
    credential.helper=manager
    user.name=Mykola Hodovychenko
    user.email=hodovychenko@opu.ua
    gui.recentrepo=E:/spring/testproject3
    
    C:\Users\nickg>
    C:\Users\nickg>heroku login
    heroku: Press any key to open up the browser to login or q to exit:
    Opening browser to https://cli-auth.heroku.com/auth/browser/630e1a02-f90e-4217-8170-cd71d7fc700e
    Logging in... done
    Logged in as hodovychenko@opu.ua
    C:\Users\nickg>cd d:\springdemo\ejo
    
    d:\springdemo\ejo>git init
    Initialized empty Git repository in d:/springdemo/ejo/.git/
    d:\springdemo\ejo>heroku git:remote -a opnu-ej
    set git remote heroku to https://git.heroku.com/opnu-ej.git
    d:\springdemo\ejo>git add .
    warning: LF will be replaced by CRLF in .gitignore.
    The file will have its original line endings in your working directory
    warning: LF will be replaced by CRLF in .mvn/wrapper/MavenWrapperDownloader.java.
    The file will have its original line endings in your working directory
    warning: LF will be replaced by CRLF in .mvn/wrapper/maven-wrapper.properties.
    The file will have its original line endings in your working directory
    warning: LF will be replaced by CRLF in mvnw.
    The file will have its original line endings in your working directory
    warning: LF will be replaced by CRLF in mvnw.cmd.
    The file will have its original line endings in your working directory
    warning: LF will be replaced by CRLF in pom.xml.
    The file will have its original line endings in your working directory
    warning: LF will be replaced by CRLF in src/main/java/com/example/ejo/EjoApplication.java.
    The file will have its original line endings in your working directory
    warning: LF will be replaced by CRLF in src/test/java/com/example/ejo/EjoApplicationTests.java.
    The file will have its original line endings in your working directory
    
    d:\springdemo\ejo>git commit -am "initial commit"
    [master (root-commit) 162bc53] initial commit
     16 files changed, 886 insertions(+)
     create mode 100644 .gitignore
     create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java
     create mode 100644 .mvn/wrapper/maven-wrapper.jar
     create mode 100644 .mvn/wrapper/maven-wrapper.properties
     create mode 100644 mvnw
     create mode 100644 mvnw.cmd
     create mode 100644 pom.xml
     create mode 100644 src/main/java/com/example/ejo/Controller.java
     create mode 100644 src/main/java/com/example/ejo/EjoApplication.java
     create mode 100644 src/main/java/com/example/ejo/Group.java
     create mode 100644 src/main/java/com/example/ejo/GroupRepository.java
     create mode 100644 src/main/java/com/example/ejo/Service.java
     create mode 100644 src/main/java/com/example/ejo/Student.java
     create mode 100644 src/main/java/com/example/ejo/StudentRepository.java
     create mode 100644 src/main/resources/application.yml
     create mode 100644 src/test/java/com/example/ejo/EjoApplicationTests.java
    d:\springdemo\ejo>git push heroku master
    Enumerating objects: 32, done.
    Counting objects: 100% (32/32), done.
    Delta compression using up to 6 threads
    Compressing objects: 100% (23/23), done.
    Writing objects: 100% (32/32), 54.39 KiB | 9.06 MiB/s, done.
    Total 32 (delta 1), reused 0 (delta 0)
    remote: Compressing source files... done.
    remote: Building source:
    remote:
    remote: -----> Java app detected
    remote: -----> Installing JDK 1.8... done
    remote: -----> Executing: ./mvnw -DskipTests clean dependency:list install
    remote:        [INFO] Scanning for projects...
    
    ...
    
    remote:        [INFO] Replacing main artifact with repackaged archive
    remote:        [INFO]
    remote:        [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ ejo ---
    remote:        [INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-utils/0.4/maven-shared-utils-0.4.pom
    remote:        [INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-utils/0.4/maven-shared-utils-0.4.pom (4.0 kB at 450 kB/s)
    remote:        [INFO] Downloading from central: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-alpha-2/classworlds-1.1-alpha-2.jar
    remote:        [INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-utils/0.4/maven-shared-utils-0.4.jar
    remote:        [INFO] Downloaded from central: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-alpha-2/classworlds-1.1-alpha-2.jar (38 kB at 1.1 MB/s)
    remote:        [INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.15/plexus-utils-3.0.15.jar
    remote:        [INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-utils/0.4/maven-shared-utils-0.4.jar (155 kB at 2.0 MB/s)
    remote:        [INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.15/plexus-utils-3.0.15.jar (239 kB at 3.0 MB/s)
    remote:        [INFO] Installing /tmp/build_bee447e74484e663663b1d166f8e9456/target/ejo-0.0.1-SNAPSHOT.jar to /app/tmp/cache/.m2/repository/com/example/ejo/0.0.1-SNAPSHOT/ejo-0.0.1-SNAPSHOT.jar
    remote:        [INFO] Installing /tmp/build_bee447e74484e663663b1d166f8e9456/pom.xml to /app/tmp/cache/.m2/repository/com/example/ejo/0.0.1-SNAPSHOT/ejo-0.0.1-SNAPSHOT.pom
    remote:        [INFO] ------------------------------------------------------------------------
    remote:        [INFO] BUILD SUCCESS
    remote:        [INFO] ------------------------------------------------------------------------
    remote:        [INFO] Total time:  20.474 s
    remote:        [INFO] Finished at: 2019-11-26T21:46:52Z
    remote:        [INFO] ------------------------------------------------------------------------
    remote: -----> Discovering process types
    remote:        Procfile declares types     -> (none)
    remote:        Default types for buildpack -> web
    remote:
    remote: -----> Compressing...
    remote:        Done: 84.1M
    remote: -----> Launching...
    remote:        Released v5
    remote:        https://opnu-ej.herokuapp.com/ deployed to Heroku
    remote:
    remote: Verifying deploy... done.
    To https://git.heroku.com/opnu-ej.git
     * [new branch]      master -> master
    
    d:\springdemo\ejo>

    Лабораторная работа 12

    hashtag
    Тема: Развертывание приложения на облачной платформе.

    hashtag
    Цель лабораторной работы:

    • изучить назначение и типы облачных сервисов;

    • научиться разворачивать приложение на облачной платформе;

    • научиться подключать базу данных облачного сервиса к разработанному приложению.