@ Что происходит & @ Время & @ Слайды & @ Описание \\
\hline
\endhead
@ Организационный момент & 5 tag(beg) & @ 1-5 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
\hline
@ Quiz & 10 & @ 6-24 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (6 вопросов, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ лекции & 10 & @ 25-30 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 31 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 5 & @ 32-35 & @ Создание класса и объекта. \\
\item Написать классы кота и собаки, наследники животного. У всех есть три действия: бежать, плыть, прыгать. Действия принимают размер препятствия и возвращают булев результат. Три ограничения: высота прыжка, расстояние, которое животное может пробежать, расстояние, которое животное может проплыть. Следует учесть, что коты не любят воду.
\item\textbf{Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе.
\item\textbf{Тайминг} 5-15 минут
\item\textbf{Действия преподавателя}
\begin{itemize}
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
\item Посоветовать литературу на тему заданного вопроса;
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
\item\textbf{Ценность этапа} Создание и манипуляция множествами объектов.
\item\textbf{Тайминг} 20-25 минут.
\item\textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (дополнительно напомнить, что классы создают для программы новый тип данных, а значит объектами можно пользоваться также, как и заранее созданными);
\item Пояснить студентам в каком виде выполнять и сдавать задания;
\item Выдать задание группам студентов;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\item\textbf{Ценность этапа} Манипуляция информацией об объекте.
\item\textbf{Тайминг} 15-20 минут.
\item\textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (часто возникают ситуации, когда необходимо осуществить фильтрацию данных или манипулировать только частью объектов. дополнительно указать на то, что часто методы, манипулирующие множеством объектов описывают внутри классов, но это не совсем верный подход с точки зрения архитектуры, и под такие методы желательно создавать отдельный класс, например, \code{EmployeeWorker});
\item Пояснить студентам в каком виде выполнять и сдавать задания;
\item Выдать задание группам студентов;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item\textbf{Задания}
\begin{itemize}
\item Создать метод, повышающий зарплату всем сотрудникам старше 45 лет на 5000. Метод должен принимать в качестве параметра массив сотрудников.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Метод повышения зарплаты}]
// Employee
public void increaseSalary(int amount) {
this.salary += amount;
}
// Main
private static void increaser(Employee[] emp) {
for (int i = 0; i < emp.length; i++) {
if (emp[i].getAge() > 45) {
emp[i].increaseSalary(5000);
}
}
}
// main
for (int i = 0; i < employees.length; i++) {
increaser(employees);
}
\end{lstlisting}
\item [$*_1$] Написать тот же метод, но возраст и размер повышения должны быть параметрами метода.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Параметризированный метод повышения}]
// Main
private static void increaser(Employee[] emp, int age, int increment) {
for (int i = 0; i < emp.length; i++) {
if (emp[i].getAge() > age) {
emp[i].increaseSalary(increment);
}
}
}
// main
for (int i = 0; i < employees.length; i++) {
increaser(employees, 45, 5000);
}
\end{lstlisting}
\item [$*_2$] Написать тот же метод в качестве статического в классе сотрудника.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Статический метод и использование}]
// Employee
public static void increaser(Employee[] emp, int age, int increment) {
\item\textbf{Ценность этапа} Соблюдение атомарности методов, независимость методов, манипулирующих данными от окружения.
\item\textbf{Тайминг} 10-15 минут.
\item\textbf{Действия преподавателя}
\begin{itemize}
\item Обратить внимание на то, что многие студенты пытаются объединить методы с похожими алгоритмами, но это неверный подход, нужно соблюдать атомарность методов. Важно, чтобы результаты работы не печатались в консоль, а возвращались из методов, чтобы код был переносимым;
\item Выдать задание группам студентов;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item\textbf{Задания}
\begin{itemize}
\item Написать методы (принимающие на вход массив сотрудников), вычисляющие средний возраст и среднюю зарплату сотрудников, вывести результаты работы в консоль.
\item\textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item\textbf{Тайминг} 5-10 минут.
\item\textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам в каком виде выполнять и сдавать задания
\item Уточнить кто будет проверять работы (преподаватель или ревьювер)
\item Объяснить к кому обращаться за помощью и где искать подсказки
\item Объяснить где взять проект заготовки для дз
\end{itemize}
\item\textbf{Задания}
\begin{enumerate}
\item [5-25 мин] Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;
\textbf{Все варианты решения приведены в тексте семинара выше}
\item [5-10 мин] 1. Написать прототип компаратора - метод внутри класса сотрудника, сравнивающий две даты, представленные в виде трёх чисел гггг-мм-дд, без использования условного оператора.
* negative integer if this object birthdate is less (earlier), than given (older)
* positive integer if this object birthdate is more (later), than given (younger)
* zero if this object is the same as given
* */
public int compare(int dd, int mm, int yyyy) {
//day = 0..30, 31 is binary 11111, ok to left shift month by 6
//month = 0..11, 15 is binary 1111, ok to left shift year by 5 more
int empl = bDay + (bMonth << 6) + (birth << 11);
int income = dd + (mm << 6) + (yyyy << 11);
return empl - income;
}
\end{lstlisting}
\item [10-15 мин] 2. Опишите класс руководителя, наследник от сотрудника. Перенесите статический метод повышения зарплаты в класс руководителя, модифицируйте метод таким образом, чтобы он мог поднять заработную плату всем, кроме руководителей. В основной программе создайте руководителя и поместите его в общий массив сотрудников. Повысьте зарплату всем сотрудникам и проследите, чтобы зарплата руководителя не повысилась.
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Менеджер - это тоже сотрудник}]
// Manager
package ru.gb.jcore;
public class Manager extends Employee {
public Manager(String name, String midName, String surName,
String phone, String position, int salary, int birth) {