Compare commits
No commits in common. "1b865320a66fe01ea28783ccc8bdaafbced70219" and "44bd7a1313fbb2e98f5275ce6cba8e6864b79eb5" have entirely different histories.
1b865320a6
...
44bd7a1313
Binary file not shown.
Binary file not shown.
|
@ -1,549 +0,0 @@
|
||||||
\documentclass[../j-spec.tex]{subfiles}
|
|
||||||
\usepackage{spreadtab}
|
|
||||||
|
|
||||||
\begin{document}
|
|
||||||
\setcounter{section}{2}
|
|
||||||
\section{Семинар: классы и объекты}
|
|
||||||
\subsection{Инструментарий}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \href{https://docs.google.com/presentation/d/1qaEt-5sSLYWeP_FSvL2uJiLwEFLYfNFg_iCvnUr3dqo}{Презентация} для преподавателя, ведущего семинар;
|
|
||||||
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
|
|
||||||
\item JDK любая 11 версии и выше;
|
|
||||||
\item \href{https://www.jetbrains.com/idea/download}{IntelliJ IDEA Community Edition} для практики и примеров используется IDEA.
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsection{Цели семинара}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Закрепить полученные на лекции знания об объектах, наследовании и полиморфизме;
|
|
||||||
\item Получить практический навык создания классов по описанию;
|
|
||||||
\item Дополнительно рассмотреть использование свойств статичности сущностей, неочевидные случаи несоблюдения инкапсуляции;
|
|
||||||
\item Попрактиковаться в написании простых классов и методов, манипулирующих ссылочными данными.
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsection{План-содержание}
|
|
||||||
\noindent
|
|
||||||
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
|
|
||||||
\hline
|
|
||||||
@ Что происходит & @ Время & @ Слайды & @ Описание \\
|
|
||||||
\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 & @ Создание класса и объекта. \\
|
|
||||||
\hline
|
|
||||||
@ Задание 2 & 10 & @ 36-40 & @ Манипуляция информацией об объекте \\
|
|
||||||
\hline
|
|
||||||
@ Перерыв (если нужен) & 5 & @ 41 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
|
|
||||||
\hline
|
|
||||||
@ Задание 3 & 20 & @ 42-46 & @ Создание и манипуляция множествами объектов \\
|
|
||||||
\hline
|
|
||||||
@ Задание 4 & 15 & @ 47-51 & @ Манипуляции данными по условию, «массовое обслуживание» \\
|
|
||||||
\hline
|
|
||||||
@ Задание 5 (необязат) & 15 & @ 52-54 & @ Соблюдение атомарности методов, независимость методов от окружения \\
|
|
||||||
\hline
|
|
||||||
@ Домашнее задание & 5 & @ 55-56 & @ Объясните домашнее задание, подведите итоги урока \\
|
|
||||||
\hline
|
|
||||||
@ Рефлексия & 10 tag(end) & @ 57-58 & @ Преподаватель запрашивает обратную связь \\
|
|
||||||
\hline
|
|
||||||
@ Длительность & sum(cell(beg):cell(end)) & & \\
|
|
||||||
\hline
|
|
||||||
\end{spreadtab}
|
|
||||||
|
|
||||||
\subsection{Подробности}
|
|
||||||
\subsubsection{Организационный момент}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
|
|
||||||
\item \textbf{Тайминг:} 3-5 минут.
|
|
||||||
\item \textbf{Действия преподавателя:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Запрашивает активность от аудитории в чате;
|
|
||||||
\item Презентует цели курса и семинара;
|
|
||||||
\item Презентует краткий план семинара и что студент научится делать.
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Quiz}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
|
|
||||||
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
|
|
||||||
\item \textbf{Действия преподавателя:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Преподаватель задаёт вопросы викторины, представленные на слайдах презентации;
|
|
||||||
\item через 30 секунд демонстрирует слайд-подсказку и ожидает ответов.
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Вопросы и ответы:}
|
|
||||||
\begin{enumerate}
|
|
||||||
\item Какое свойство добавляет ключевое слово static полю или методу? (2)
|
|
||||||
\begin{enumerate}
|
|
||||||
\item неизменяемость;
|
|
||||||
\item принадлежность классу;
|
|
||||||
\item принадлежность приложению.
|
|
||||||
\end{enumerate}
|
|
||||||
\item Что быстрее, стек или куча? (1)
|
|
||||||
\begin{enumerate}
|
|
||||||
\item куча;
|
|
||||||
\item стек;
|
|
||||||
\item одинаково.
|
|
||||||
\end{enumerate}
|
|
||||||
\item Для инициализации нового объекта абсолютно идентичными значениями свойств переданного объекта используется (3)
|
|
||||||
\begin{enumerate}
|
|
||||||
\item пустой конструктор;
|
|
||||||
\item конструктор по-умолчанию;
|
|
||||||
\item конструктор копирования.
|
|
||||||
\end{enumerate}
|
|
||||||
\item Инкапсуляция -- это (2)
|
|
||||||
\begin{enumerate}
|
|
||||||
\item архивирование проекта
|
|
||||||
\item сокрытие информации о классе
|
|
||||||
\item создание микросервисной архитектуры
|
|
||||||
\end{enumerate}
|
|
||||||
\item Наследуются от Object (3)
|
|
||||||
\begin{enumerate}
|
|
||||||
\item строки
|
|
||||||
\item потоки ввода-вывода
|
|
||||||
\item и то, и другое
|
|
||||||
\end{enumerate}
|
|
||||||
\item Является ли перегрузка полиморфизмом (2)
|
|
||||||
\begin{enumerate}
|
|
||||||
\item да, это истинный полиморфизм
|
|
||||||
\item да, это часть истинного полиморфизма
|
|
||||||
\item нет, это не полиморфизм
|
|
||||||
\end{enumerate}
|
|
||||||
\end{enumerate}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Рассмотрение ДЗ}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Цель этапа:} Пояснить не очевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
|
|
||||||
\item \textbf{Тайминг:} 15-20 минут.
|
|
||||||
\item \textbf{Действия преподавателя:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Преподаватель демонстрирует свой вариант решения домашнего задания из лекции;
|
|
||||||
\item возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов.
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Домашнее задание из лекции:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Написать класс кота так, чтобы каждому объекту кота присваивался личный порядковый целочисленный номер;
|
|
||||||
|
|
||||||
\textbf{Вариант решения в приложении \ref{appendix:hw1}}
|
|
||||||
|
|
||||||
\item Написать классы кота и собаки, наследники животного. У всех есть три действия: бежать, плыть, прыгать. Действия принимают размер препятствия и возвращают булев результат. Три ограничения: высота прыжка, расстояние, которое животное может пробежать, расстояние, которое животное может проплыть. Следует учесть, что коты не любят воду.
|
|
||||||
|
|
||||||
\textbf{Вариант решения в приложении \ref{appendix:hw2}}
|
|
||||||
|
|
||||||
\item Добавить механизм, создающий 25\% разброс значений каждого ограничения для каждого объекта.
|
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Конструктор с вариативностью}]
|
|
||||||
Animal(String type, String name, float maxJump, float maxRun, float maxSwim) {
|
|
||||||
float jumpDiff = random.nextFloat() * maxJump - (maxJump / 2);
|
|
||||||
float runDiff = random.nextFloat() * maxRun - (maxRun / 2);
|
|
||||||
float swimDiff = random.nextFloat() * maxSwim - (maxSwim / 2);
|
|
||||||
|
|
||||||
this.type = type;
|
|
||||||
this.name = name;
|
|
||||||
this.maxJump = maxJump + jumpDiff;
|
|
||||||
this.maxRun = maxRun + runDiff;
|
|
||||||
this.maxSwim = maxSwim + swimDiff;
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Вопросы и ответы}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе.
|
|
||||||
\item \textbf{Тайминг} 5-15 минут
|
|
||||||
\item \textbf{Действия преподавателя}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
|
|
||||||
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
|
|
||||||
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
|
|
||||||
\item Посоветовать литературу на тему заданного вопроса;
|
|
||||||
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Задание 1}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Ценность этапа} Создание класса и объекта.
|
|
||||||
\item \textbf{Тайминг} 5 минут.
|
|
||||||
\item \textbf{Действия преподавателя}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Первые пять минут уклоняться от ответов на уточняющие вопросы
|
|
||||||
\item Выдать задание студентам;
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Задания}:
|
|
||||||
\begin{itemize}
|
|
||||||
\item Создать класс "Сотрудник" с полями: ФИО, должность, телефон, зарплата, возраст;
|
|
||||||
|
|
||||||
\textbf{Вариант исполнения класса в приложении \ref{appendix:ct1}}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание объекта класса}]
|
|
||||||
Employee employeeIvan = new Employee("Ivan", "Igorevich",
|
|
||||||
"Ovchinnikov", "8(495)000-11-22",
|
|
||||||
"developer", 50000, 1985);
|
|
||||||
\end{lstlisting}
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Задание 2}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Ценность этапа} Манипуляция информацией об объекте.
|
|
||||||
\item \textbf{Тайминг} 10 минут.
|
|
||||||
\item \textbf{Действия преподавателя}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Пояснить студентам ценность этого опыта (отказ от вывода информации в терминал из сторонних объектов);
|
|
||||||
\item Пояснить студентам в каком виде выполнять и сдавать задания;
|
|
||||||
\item Выдать задание группам студентов;
|
|
||||||
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Задания}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Написать функцию выводящую всю доступную информацию об объекте
|
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вывод информации об объекте в консоль}]
|
|
||||||
public void info() {
|
|
||||||
System.out.println("Employee{" +
|
|
||||||
"name='" + name + '\'' +
|
|
||||||
", midName='" + midName + '\'' +
|
|
||||||
", surName='" + surName + '\'' +
|
|
||||||
", position='" + position + '\'' +
|
|
||||||
", phone='" + phone + '\'' +
|
|
||||||
", salary=" + salary +
|
|
||||||
", age=" + getAge() +
|
|
||||||
'}');
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\item [$*_1$] таким образом, чтобы функция возвращала значение;
|
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Возврат информации об объекте}]
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Employee{" +
|
|
||||||
"name='" + name + '\'' +
|
|
||||||
", midName='" + midName + '\'' +
|
|
||||||
", surName='" + surName + '\'' +
|
|
||||||
", position='" + position + '\'' +
|
|
||||||
", phone='" + phone + '\'' +
|
|
||||||
", salary=" + salary +
|
|
||||||
", age=" + getAge() +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\item [$*_2$] с использованием форматирования строк.
|
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Форматированная информация об объекте}]
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return String.format("Employee{" +
|
|
||||||
"name='%s', midName='%s', surName='%s'" +
|
|
||||||
", position='%s', phone='%s'" +
|
|
||||||
", salary=%d, age=%d}'",
|
|
||||||
name, midName, surName, position, phone, salary, getAge());
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Задание 3}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Ценность этапа} Создание и манипуляция множествами объектов.
|
|
||||||
\item \textbf{Тайминг} 20-25 минут.
|
|
||||||
\item \textbf{Действия преподавателя}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Пояснить студентам ценность этого опыта (дополнительно напомнить, что классы создают для программы новый тип данных, а значит объектами можно пользоваться также, как и заранее созданными);
|
|
||||||
\item Пояснить студентам в каком виде выполнять и сдавать задания;
|
|
||||||
\item Выдать задание группам студентов;
|
|
||||||
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Задания}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Создать массив из 5 сотрудников
|
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Простой массив сотрудников}]
|
|
||||||
Employee ivan = new Employee("Ivan", "Igorevich",
|
|
||||||
"Ovchinnikov", "8(495)000-11-22",
|
|
||||||
"developer", 50000, 1985);
|
|
||||||
Employee andrey = new Employee("Andrey", "Viktorovich",
|
|
||||||
"Bezrukov", "8(495)111-22-33",
|
|
||||||
"fitter", 52000, 1973);
|
|
||||||
Employee evgeniy = new Employee("Evgeniy", "Viktorovich",
|
|
||||||
"Delfinov", "8(495)222-33-44",
|
|
||||||
"project manager", 40000, 1963);
|
|
||||||
Employee natalia = new Employee("Natalia", "Pavlovna",
|
|
||||||
"Keks", "8(495)333-44-55",
|
|
||||||
"senior developer", 90000, 1990);
|
|
||||||
Employee tatiana = new Employee("Tatiana", "Sergeevna",
|
|
||||||
"Krasotkina", "8(495)444-55-66",
|
|
||||||
"accountant", 50000, 1983);
|
|
||||||
|
|
||||||
Employee[] company = new Employee[5];
|
|
||||||
company[0] = ivan;
|
|
||||||
company[1] = andrey;
|
|
||||||
company[2] = evgeniy;
|
|
||||||
company[3] = natalia;
|
|
||||||
company[4] = tatiana;
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\item [$*_1$] массив должен быть сразу инициализирован;
|
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Инициализированный массив}]
|
|
||||||
Employee[] employees = { ivan, andrey, evgeniy, natalia, tatiana };
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\item [$*_2$] массив должен быть сразу инициализирован и не должно быть создано дополнительных переменных.
|
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Без дополнительных переменных}]
|
|
||||||
Employee[] employees = {
|
|
||||||
new Employee("Ivan", "Igorevich",
|
|
||||||
"Ovchinnikov", "8(495)000-11-22",
|
|
||||||
"developer", 50000, 1985),
|
|
||||||
new Employee("Andrey", "Viktorovich",
|
|
||||||
"Bezrukov", "8(495)111-22-33",
|
|
||||||
"fitter", 52000, 1973),
|
|
||||||
new Employee("Evgeniy", "Viktorovich",
|
|
||||||
"Delfinov", "8(495)222-33-44",
|
|
||||||
"project manager", 40000, 1963),
|
|
||||||
new Employee("Natalia", "Pavlovna",
|
|
||||||
"Keks", "8(495)333-44-55",
|
|
||||||
"senior developer", 90000, 1990),
|
|
||||||
new Employee("Tatiana", "Sergeevna",
|
|
||||||
"Krasotkina", "8(495)444-55-66",
|
|
||||||
"accountant", 50000, 1983)
|
|
||||||
};
|
|
||||||
\end{lstlisting}
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Задание 4}
|
|
||||||
\begin{itemize}
|
|
||||||
\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) {
|
|
||||||
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++) {
|
|
||||||
Employee.increaser(employees, 45, 5000);
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Задание 5}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Ценность этапа} Соблюдение атомарности методов, независимость методов, манипулирующих данными от окружения.
|
|
||||||
\item \textbf{Тайминг} 10-15 минут.
|
|
||||||
\item \textbf{Действия преподавателя}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Обратить внимание на то, что многие студенты пытаются объединить методы с похожими алгоритмами, но это неверный подход, нужно соблюдать атомарность методов. Важно, чтобы результаты работы не печатались в консоль, а возвращались из методов, чтобы код был переносимым;
|
|
||||||
\item Выдать задание группам студентов;
|
|
||||||
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Задания}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Написать методы (принимающие на вход массив сотрудников), вычисляющие средний возраст и среднюю зарплату сотрудников, вывести результаты работы в консоль.
|
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Методы подсчёта средних}]
|
|
||||||
private static float averageSalary(Employee[] emp) {
|
|
||||||
float result = 0;
|
|
||||||
for (int i = 0; i < emp.length; i++)
|
|
||||||
result += emp[i].getSalary();
|
|
||||||
|
|
||||||
return result / emp.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static float averageAge(Employee[] emp){
|
|
||||||
float result = 0;
|
|
||||||
for (int i = 0; i < emp.length; i++)
|
|
||||||
result += emp[i].getAge();
|
|
||||||
|
|
||||||
return result / emp.length;
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Домашнее задание}
|
|
||||||
\begin{itemize}
|
|
||||||
\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. Написать прототип компаратора - метод внутри класса сотрудника, сравнивающий две даты, представленные в виде трёх чисел гггг-мм-дд, без использования условного оператора.
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Сравнение возраста}]
|
|
||||||
//Employee
|
|
||||||
int bMonth;
|
|
||||||
int bDay;
|
|
||||||
/**
|
|
||||||
* returns
|
|
||||||
* 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) {
|
|
||||||
super(name, midName, surName, phone, position, salary, birth);
|
|
||||||
}
|
|
||||||
public static void increaser(Employee[] emp, int age, int increment) {
|
|
||||||
for (int i = 0; i < emp.length; i++) {
|
|
||||||
if (emp[i].getAge() > age) {
|
|
||||||
if (!(emp[i] instanceof Manager))
|
|
||||||
emp[i].increaseSalary(increment);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Более верное повышение зарплаты}]
|
|
||||||
// main
|
|
||||||
Employee[] employees = { ivan, andrey, evgeniy /*new Manager(...)*/, natalia, tatiana };
|
|
||||||
for (int i = 0; i < employees.length; i++) {
|
|
||||||
Manager.increaser(employees, 45, 5000);
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\end{enumerate}
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Рефлексия и завершение семинара}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
|
|
||||||
\item \textbf{Тайминг:} 5-10 минут
|
|
||||||
\item \textbf{Действия преподавателя:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Запросить обратную связь от студентов.
|
|
||||||
\item Подчеркните то, чему студенты научились на занятии.
|
|
||||||
\item Дайте рекомендации по решению заданий, если в этом есть необходимость
|
|
||||||
\item Дайте краткую обратную связь студентам.
|
|
||||||
\item Поделитесь ощущением от семинара.
|
|
||||||
\item Поблагодарите за проделанную работу.
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\newpage
|
|
||||||
\appendix
|
|
||||||
\section*{Приложения}
|
|
||||||
\addcontentsline{toc}{section}{Приложения}
|
|
||||||
\renewcommand{\thesubsection}{\Asbuk{subsection}}
|
|
||||||
|
|
||||||
\subsection{Домашнее задание 1}
|
|
||||||
\label{appendix:hw1}
|
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Кот}]{src/s03-hw1-cat.java}
|
|
||||||
\subsection{Домашнее задание 2}
|
|
||||||
\label{appendix:hw2}
|
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Общий класс животного}]{src/s03-hw2-animal.java}
|
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Кот}]{src/s03-hw2-cat.java}
|
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Собака}]{src/s03-hw2-dog.java}
|
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Марафон}]{src/s03-hw2-marathon.java}
|
|
||||||
\subsection{Практическое задание 1}
|
|
||||||
\label{appendix:ct1}
|
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Сотрудник}]{src/s03-ct1-employee.java}
|
|
||||||
|
|
||||||
\end{document}
|
|
|
@ -1,454 +0,0 @@
|
||||||
\documentclass[../j-spec.tex]{subfiles}
|
|
||||||
\usepackage{spreadtab}
|
|
||||||
|
|
||||||
\begin{document}
|
|
||||||
\setcounter{section}{3}
|
|
||||||
\section{Семинар: обработка исключений}
|
|
||||||
\subsection{Инструментарий}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \href{https://docs.google.com}{Презентация} для преподавателя, ведущего семинар;
|
|
||||||
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
|
|
||||||
\item JDK любая 11 версии и выше;
|
|
||||||
\item \href{https://www.jetbrains.com/idea/download}{IntelliJ IDEA Community Edition} для практики и примеров используется IDEA.
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsection{Цели семинара}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Закрепить полученные на лекции знания об исключениях;
|
|
||||||
\item Попрактиковаться в написании собственных классов исключений;
|
|
||||||
\item Создание, выбрасывание и обработка исключений;
|
|
||||||
\item Обработка исключений в стиле «до захвата ресурса»;
|
|
||||||
\item Проброс исключений выше по стеку.
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsection{План-содержание}
|
|
||||||
\noindent
|
|
||||||
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
|
|
||||||
\hline
|
|
||||||
@ Что происходит & @ Время & @ Слайды & @ Описание \\
|
|
||||||
\hline
|
|
||||||
\endhead
|
|
||||||
@ Организационный момент & 5 tag(beg) & @ 1-5 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
|
|
||||||
\hline
|
|
||||||
@ Quiz & 10 & @ 6-18 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (6 вопросов, по минуте на ответ) \\
|
|
||||||
\hline
|
|
||||||
@ Рассмотрение ДЗ лекции & 10 & @ 19-23 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
|
|
||||||
\hline
|
|
||||||
@ Вопросы и ответы & 10 & @ 24 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
|
|
||||||
\hline
|
|
||||||
@ Задание 1 & 30 & @ 25-28 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
|
|
||||||
\hline
|
|
||||||
@ Перерыв (если нужен) & 5 & @ 33 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
|
|
||||||
\hline
|
|
||||||
@ Задание 2 & 30 & @ 29-32 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
|
|
||||||
\hline
|
|
||||||
@ Домашнее задание & 5 & @ 45-46 & @ Объясните домашнее задание, подведите итоги урока \\
|
|
||||||
\hline
|
|
||||||
@ Рефлексия & 10 tag(end) & @ 47-48 & @ Преподаватель запрашивает обратную связь \\
|
|
||||||
\hline
|
|
||||||
@ Длительность & sum(cell(beg):cell(end)) & & \\
|
|
||||||
\hline
|
|
||||||
\end{spreadtab}
|
|
||||||
|
|
||||||
\subsection{Подробности}
|
|
||||||
\subsubsection{Организационный момент}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
|
|
||||||
\item \textbf{Тайминг:} 3-5 минут.
|
|
||||||
\item \textbf{Действия преподавателя:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Запрашивает активность от аудитории в чате;
|
|
||||||
\item Презентует цели курса и семинара;
|
|
||||||
\item Презентует краткий план семинара и что студент научится делать.
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Quiz}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
|
|
||||||
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
|
|
||||||
\item \textbf{Действия преподавателя:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Преподаватель задаёт вопросы викторины, представленные на слайдах презентации;
|
|
||||||
\item через 30 секунд демонстрирует слайд-подсказку и ожидает ответов.
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Вопросы и ответы:}
|
|
||||||
\begin{enumerate}
|
|
||||||
\item
|
|
||||||
\begin{enumerate}
|
|
||||||
\item
|
|
||||||
\item
|
|
||||||
\item
|
|
||||||
\end{enumerate}
|
|
||||||
\item
|
|
||||||
\begin{enumerate}
|
|
||||||
\item
|
|
||||||
\item
|
|
||||||
\item
|
|
||||||
\end{enumerate}
|
|
||||||
\end{enumerate}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Рассмотрение ДЗ}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Цель этапа:} Пояснить не очевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
|
|
||||||
\item \textbf{Тайминг:} 15-20 минут.
|
|
||||||
\item \textbf{Действия преподавателя:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Преподаватель демонстрирует свой вариант решения домашнего задания из лекции;
|
|
||||||
\item возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов.
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Домашнее задание из лекции:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Напишите два наследника класса \code{Exception}: ошибка преобразования строки и ошибка преобразования столбца.
|
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Конструктор с вариативностью}]
|
|
||||||
private static final class ColumnMismatchException extends RuntimeException {
|
|
||||||
ColumnMismatchException(String message) {
|
|
||||||
super("Columns exception: " + message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class NumberIsNotNumberException extends RuntimeException {
|
|
||||||
NumberIsNotNumberException(String message) {
|
|
||||||
super("Not a number found: " + message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\item Разработайте исключения-наследники так, чтобы они информировали пользователя в формате ожидание/реальность.
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Конструктор с вариативностью}]
|
|
||||||
private static final class RowMismatchException extends RuntimeException {
|
|
||||||
RowMismatchException(int expected, int current, String value) {
|
|
||||||
super(String.format("Rows exception: expected %d rows. Received %d rows in '%s' string",
|
|
||||||
expected, current, value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\item для проверки напишите программу, преобразующую квадратный массив целых чисел 5х5 в сумму чисел в этом массиве, при этом, программа должна выбросить исключение, если строк или столбцов в исходном массиве окажется не 5.
|
|
||||||
|
|
||||||
\textbf{Вариант решения представлен в приложении \ref{appendix:hw3}}
|
|
||||||
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Вопросы и ответы}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
|
|
||||||
\item \textbf{Тайминг} 5-15 минут
|
|
||||||
\item \textbf{Действия преподавателя}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
|
|
||||||
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
|
|
||||||
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
|
|
||||||
\item Посоветовать литературу на тему заданного вопроса;
|
|
||||||
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Задание 1}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Ценность этапа} Написание почти полноценной механики по краткому ТЗ.
|
|
||||||
\item \textbf{Тайминг} 25-30 минут.
|
|
||||||
\item \textbf{Действия преподавателя}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Выдать задание студентам;
|
|
||||||
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций.
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Задание}: Класс «Проверка логина и пароля».
|
|
||||||
\begin{enumerate}
|
|
||||||
\item Создать статический метод который принимает на вход три параметра: \code{login}, \code{password} и \code{confirmPassword}.
|
|
||||||
\item Длина \code{login} должна быть \textbf{меньше} 20 символов. Если \code{login} не соответствует этому требованию, необходимо выбросить \code{WrongLoginException}.
|
|
||||||
\item Длина \code{password} должна быть \textbf{не меньше} 20 символов. Также \code{password} и \code{confirmPassword} должны быть равны. Если \code{password} не соответствует этим требованиям, необходимо выбросить \code{WrongPasswordException}.
|
|
||||||
\item \code{WrongPasswordException} и \code{WrongLoginException} -- пользовательские классы исключения с двумя конструкторами –- один по умолчанию, второй принимает параметры исключения (неверные данные) и возвращает пользователю в виде «ожидалось/фактически».
|
|
||||||
\item В основном классе программы необходимо по-разному обработать исключения.
|
|
||||||
\item Метод возвращает \code{true}, если значения верны или \code{false} в противном случае.
|
|
||||||
\end{enumerate}
|
|
||||||
\textbf{Вариант исполнения класса в приложении \ref{appendix:ct1}}
|
|
||||||
|
|
||||||
\textbf{Вариант маршрута решения задачи}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Описание класса исключения логина}]
|
|
||||||
public static class WrongLoginException extends RuntimeException {
|
|
||||||
private int currentLength;
|
|
||||||
public WrongLoginException(int currentLength) {
|
|
||||||
super();
|
|
||||||
this.currentLength = currentLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getMessage() {
|
|
||||||
return String.format("Your login is of incorrect length, expected < 20, given %d.",
|
|
||||||
currentLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Формирование сообщения для класса исключения пароля}]
|
|
||||||
public static class WrongPasswordException extends RuntimeException {
|
|
||||||
private int currentLength;
|
|
||||||
private boolean matchConfirm;
|
|
||||||
public WrongPasswordException(int currentLength, boolean matchConfirm) {
|
|
||||||
super();
|
|
||||||
this.currentLength = currentLength;
|
|
||||||
this.matchConfirm = matchConfirm;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getMessage() {
|
|
||||||
boolean badlen = currentLength <= 20;
|
|
||||||
return String.format("Your password is of %scorrect length%s %d. Password %smatch the confirmation.",
|
|
||||||
((badlen) ? "in" : ""),
|
|
||||||
((badlen) ? ", expected > 20, given" : ","),
|
|
||||||
currentLength,
|
|
||||||
(matchConfirm) ? "" : "doesn't ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание тестовой среды}]
|
|
||||||
public static void main(String[] args) {
|
|
||||||
String[][] credentials = {
|
|
||||||
{"ivan", "1i2v3a4n5i6v7a8n91011", "1i2v3a4n5i6v7a8n91011"}, //correct
|
|
||||||
{"1i2v3a4n5i6v7a8n91011", "", ""}, //wrong login length
|
|
||||||
{"ivan", "1i2v3a4n5i6v7a8n91011", "1i2v3a4n5"}, //confirm mismatch
|
|
||||||
{"ivan", "1i2v3a4n5", "1i2v3a4n5"},//wrong password length
|
|
||||||
{"ivan", "1i2v3a4n5", "1i"} //wrong password length and confirm mismatch
|
|
||||||
};
|
|
||||||
for (int i = 0; i < credentials.length; i++) {
|
|
||||||
try {
|
|
||||||
System.out.println(checkCredentials(credentials[i][0], credentials[i][1], credentials[i][2]));
|
|
||||||
} catch (WrongLoginException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (WrongPasswordException e) {
|
|
||||||
System.out.println(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Метод проверки}]
|
|
||||||
public static boolean checkCredentials(String login, String password, String confirmPassword) {
|
|
||||||
boolean conf = password.equals(confirmPassword);
|
|
||||||
int llen = login.length();
|
|
||||||
int plen = password.length();
|
|
||||||
if (llen >= 20)
|
|
||||||
throw new WrongLoginException(llen);
|
|
||||||
else if (plen < 20 || !conf)
|
|
||||||
throw new WrongPasswordException(plen, conf);
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Задание 2}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Ценность этапа} Написание наброска пет-проекта, повторение информации об ООП, работа с исключениями.
|
|
||||||
\item \textbf{Тайминг} 25-30 минут.
|
|
||||||
\item \textbf{Действия преподавателя}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Выдать задание студентам;
|
|
||||||
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций.
|
|
||||||
\item обратить внимание на порядок обработки исключений, повторная попытка купить товар может производиться только тогда, когда остальные параметры покупки уже проверены.
|
|
||||||
\end{itemize}
|
|
||||||
\item \textbf{Задание}: Класс «Эмуляция интернет-магазина».
|
|
||||||
\begin{enumerate}
|
|
||||||
\item Написать классы покупатель (ФИО, возраст, телефон), товар (название, цена) и заказ (объект покупатель, объект товар, целочисленное количество).
|
|
||||||
\item Создать массив покупателей (инициализировать 2 элемента), массив товаров (инициализировать 5 элементов) и массив заказов (пустой на 5 элементов).
|
|
||||||
\item Создать статический метод «совершить покупку» со строковыми параметрами, соответствующими полям объекта заказа. Метод должен вернуть объект заказа.
|
|
||||||
\item Если в метод передан несуществующий покупатель -- метод должен выбросить исключение \code{CustomerException}, если передан несуществующий товар, метод должен выбросить исключение \code{ProductException}, если было передано отрицательное или слишком больше значение количества (например, 100), метод должен выбросить исключение \code{AmountException}.
|
|
||||||
\item Вызвать метод совершения покупки несколько раз таким образом, чтобы заполнить массив покупок возвращаемыми значениями. Обработать исключения следующим образом (в заданном порядке):
|
|
||||||
\begin{itemize}
|
|
||||||
\item если был передан неверный товар -- вывести в консоль сообщение об ошибке, не совершать данную покупку;
|
|
||||||
\item если было передано неверное количество -- купить товар в количестве 1;
|
|
||||||
\item если был передан неверный пользователь -- завершить работу приложения с исключением.
|
|
||||||
\end{itemize}
|
|
||||||
\item Вывести в консоль итоговое количество совершённых покупок после выполнения основного кода приложения.
|
|
||||||
\end{enumerate}
|
|
||||||
\textbf{Вариант исполнения класса в приложении \ref{appendix:ct1}}
|
|
||||||
|
|
||||||
\textbf{Вариант маршрута решения задачи}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание базовых классов (идентично)}]
|
|
||||||
private static class Item {
|
|
||||||
String name;
|
|
||||||
int cost;
|
|
||||||
|
|
||||||
public Item(String name, int cost) {
|
|
||||||
this.name = name;
|
|
||||||
this.cost = cost;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Item{name='" + name + "', cost=" + cost + "}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание пользовательских исключений}]
|
|
||||||
public static class CustomerException extends RuntimeException {
|
|
||||||
public CustomerException(String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание массивов}]
|
|
||||||
private final static Customer[] people = {
|
|
||||||
new Customer("Ivan", 20, "+1-222-333-44-55"),
|
|
||||||
new Customer("Petr", 30, "+2-333-444-55-66"),
|
|
||||||
};
|
|
||||||
private final static Item[] items = {
|
|
||||||
new Item("Ball", 100),
|
|
||||||
new Item("Sandwich", 1000),
|
|
||||||
new Item("Table", 10000),
|
|
||||||
new Item("Car", 100000),
|
|
||||||
new Item("Rocket", 10000000)
|
|
||||||
};
|
|
||||||
private static Order[] orders = new Order[5];
|
|
||||||
\end{lstlisting}
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Описание тестовой среды}]
|
|
||||||
Object[][] info = {
|
|
||||||
{people[0], items[0], 1}, //good
|
|
||||||
{people[1], items[1], -1}, //bad amount -1
|
|
||||||
{people[0], items[2], 150}, //bad amount >100
|
|
||||||
{people[1], new Item("Flower", 10), 1}, //no item
|
|
||||||
{new Customer("Fedor", 40, "+3-444-555-66-77"), items[3], 1}, //no customer
|
|
||||||
};
|
|
||||||
int capacity = 0;
|
|
||||||
int i = 0;
|
|
||||||
while (capacity != orders.length - 1 || i != info.length) {
|
|
||||||
try {
|
|
||||||
orders[capacity] = buy((Customer) info[i][0], (Item) info[i][1], (int) info[i][2]);
|
|
||||||
capacity++;
|
|
||||||
} catch (ProductException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (AmountException e) {
|
|
||||||
orders[capacity++] = buy((Customer) info[i][0], (Item) info[i][1], 1);
|
|
||||||
} catch (CustomerException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} finally {
|
|
||||||
System.out.println("Orders made: " + capacity);
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Написание и отладка основного метода}]
|
|
||||||
private static boolean isInArray(Object[] arr, Object o) {
|
|
||||||
for (int i = 0; i < arr.length; i++)
|
|
||||||
if (arr[i].equals(o)) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Order buy(Customer who, Item what, int howMuch) {
|
|
||||||
if (!isInArray(people, who))
|
|
||||||
throw new CustomerException("Unknown customer: " + who);
|
|
||||||
if (!isInArray(items, what))
|
|
||||||
throw new ProductException("Unknown item: " + what);
|
|
||||||
if (howMuch < 0 || howMuch > 100)
|
|
||||||
throw new AmountException("Incorrect amount: " + howMuch);
|
|
||||||
return new Order(who, what, howMuch);
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Домашнее задание}
|
|
||||||
\begin{itemize}
|
|
||||||
\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 [15 мин] 1. В класс покупателя добавить перечисление с гендерами, добавить в сотрудника свойство «пол» со значением созданного перечисления. Добавить геттеры, сеттеры.
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Свойства сотрудника}]
|
|
||||||
enum Genders{MALE, FEMALE};
|
|
||||||
|
|
||||||
// ...
|
|
||||||
Genders gender;
|
|
||||||
|
|
||||||
public Employee(String name, String midName, String surName, String phone, String position, int salary, int birth, Genders gender) {
|
|
||||||
// ...
|
|
||||||
this.gender = gender;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Genders getGender() {
|
|
||||||
return gender;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGender(Genders gender) {
|
|
||||||
this.gender = gender;
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\item [20-25 мин] 2. Добавить в основную программу перечисление с праздниками (нет праздника, Новый Год, 8 марта, 23 февраля), написать метод, принимающий массив сотрудников, поздравляющий всех сотрудников с Новым Годом, женщин с 8 марта, а мужчин с 23 февраля, если сегодня соответствующий день.
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Праздники}]
|
|
||||||
enum Parties{NONE, NEW_YEAR, MARCH_8, FEB_23}
|
|
||||||
private static final Parties today = Parties.NONE;
|
|
||||||
|
|
||||||
private static void celebrate(Employee[] emp) {
|
|
||||||
for (int i = 0; i < emp.length; i++) {
|
|
||||||
switch (today) {
|
|
||||||
case NEW_YEAR:
|
|
||||||
System.out.println(emp[i].name + ", happy New Year!");
|
|
||||||
break;
|
|
||||||
case FEB_23:
|
|
||||||
if (emp[i].gender == Employee.Genders.MALE)
|
|
||||||
System.out.println(emp[i].name + ", happy February 23rd!");
|
|
||||||
break;
|
|
||||||
case MARCH_8:
|
|
||||||
if (emp[i].gender == Employee.Genders.FEMALE)
|
|
||||||
System.out.println(emp[i].name + ", happy march 8th!");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
System.out.println(emp[i].name + ", celebrate this morning!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
\end{enumerate}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsubsection{Рефлексия и завершение семинара}
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
|
|
||||||
\item \textbf{Тайминг:} 5-10 минут
|
|
||||||
\item \textbf{Действия преподавателя:}
|
|
||||||
\begin{itemize}
|
|
||||||
\item Запросить обратную связь от студентов.
|
|
||||||
\item Подчеркните то, чему студенты научились на занятии.
|
|
||||||
\item Дайте рекомендации по решению заданий, если в этом есть необходимость
|
|
||||||
\item Дайте краткую обратную связь студентам.
|
|
||||||
\item Поделитесь ощущением от семинара.
|
|
||||||
\item Поблагодарите за проделанную работу.
|
|
||||||
\end{itemize}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\newpage
|
|
||||||
\appendix
|
|
||||||
\section*{Приложения}
|
|
||||||
\addcontentsline{toc}{section}{Приложения}
|
|
||||||
\renewcommand{\thesubsection}{\Asbuk{subsection}}
|
|
||||||
|
|
||||||
\subsection{Домашнее задание 3}
|
|
||||||
\label{appendix:hw3}
|
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основная программа}]{src/s04-hw3-exceptional.java}
|
|
||||||
|
|
||||||
\subsection{Практическое задание 1}
|
|
||||||
\label{appendix:ct1}
|
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Логин}]{src/s04-ct1-sign.java}
|
|
||||||
|
|
||||||
\subsection{Практическое задание 2}
|
|
||||||
\label{appendix:ct2}
|
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Магазин}]{src/s04-ct2-shop.java}
|
|
||||||
|
|
||||||
\end{document}
|
|
|
@ -1,64 +0,0 @@
|
||||||
package ru.gb.jcore;
|
|
||||||
|
|
||||||
public class Employee {
|
|
||||||
private static final int CURRENT_YEAR = 2022;
|
|
||||||
String name;
|
|
||||||
String midName;
|
|
||||||
String surName;
|
|
||||||
String position;
|
|
||||||
String phone;
|
|
||||||
int salary;
|
|
||||||
int birth;
|
|
||||||
|
|
||||||
public Employee(String name, String midName, String surName,
|
|
||||||
String phone, String position, int salary, int birth) {
|
|
||||||
this.name = name;
|
|
||||||
this.midName = midName;
|
|
||||||
this.surName = surName;
|
|
||||||
this.position = position;
|
|
||||||
this.phone = phone;
|
|
||||||
this.salary = salary;
|
|
||||||
this.birth = birth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMidName() {
|
|
||||||
return midName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSurName() {
|
|
||||||
return surName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPosition() {
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPosition(String position) {
|
|
||||||
this.position = position;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPhone() {
|
|
||||||
return phone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPhone(String phone) {
|
|
||||||
this.phone = phone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSalary() {
|
|
||||||
return salary;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSalary(int salary) {
|
|
||||||
this.salary = salary;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getAge() {
|
|
||||||
return CURRENT_YEAR - birth;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
package ru.gb.jcore;
|
|
||||||
|
|
||||||
public class Cat {
|
|
||||||
private static final int CURRENT_YEAR = 2022;
|
|
||||||
private static int id = 0;
|
|
||||||
|
|
||||||
private String name;
|
|
||||||
private String color;
|
|
||||||
private int birthYear;
|
|
||||||
public int uid;
|
|
||||||
|
|
||||||
Cat (String name, String color, int age) {
|
|
||||||
setBirth(age);
|
|
||||||
this.name = name;
|
|
||||||
this.color = color;
|
|
||||||
this.uid = ++id;
|
|
||||||
}
|
|
||||||
private void setBirth(int age) {
|
|
||||||
this.birthYear = CURRENT_YEAR - age;
|
|
||||||
}
|
|
||||||
public int getUid() {
|
|
||||||
return uid;
|
|
||||||
}
|
|
||||||
public String getColor() {
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
public int getAge() {
|
|
||||||
return CURRENT_YEAR - birthYear;
|
|
||||||
}
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,50 +0,0 @@
|
||||||
package ru.gb.jcore.marathon;
|
|
||||||
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
public abstract class Animal {
|
|
||||||
|
|
||||||
static final int SWIM_FAIL = 0;
|
|
||||||
static final int SWIM_OK = 1;
|
|
||||||
static final int SWIM_WTF = -1;
|
|
||||||
|
|
||||||
private String type;
|
|
||||||
private String name;
|
|
||||||
private float maxRun;
|
|
||||||
private float maxSwim;
|
|
||||||
private float maxJump;
|
|
||||||
private final Random random = new Random();
|
|
||||||
|
|
||||||
Animal(String type, String name, float maxJump, float maxRun, float maxSwim) {
|
|
||||||
this.type = type;
|
|
||||||
this.name = name;
|
|
||||||
this.maxJump = maxJump;
|
|
||||||
this.maxRun = maxRun;
|
|
||||||
this.maxSwim = maxSwim;
|
|
||||||
}
|
|
||||||
|
|
||||||
String getName() {
|
|
||||||
return this.name;
|
|
||||||
}
|
|
||||||
String getType() {
|
|
||||||
return this.type;
|
|
||||||
}
|
|
||||||
float getMaxRun() {
|
|
||||||
return this.maxRun;
|
|
||||||
}
|
|
||||||
float getMaxSwim() {
|
|
||||||
return this.maxSwim;
|
|
||||||
}
|
|
||||||
float getMaxJump() {
|
|
||||||
return this.maxJump;
|
|
||||||
}
|
|
||||||
protected boolean run(float distance) {
|
|
||||||
return (distance <= maxRun);
|
|
||||||
}
|
|
||||||
protected int swim(float distance) {
|
|
||||||
return (distance <= maxSwim) ? SWIM_OK : SWIM_FAIL;
|
|
||||||
}
|
|
||||||
protected boolean jump(float height) {
|
|
||||||
return (height <= maxJump);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
package ru.gb.jcore.marathon;
|
|
||||||
|
|
||||||
public class Cat extends Animal {
|
|
||||||
|
|
||||||
Cat(String name) {
|
|
||||||
super("Cat", name, 2, 200, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int swim(float distance) {
|
|
||||||
return Animal.SWIM_WTF;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
package ru.gb.jcore.marathon;
|
|
||||||
|
|
||||||
class Dog extends Animal {
|
|
||||||
|
|
||||||
Dog(String name, float maxJump, float maxRun, float maxSwim) {
|
|
||||||
super("Dog", name, maxJump, maxRun, maxSwim);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
package ru.gb.jcore.marathon;
|
|
||||||
|
|
||||||
public class Marathon {
|
|
||||||
public static void main(String[] args) {
|
|
||||||
|
|
||||||
Cat c = new Cat("Barseek");
|
|
||||||
Cat c0 = new Cat("Moorzeek");
|
|
||||||
Dog d = new Dog("Toozeek", 0.5f, 500, 10);
|
|
||||||
Dog d0 = new Dog("Shaareek", 0.5f, 500, 10);
|
|
||||||
|
|
||||||
Animal[] arr = {c, c0, d, d0};
|
|
||||||
float toJump = 1.5f;
|
|
||||||
float toRun = 350;
|
|
||||||
float toSwim = 5;
|
|
||||||
|
|
||||||
for (int i = 0; i < arr.length; i++) {
|
|
||||||
String nameString = arr[i].getType() + " " + arr[i].getName() + " can ";
|
|
||||||
|
|
||||||
String eventName = String.format("jump max %.2fm. Tries to jump ", arr[i].getMaxJump());
|
|
||||||
String eventResult = (arr[i].jump(toJump)) ? "succeed" : "fails";
|
|
||||||
System.out.println(nameString + eventName + toJump + "m and " + eventResult);
|
|
||||||
|
|
||||||
eventName = String.format("run max %.2fm. Tries to run ", arr[i].getMaxRun());
|
|
||||||
eventResult = arr[i].run(toRun) ? "succeed" : "fails";
|
|
||||||
System.out.println(nameString + eventName + toRun + "m and " + eventResult);
|
|
||||||
|
|
||||||
int swimResult = arr[i].swim(toSwim);
|
|
||||||
eventName = String.format("swim max %.2fm. Tries to swim ", arr[i].getMaxSwim());
|
|
||||||
eventResult = (swimResult == Animal.SWIM_OK) ? "succeed" : "fails";
|
|
||||||
if (swimResult == Animal.SWIM_WTF)
|
|
||||||
eventResult = "too scared to enter the water";
|
|
||||||
System.out.println(nameString + eventName + toSwim + "m and " + eventResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
package ru.gb.jcore;
|
|
||||||
|
|
||||||
public class SignInWorker {
|
|
||||||
public static class WrongPasswordException extends RuntimeException {
|
|
||||||
private int currentLength;
|
|
||||||
private boolean matchConfirm;
|
|
||||||
public WrongPasswordException(int currentLength, boolean matchConfirm) {
|
|
||||||
super();
|
|
||||||
this.currentLength = currentLength;
|
|
||||||
this.matchConfirm = matchConfirm;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getMessage() {
|
|
||||||
boolean badlen = currentLength <= 20;
|
|
||||||
return String.format("Your password is of %scorrect length%s %d. Password %smatch the confirmation.",
|
|
||||||
((badlen) ? "in" : ""),
|
|
||||||
((badlen) ? ", expected > 20, given" : ","),
|
|
||||||
currentLength,
|
|
||||||
(matchConfirm) ? "" : "doesn't ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class WrongLoginException extends RuntimeException {
|
|
||||||
private int currentLength;
|
|
||||||
public WrongLoginException(int currentLength) {
|
|
||||||
super();
|
|
||||||
this.currentLength = currentLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getMessage() {
|
|
||||||
return String.format("Your login is of incorrect length, expected < 20, given %d.",
|
|
||||||
currentLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean checkCredentials(String login, String password, String confirmPassword) {
|
|
||||||
boolean conf = password.equals(confirmPassword);
|
|
||||||
int llen = login.length();
|
|
||||||
int plen = password.length();
|
|
||||||
if (llen >= 20)
|
|
||||||
throw new WrongLoginException(llen);
|
|
||||||
else if (plen < 20 || !conf)
|
|
||||||
throw new WrongPasswordException(plen, conf);
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
String[][] credentials = {
|
|
||||||
{"ivan", "1i2v3a4n5i6v7a8n91011", "1i2v3a4n5i6v7a8n91011"}, //correct
|
|
||||||
{"1i2v3a4n5i6v7a8n91011", "", ""}, //wrong login length
|
|
||||||
{"ivan", "1i2v3a4n5i6v7a8n91011", "1i2v3a4n5"}, //confirm mismatch
|
|
||||||
{"ivan", "1i2v3a4n5", "1i2v3a4n5"},//wrong password length
|
|
||||||
{"ivan", "1i2v3a4n5", "1i"} //wrong password length and confirm mismatch
|
|
||||||
};
|
|
||||||
for (int i = 0; i < credentials.length; i++) {
|
|
||||||
try {
|
|
||||||
System.out.println(checkCredentials(credentials[i][0], credentials[i][1], credentials[i][2]));
|
|
||||||
} catch (WrongLoginException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (WrongPasswordException e) {
|
|
||||||
System.out.println(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,124 +0,0 @@
|
||||||
package ru.gb.jcore;
|
|
||||||
|
|
||||||
public class Shop {
|
|
||||||
/**
|
|
||||||
* Вызвать метод совершения покупки несколько раз таким образом,
|
|
||||||
* чтобы заполнить массив покупок возвращаемыми значениями.
|
|
||||||
* Обработать исключения следующим образом (в заданном порядке):
|
|
||||||
* */
|
|
||||||
private static class Customer {
|
|
||||||
String name;
|
|
||||||
int age;
|
|
||||||
String phone;
|
|
||||||
|
|
||||||
public Customer(String name, int age, String phone) {
|
|
||||||
this.name = name;
|
|
||||||
this.age = age;
|
|
||||||
this.phone = phone;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Customer{name='" + name + '\'' +
|
|
||||||
", age=" + age + ", phone='" + phone + "'}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private static class Item {
|
|
||||||
String name;
|
|
||||||
int cost;
|
|
||||||
|
|
||||||
public Item(String name, int cost) {
|
|
||||||
this.name = name;
|
|
||||||
this.cost = cost;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Item{name='" + name + "', cost=" + cost + "}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class Order {
|
|
||||||
Customer customer;
|
|
||||||
Item item;
|
|
||||||
int amount;
|
|
||||||
|
|
||||||
public Order(Customer customer, Item item, int amount) {
|
|
||||||
this.customer = customer;
|
|
||||||
this.item = item;
|
|
||||||
this.amount = amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Order{customer=" + customer +
|
|
||||||
", item=" + item + ", amount=" + amount + "}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class CustomerException extends RuntimeException {
|
|
||||||
public CustomerException(String message) { super(message); }
|
|
||||||
}
|
|
||||||
public static class ProductException extends RuntimeException {
|
|
||||||
public ProductException(String message) { super(message); }
|
|
||||||
}
|
|
||||||
public static class AmountException extends RuntimeException {
|
|
||||||
public AmountException(String message) { super(message); }
|
|
||||||
}
|
|
||||||
|
|
||||||
private final static Customer[] people = {
|
|
||||||
new Customer("Ivan", 20, "+1-222-333-44-55"),
|
|
||||||
new Customer("Petr", 30, "+2-333-444-55-66"),
|
|
||||||
};
|
|
||||||
private final static Item[] items = {
|
|
||||||
new Item("Ball", 100),
|
|
||||||
new Item("Sandwich", 1000),
|
|
||||||
new Item("Table", 10000),
|
|
||||||
new Item("Car", 100000),
|
|
||||||
new Item("Rocket", 10000000)
|
|
||||||
};
|
|
||||||
private static Order[] orders = new Order[5];
|
|
||||||
|
|
||||||
private static boolean isInArray(Object[] arr, Object o) {
|
|
||||||
for (int i = 0; i < arr.length; i++)
|
|
||||||
if (arr[i].equals(o)) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Order buy(Customer who, Item what, int howMuch) {
|
|
||||||
if (!isInArray(people, who))
|
|
||||||
throw new CustomerException("Unknown customer: " + who);
|
|
||||||
if (!isInArray(items, what))
|
|
||||||
throw new ProductException("Unknown item: " + what);
|
|
||||||
if (howMuch < 0 || howMuch > 100)
|
|
||||||
throw new AmountException("Incorrect amount: " + howMuch);
|
|
||||||
return new Order(who, what, howMuch);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
Object[][] info = {
|
|
||||||
{people[0], items[0], 1}, //good
|
|
||||||
{people[1], items[1], -1}, //bad amount -1
|
|
||||||
{people[0], items[2], 150}, //bad amount >100
|
|
||||||
{people[1], new Item("Flower", 10), 1}, //no item
|
|
||||||
{new Customer("Fedor", 40, "+3-444-555-66-77"), items[3], 1}, //no customer
|
|
||||||
};
|
|
||||||
int capacity = 0;
|
|
||||||
int i = 0;
|
|
||||||
while (capacity != orders.length - 1 || i != info.length) {
|
|
||||||
try {
|
|
||||||
orders[capacity] = buy((Customer) info[i][0], (Item) info[i][1], (int) info[i][2]);
|
|
||||||
capacity++;
|
|
||||||
} catch (ProductException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (AmountException e) {
|
|
||||||
orders[capacity++] = buy((Customer) info[i][0], (Item) info[i][1], 1);
|
|
||||||
} catch (CustomerException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} finally {
|
|
||||||
System.out.println("Orders made: " + capacity);
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,79 +0,0 @@
|
||||||
package ru.gb.jcore;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
public class Exceptional {
|
|
||||||
private static final class ColumnMismatchException extends RuntimeException {
|
|
||||||
ColumnMismatchException(String message) {
|
|
||||||
super("Columns exception: " + message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class NumberIsNotNumberException extends RuntimeException {
|
|
||||||
NumberIsNotNumberException(String message) {
|
|
||||||
super("Not a number found: " + message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class RowMismatchException extends RuntimeException {
|
|
||||||
RowMismatchException(int expected, int current, String value) {
|
|
||||||
super(String.format("Rows exception: expected %d rows. Received %d rows in '%s' string",
|
|
||||||
expected, current, value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String CORRECT_STRING= "1 3 1 2\n2 3 2 2\n5 6 7 1\n3 3 1 0";
|
|
||||||
private static final String EXTRA_ROW_STRING= "1 3 1 2\n2 3 2 2\n5 6 7 1\n3 3 1 0\n1 2 3 4";
|
|
||||||
private static final String EXTRA_COL_STRING= "1 3 1 2 1\n2 3 2 2 1\n5 6 7 1 1\n3 3 1 0 1";
|
|
||||||
private static final String NO_ROW_STRING= "1 3 1 2\n2 3 2 2\n5 6 7 1";
|
|
||||||
private static final String NO_COL_STRING= "1 3 1 2\n2 3 2 2\n5 6 7 1\n3 3 1";
|
|
||||||
private static final String HAS_CHAR_STRING= "1 3 1 2\n2 3 2 2\n5 6 7 1\n3 3 1 A";
|
|
||||||
|
|
||||||
private static final int MATRIX_ROWS= 4;
|
|
||||||
private static final int MATRIX_COLS= 4;
|
|
||||||
|
|
||||||
private static String[][] stringToMatrix(String value) {
|
|
||||||
String[] rows = value.split("\n");
|
|
||||||
if (rows.length !=MATRIX_ROWS)
|
|
||||||
throw new RowMismatchException(MATRIX_ROWS, rows.length, value);
|
|
||||||
|
|
||||||
String[][] result = new String[MATRIX_ROWS][];
|
|
||||||
for (int i = 0; i < result.length; i++) {
|
|
||||||
result[i] = rows[i].split(" ");
|
|
||||||
if (result[i].length !=MATRIX_COLS)
|
|
||||||
throw new ColumnMismatchException(result[i].length + ":\n" + value);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static float calcMatrix(String[][] matrix) {
|
|
||||||
float result = 0;
|
|
||||||
int len = 0;
|
|
||||||
for (int i = 0; i < matrix.length; i++) {
|
|
||||||
for (int j = 0; j < matrix[i].length; j++) {
|
|
||||||
try {
|
|
||||||
result += Integer.parseInt(matrix[i][j]);
|
|
||||||
++len;
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
throw new NumberIsNotNumberException(matrix[i][j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result / len;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
try {
|
|
||||||
// final String[][] matrix = stringToMatrix(CORRECT_STRING);
|
|
||||||
// final String[][] matrix = stringToMatrix(NO_ROW_STRING);
|
|
||||||
// final String[][] matrix = stringToMatrix(NO_COL_STRING);
|
|
||||||
final String[][] matrix =stringToMatrix(HAS_CHAR_STRING);
|
|
||||||
System.out.println(Arrays.deepToString(matrix));
|
|
||||||
System.out.println("Half sum = " +calcMatrix(matrix));
|
|
||||||
} catch (NumberIsNotNumberException exceptionObjectName) {
|
|
||||||
System.out.println("A NumberFormatException is thrown: " + exceptionObjectName.getMessage());
|
|
||||||
} catch (RowMismatchException | ColumnMismatchException superExceptionName) {
|
|
||||||
System.out.println("A RuntimeException successor is thrown: " + superExceptionName.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue