Compare commits

...

2 Commits

Author SHA1 Message Date
Ivan I. Ovchinnikov c662ae1464 05c hw 2023-01-12 23:21:17 +03:00
Ivan I. Ovchinnikov 3e095d010d some 05a, 05c 2023-01-11 18:55:36 +03:00
4 changed files with 620 additions and 8 deletions

Binary file not shown.

View File

@ -70,7 +70,7 @@ GPT:
\item возможность хранения информации в оперативной памяти;
\item способы корректировки пользователями ядра
\item и пр.
\end{enumerate} .
\end{enumerate}
\subsubsection{Linux}
ОС Linux предоставляет возможность устанавливать в каждый отдельный блок свою файловую систему, которая и будет обеспечивать порядок поступающих и хранящихся данных, поможет с их организацией. Каждая ФС работает на наборе правил. Исходя из этого и определяется в каком месте и каким образом будет выполняться хранение информации. Эти правила лежат в основе иерархии системы, то есть всего корневого каталога. От того, насколько правильно администратор компьютера выберет тип файловой системы для каждого раздела, зависит ряд параметров, таких как: оперативность записи, скорость обработки данных, сбережение файлов, допустимый размер блока, возможность хранения информации в оперативной памяти и другие.
@ -113,15 +113,15 @@ GPT:
\subsubsection{Файловые системы}
\begin{itemize}
\item Ext (extended) FS. Это расширенная файловая система, одна из первых. Была запущена в работу еще в 1992 году. В основе ее функциональности лежала ФС UNIX. Основная задача состояла в выходе за рамки конфигурации классической файловой системы MINIX, исключить ее ограничения и повысить эффективность администрирования. Сегодня она применяется крайне редко.
\item Ext2. Вторая, более расширенная вервия ФС, паявшаяся на рынке в 1993 году. По своей структуре продукт аналогичный Ext. Изменения коснулись интерфейса, конфигурации. Увеличился объем памяти, производительность. Максимально допустимый объем файлов для хранения (указывается в настройках) 2 ТБ. Ввиду невысокой перспективности применяется на практике редко.
\item Ext2. Вторая, более расширенная вервия ФС, паявшаяся на рынке в 1993 году. По своей структуре продукт аналогичный Ext. Изменения коснулись интерфейса, конфигурации. Увеличился объем памяти, производительность. Максимально допустимый объем файлов для хранения (указывается в настройках) -- 2 ТБ. Ввиду невысокой перспективности применяется на практике редко.
\item Ext3. Третье поколение Extended FS, введенное в использование в 2001 году. Уже относится к журналируемой. Позволяет хранить логи изменения, обновления файлов данных записываются в отдельный журнал еще до того, как эти действия будут завершены. После перезагрузки ПК, такая ФС позволит восстановить файлы благодаря внедрению в систему специального алгоритма.
\item Ext4. Четвертое поколение Extended FS, запущенное в 2006 году. Здесь максимально убраны всевозможные ограничения, присутствующие в предыдущих версиях. Сегодня именно она по умолчанию входит в состав большей части дистрибутивов Линукс. Передовой ее нельзя назвать, но стабильность и надежность работы здесь в приоритете. В Unix системах применяется повсеместно.
\item JFS. Журналируемая система, первый аналог продуктам из основной группы, разработанная специалистами IBM под AIX UNIX. Отличается постоянством и незначительными требованиями к работе. Может использоваться на многопроцессорных ПК. Но в ее журнале сохраняются ссылки лишь на метаданные. Поэтому если произойдет сбой, автоматически подтянутся устаревшие версии данных.
\item ReiserFS. Создана Гансом Райзером исключительно под Линукс и названа в его честь. По своей структуре это продукт, похожий на Ext3, но с более расширенными возможностями. Пользователи могут соединять небольшие файлы в более масштабные блоки, исключая фрагментацию, повышая эффективность функционирования. Но в случае непредвиденного отключения электроэнергии есть вероятность потерять данные, которые будут группироваться в этот момент.
\item ReiserFS. Создана Гансом Райзером исключительно под Linux и названа в его честь. По своей структуре -- это продукт, похожий на Ext3, но с более расширенными возможностями. Пользователи могут соединять небольшие файлы в более масштабные блоки, исключая фрагментацию, повышая эффективность функционирования. Но в случае непредвиденного отключения электроэнергии есть вероятность потерять данные, которые будут группироваться в этот момент.
\item XFS. Еще один представитель группы журналируемых файловых систем. Отличительная особенность: в логи программа будет записывать только изменения в метаданных. Из преимуществ выделяют быстроту работы с объемной информацией, способность выделять место для хранения в отложенном режиме. Позволяет увеличивать размеры разделов, а вот уменьшать, удалять часть нельзя. Здесь также есть риск потери данных при отключении электроэнергии.
\item Btrfs. Отличается повышенной стойкостью к отказам и высокой производительностью. Удобная в работе, позволяет легко восстанавливать информацию, делать скриншоты. Размеры разделов можно менять в рабочем процессе. По умолчанию входит в OpenSUSE и SUSE Linux. Но обратная совместимость в ней нарушена, что усложняет поддержку.
\item F2FS. Разработка Самсунг. Уже входит в ядро Линукс. Предназначена для взаимодействия с хранилищем данных флеш-памяти. Имеет особую структуру: носитель разбивается на отдельные части, которые в свою очередь дополнительно еще делятся.
\item OpenZFS. Это ответ на вопрос какую файловую систему выбрать для Ubuntu она автоматически включена в поддержку ОС уже более 6 лет назад. Отличается высоким уровнем защиты от повреждения информации, автоматическим восстановлением, поддержкой больших объемов данных.
\item F2FS. Разработка Samsung. Уже входит в ядро Linux. Предназначена для взаимодействия с хранилищем данных флеш-памяти. Имеет особую структуру: носитель разбивается на отдельные части, которые в свою очередь дополнительно еще делятся.
\item OpenZFS. Это ответ на вопрос какую файловую систему выбрать для Ubuntu -- она автоматически включена в поддержку ОС уже более 6 лет назад. Отличается высоким уровнем защиты от повреждения информации, автоматическим восстановлением, поддержкой больших объемов данных.
\item EncFS. Шифрует данные и пересохраняет их в этом формате в указанную пользователем директорию. Надо примонтировать ФС чтобы обеспечить доступ в расшифрованной информации.
\item Aufs. С ее помощью отдельные File Systems можно группировать в один раздел.
\item NFS. Позволит через сеть примонтировать ФС удаленного устройства.
@ -130,6 +130,23 @@ GPT:
\item Sysfs. Такая ФС позволит пользователю задавать и отменять параметры ядра во время выполнения задачи.
\end{itemize}
\subsubsection{Задание для самопроверки}
\begin{enumerate}
\item MBR -- это
\begin{enumerate}
\item main boot record;
\item master BIOS recovery;
\item minimizing binary risks.
\end{enumerate}
\item Что такое GPT?
\begin{enumerate}
\item General partition trace;
\item GUID partition table;
\item Greater pass timing.
\end{enumerate}
\item Открытый вопрос: Что такое файловая система?
\item Возможно ли использовать разные файловые системы в рамках одной ОС?
\end{enumerate}
\subsection{Файловая система и представление данных}
\subsubsection{File}
@ -301,6 +318,13 @@ if (Files.exists(file)) {
}
\end{lstlisting}
\subsubsection{Задание для самопроверки}
Ссылка на местонахождение -- это:
\begin{enumerate}
\item URI;
\item URL;
\item URN.
\end{enumerate}
\subsection{Потоки ввода-вывода, пакет \code{java.io}}
Подавляющее большинство программ обменивается данными со внешним миром. Это делают любые сетевые приложения -- они передают и получают информацию от других компьютеров и специальных устройств, подключенных к сети. Можно таким же образом представлять обмен данными между устройствами внутри одной машины. Программа может считывать данные с клавиатуры и записывать их в файл, или, наоборот - считывать данные из файла и выводить их на экран. Таким образом, устройства, откуда может производиться считывание информации, могут быть самыми разнообразными файл, клавиатура, входящее сетевое соединение и т.д. То же касается и устройств вывода это может быть файл, экран монитора, принтер, исходящее сетевое соединение и т.п. В конечном счете, все данные в компьютерной системе в процессе обработки передаются от устройств ввода к устройствам вывода.
@ -523,6 +547,12 @@ readLong: -9205252085229027328
\subsubsection{Классы Reader и Writer}
Рассмотренные классы -- наследники \code{InputStream} и \code{OutputStream} -- работают с байтовыми данными. Если с их помощью записывать или считывать текст, то сначала необходимо сопоставить каждому символу его числовой код. Такое соответствие называется кодировкой. Java предоставляет классы, практически полностью дублирующие байтовые потоки по функциональности, но называющиеся \code{Reader} и \code{Writer}, соответственно. Различия между байтовыми и символьными классами весьма незначительны. Классы-мосты \code{InputStreamReader} и \code{OutputStreamWriter} при преобразовании символов также используют некоторую кодировку.
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item Возможно ли чтение совершенно случайного байта данных из объекта \code{BufferedInputStream}?
\item Возможно ли чтение совершенно случайного байта данных из потока, к которому подключен объект \code{BufferedInputStream}?
\end{enumerate}
\subsection{\code{java.nio} и \code{nio2}}
Основное отличие между двумя подходами к организации ввода/вывода в том, что Java IO является потокоориентированным, а Java NIO буфер-ориентированным.
@ -652,11 +682,27 @@ cat0 equal to cat3? false
Можно сказать, что интернирование в виде применения метода \code{intern()} рекомендуется не использовать. Вместо интернирования необходимо использовать дедупликацию. Если коротко, во время сборки мусора Garbage Collector проверяет живые (имеющие рабочие ссылки) объекты в куче на возможность провести их дедупликацию. Ссылки на подходящие объекты вставляются в очередь для последующей обработки. Далее происходит попытка дедупликации каждого объекта \code{String} из очереди, а затем удаление из нее ссылок на объекты, на которые они ссылаются.
\subsubsection{Задания для самопроверки}
\begin{enumerate}
\item String -- это:
\begin{enumerate}
\item объект;
\item примитив;
\item класс;
\end{enumerate}
\item Строки в языке Java -- это:
\begin{enumerate}
\item классы;
\item массивы;
\item объекты.
\end{enumerate}
\end{enumerate}
\subsection*{Практическое задание}
\begin{enumerate}
\item создать пару-тройку текстовых файлов. Для упрощения (не разбираться с кодировками) внутри файлов следует писать текст только латинскими буквами.
\item написать метод, осуществляющий конкатенацию переданных ей в качестве параметров файлов (не особо важно, в первый допишется второй или во второй первый, или файлы вовсе объединятся в какой-то третий);
\item написать метод поиска слова внутри файла.
\item Cоздать пару-тройку текстовых файлов. Для упрощения (чтобы не разбираться с кодировками) внутри файлов следует писать текст только латинскими буквами.
\item Написать метод, осуществляющий конкатенацию (объединение) переданных ей в качестве параметров файлов (не важно, в первый допишется второй или во второй первый, или файлы вовсе объединятся в какой-то третий);
\item Написать метод поиска слова внутри файла.
\end{enumerate}
\newpage

BIN
seminars/build/jtc5-05c.pdf Normal file

Binary file not shown.

566
seminars/jtc5-05c.tex Normal file
View File

@ -0,0 +1,566 @@
\documentclass[../j-spec.tex]{subfiles}
\usepackage{spreadtab}
\begin{document}
\setcounter{section}{4}
\section{Семинар: обработка исключений}
\subsection{Инструментарий}
\begin{itemize}
\item \href{https://docs.google.com/presentation/d/}{Презентация} для преподавателя, ведущего семинар;
\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 & 5 & @ 6-18 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (6 вопросов, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ лекции & 10 & @ 19-23 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 24 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 30 & @ 25-35 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
\hline
@ Перерыв (если нужен) & 5 & @ 36 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 2 & 40 & @ 37-49 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
\hline
@ Домашнее задание & 5 & @ 50-51 & @ Объясните домашнее задание, подведите итоги урока \\
\hline
@ Рефлексия & 10 tag(end) & @ 52-53 & @ Преподаватель запрашивает обратную связь \\
\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 Что такое GPT?
\begin{enumerate}
\item General partition trace;
\item GUID partition table;
\item Greater pass timing.
\end{enumerate}
\item Строки в языке Java -- это:
\begin{enumerate}
\item классы;
\item массивы;
\item объекты.
\end{enumerate}
\item Ссылка на местонахождение -- это:
\begin{enumerate}
\item URI;
\item URL;
\item URN.
\end{enumerate}
\item Возможно ли чтение совершенно случайного байта данных из потока, к которому подключен объект \code{BufferedInputStream}?
\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{Вариант решения}
Задание не предполагало кода, но будет плюсом, если студенты создали файлы не вручную, а программным кодом. Для этого и последующих заданий понадобится набор констант и вспомогательный массив с названиями файлов
\begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}]
private static final Random rnd = new Random();
private static final int CHAR_BOUND_L = 65;
private static final int CHAR_BOUND_H = 90;
private static final int FILES_AMOUNT = 10;
private static final int WORDS_AMOUNT = 5;
private static final int WORD_LENGTH = 10;
private static final String WORD_TO_SEARCH = "geekbrains";
String[] fileNames = new String[FILES_AMOUNT];
for (int i = 0; i < fileNames.length; i++)
fileNames[i] = "file_" + i + ".txt";
\end{lstlisting}
Файл записывается простым выходным потоком, в который (в приведённом ниже примере) записывается строка, сгенерированная методом. Из строки выделяется массив байтов методом \code{getBytes()}.
\begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}]
private static String generateSymbols(int amount) {
StringBuilder sequence = new StringBuilder();
for (int i = 0; i < amount; i++)
sequence.append((char) (CHAR_BOUND_L + rnd.nextInt(CHAR_BOUND_H - CHAR_BOUND_L)));
return sequence.toString();
}
private static void writeFileContents(String fileName, int length) throws IOException {
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(generateSymbols(length).getBytes());
fos.flush();
fos.close();
}
\end{lstlisting}
Вызов методов обёрнут в \code{try...catch} и формирует сразу файлы как для второго задания (конкатенации), так и третьего (поиска).
\begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}]
try {
//#1
for (int i = 0; i < fileNames.length; i++)
if (i < 2)
writeFileContents(fileNames[i], 100);
else
writeFileContents(fileNames[i], WORDS_AMOUNT, WORD_LENGTH);
System.out.println("First task results are in file_0 and file_1.");
}
catch (Exception ex) { throw new RuntimeException(ex); }
\end{lstlisting}
\item Написать метод, осуществляющий конкатенацию (соединение) переданных ей в качестве параметров файлов (не особенно важно, в первый допишется второй или во второй первый, или файлы вовсе объединятся в какой-то третий);
\textbf{Вариант решения}
Метод конкатенации моет также быть написан множеством способов, но важно, чтобы при буферизации (чаще всего решения содержат именно буферизованные варианты) не терялись символы, например, пробелы или переходы на новую строку. Также часто встречается дополнительная буферизация внутри программы, например, в строку, при помощи \code{StringBuilder}, что будет являться грубой ошибкой при конкатенации больших или бинарных файлов. Поэтому ниже представлен вариант решения с посимвольным чтением и записью в результирующий файл.
\begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}]
private static void concatenate(String file_in1, String file_in2, String file_out) throws IOException {
FileOutputStream fos = new FileOutputStream(file_out);
int ch;
FileInputStream fis = new FileInputStream(file_in1);
while ((ch = fis.read()) != -1)
fos.write(ch);
fis.close();
fis = new FileInputStream(file_in2);
while ((ch = fis.read()) != -1)
fos.write(ch);
fis.close();
fos.flush();
fos.close();
}
\end{lstlisting}
Вызов метода можно записать в секцию \code{try...catch} предыдущего задания или написать новую.
\begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}]
try {
//#2
concatenate(fileNames[0], fileNames[1], "FILE_OUT.txt");
System.out.println("Second task result is in FILE_OUT.");
}
catch (Exception ex) { throw new RuntimeException(ex); }
\end{lstlisting}
\item Написать метод поиска слова внутри файла.
\textbf{Вариант решения}
Для поиска слова понадобится файл не со сплошными символами (хотя и в таком алгоритм поиска должен отработать нормально), а со словами, разделёнными пробелами. Для этого можно видоизменить метод генерации файла и написать перегруженный, который будет по некоторому псевдослучайному условию вставлять в файл через пробел либо случайно сгенерированную последовательность символов, либо слово, заранее определённое, как искомое.
\begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}]
private static void writeFileContents(String fileName, int words, int length) throws IOException {
FileOutputStream fos = new FileOutputStream(fileName);
for (int i = 0; i < words; i++) {
if(rnd.nextInt(WORDS_AMOUNT) == WORDS_AMOUNT / 2)
fos.write(WORD_TO_SEARCH.getBytes());
else
fos.write(generateSymbols(length).getBytes());
fos.write(' ');
}
fos.flush();
fos.close();
}
\end{lstlisting}
Формально, можно выполнить работу следующим образом, используя \code{Scanner}, сравнивая слова «от пробела до пробела»
\begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}]
private static boolean fileScanner(String fileName, String word) throws IOException {
Scanner sc = new Scanner(new FileInputStream(fileName));
word = word.toLowerCase(); // \n
while (sc.hasNext()) {
String line = sc.nextLine();
line = line.toLowerCase();
if (line.contains(word)) return true;
}
return false;
}
\end{lstlisting}
Но более гибким получится алгоритм, ищущий непосредственно последовательность символов, сравнивая их по одному, это позволяет искать не только словосочетания, но и, например, диалоги персонажей в книге.
\begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}]
private static boolean isInFile(String fileName, String search) throws IOException {
FileInputStream fis = new FileInputStream(fileName);
byte[] searchSequence = search.getBytes();
int ch;
int i = 0; // geekgeekbrains
while ((ch = fis.read()) != -1) {
if (ch == searchSequence[i])
i++;
else {
i = 0;
if (ch == searchSequence[i]) i++;
}
if (i == searchSequence.length) {
fis.close();
return true;
}
}
fis.close();
return false;
}
\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{Тайминг} 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{Тайминг} 35-40 минут.
\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={Написание и \textbf{отладка} основного метода}]
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}
\end{document}