started seminars, finished meth03

This commit is contained in:
Ivan I. Ovchinnikov 2022-12-14 14:43:40 +03:00
parent bc5f564ce2
commit d493adf10b
24 changed files with 2527 additions and 428 deletions

Binary file not shown.

View File

@ -1,428 +0,0 @@
\documentclass[j-spec.tex]{subfiles}
\begin{document}
\setcounter{section}{2}
\pagestyle{plain}
\sloppy
\tableofcontents
\section{Специализация: ООП}
\subsection{В предыдущем разделе}
Будет рассмотрен базовый функционал языка, то есть основная встроенная функциональность, такая как математические операторы, условия, циклы, бинарные операторы. Далее способы хранения и представления данных в Java, и в конце способы манипуляции данными, то есть функции (в терминах языка называющиеся методами).
\subsection{В этом разделе}
Разберём такие основополагающих в Java вещи, как классы и объекты, а также с тем, как применять на практике основные принципы ООП: наследование, полиморфизм и инкапсуляцию. Дополнительно рассмотрим устройство памяти в джава.
\begin{itemize}
\item \nom{Класс}{определяет форму и сущность объекта и является логической конструкцией, на основе которой построен весь язык Java. Определяет новый тип данных};
\item \nom{Объект}{конкретный экземпляр класса, созданный в программе};
\item \nom{Статика}{(статический контекст) static - (от греч. неподвижный) — раздел механики, в котором изучаются условия равновесия механических систем под действием приложенных к ним сил и возникших моментов. В языке программирования Java - принадлежность поля и его значения не объекту, а классу, и, как следствие, доступность такого поля и его значения в единственном экземпляре всем объектам класса.};
\item \nom{Стек}{- };
\item \nom{Куча}{- };
\item \nom{Сборщик мусора}{- };
\item \nom{Конструктор}{- };
\item \nom{Вложенный класс}{- };
\item \nom{Внутренний класс}{- };
\item \nom{Инкапсуляция}{- };
\item \nom{Наследование}{- };
\item \nom{Полиморфизм }{- };
\end{itemize}
\subsection{Классы и объекты, поля и методы, статика}
\subsubsection{Классы}
Что такое класс? С точки зрения ООП, \textbf{класс} определяет форму и сущность объекта и является логической конструкцией, на основе которой построен весь язык Java.
\begin{frm}\info
Наиболее важная особенность класса состоит в том, что он определяет новый тип данных, которым можно воспользоваться для создания объектов этого типа
\end{frm}
То есть класс — это шаблон (чертёж), по которому создаются объекты (экземпляры класса). Для определения формы и сущности класса указываются данные, которые он должен содержать, а также код, воздействующий на эти данные. Создаем мы свои классы, когда у нас не хватает уже созданных.
Например, если мы хотим работать в нашем приложении с документами, то необходимо для начала объяснить приложению, что такое документ, описать его в виде класса (чертежа) \code{Document}. Указать, какие у него должны быть свойства: название, содержание, количество страниц, информация о том, кем он подписан и т.п. В этом же классе мы обычно описываем, что можно делать с документами: печатать в консоль, подписывать, изменять содержание, название и т.д. Результатом такого описания и будет класс \code{Document}. Однако, это по-прежнему всего лишь чертеж хранимых данных (состояний) и способы взаимодействия с этими данными.
Если нам нужны конкретные документы, а нам они обязательно нужны, то необходимо создавать \textbf{объекты}: документ №1, документ №2, документ №3. Все эти документы будут иметь одну и ту же структуру (описанные нами название, содержание, ...), с ними можно выполнять одни и те же описанные нами действия (печатать, подписать, ...), но наполнение будет разным, например, в первом документе содержится приказ о назначении работника на должность, во втором, о выдаче премии отделу разработки и т.д.
Начнём с малого, напишем свой первый класс. Представим, что необходимо работать в приложении с котами. Java ничего не знает о том, что такое коты, поэтому необходимо создать новый класс (тип данных), и объяснить что такое кот. Создадим новый файл, для простоты в том же пакете, что и главный класс программы.
\begin{figure}[H]
\begin{forest}
for tree={
font=\ttfamily, grow'=0, child anchor=west,
parent anchor=south, anchor=west, calign=first,
edge path={
\noexpand\path [draw, \forestoption{edge}]
(!u.south west) +(7.5pt,0) |- node[fill,inner sep=1.5pt]
{} (.child anchor)\forestoption{edge label};
}, before typesetting nodes={
if n=1 {insert before={[,phantom]}} {} },
fit=band, before computing xy={l=20pt},
}
[Sample
[src
[ru
[gb
[jcore
[sample
[Main.java]
[Cat.java]
]
]
]
]
]
[out
]
[README.md]
]
\end{forest}
\caption{Структура проекта}
\label{pic:simple-tree}
\end{figure}
\subsubsection{Поля класса}
Начнем описывать в классе \code{Cat} так называемый API кота. Как изестно, имя класса должно совпадать с именем файла, в котором он объявлен, т.е. класс \code{Cat} должен находиться в файле \code{Cat.java}. Пусть у котов есть три свойства: \code{name} (кличка), \code{color} (цвет) и \code{age} (возраст); совокупность этих свойств называется состоянием, и коты пока ничего не умеют делать. Класс \code{Cat} будет иметь вид, представленный в листинге \hrf{lst:class-simple}. Свойства класса, записанные таким образом, в виде переменных, называются \textbf{полями}.
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Структура кота в программе},label={lst:class-simple}]
package ru.gb.jcore;
public class Cat {
String name;
String color;
int age;
}
\end{lstlisting}
\begin{frm} \excl
Для новичка важно не запутаться, класс кота мы описали в отдельном файле, а создавать объекты и совершать манипуляции следует в основном классе программы, не может же кот назначить имя сам себе.
\end{frm}
Мы рассказали программе, что такое коты, теперь если мы хотим создать в нашем приложении конкретного кота, следует воспользоваться оператором \code{new Cat();} в основном классе программы. Более подробно разберём, что происходит в этой строке, чуть позже, пока же нам достаточно знать, что мы создали объект типа \code{Cat} (экземпляр класса \code{Cat}), и запомнить эту конструкцию. Для того чтобы с ним (экземпляром) работать, можем положить его в переменную, которой дать идентификатор \code{cat1}. При создании объекта полям присваиваются значения по умолчанию (нули для числовых переменных и \code{false} для булевых).
\begin{lstlisting}[language=Java,style=JCodeStyle]
Cat cat0; // cat0 = null;
cat0 = new Cat();
Cat cat1 = new Cat();
\end{lstlisting}
В листинге выше можно увидеть все три операции (объявление, присваивание и инициализацию) и становится понятно, как можно создавать объекты. Также известно, что в переменной не лежит сам объект, а только ссылка на него. Объект \code{cat1} создан по чертежу \code{Cat}, это значит, что у него есть поля \code{name}, \code{color}, \code{age}, с которыми можно работать: получать или изменять их значения.
\begin{frm} \info
Для доступа к полям объекта используется оператор точка, который связывает имя объекта с именем поля. Например, чтобы присвоить полю \code{color} объекта \code{cat1} значение «Белый», нужно выполнить код \code{cat1.color = "Белый"};
\end{frm}
Операция «точка» служит для доступа к полям и методам объекта по его имени. Мы уже использовали оператор «точка» для доступа к полю с длиной массива, например. Рассмотрим пример консольного приложения, работающего с объектами класса \code{Cat}. Создадим двух котов, один будет белым Барсиком 4х лет, второй чёрным Мурзиком шести лет, и просто выведем информацию о них в терминал.
\begin{lstlisting}[language=Java,style=JCodeStyle]
package ru.gb.jcore;
public class Main {
public static void main(String[] args) {
Cat cat1 = new Cat();
Cat cat2 = new Cat();
cat1.name = "Barsik";
cat1.color = "White";
cat1.age = 4;
cat2.name = "Murzik";
cat2.color = "Black";
cat2.age = 6;
System.out.println("Cat1 named: " + cat1.name +
" is " + cat1.color +
" has age: " + cat1.age);
System.out.println("Cat2 named: " + cat2.name +
" is " + cat2.color +
" has age: " + cat2.age);
}
}
\end{lstlisting}
в результате работы программы в консоли появятся следующие строки:
\begin{verbatim}
Cat1 named: Barsik is White has age: 4
Cat2 named: Murzik is Black has age: 6
\end{verbatim}
Вначале мы создали два объекта типа \code{Cat}: \code{cat1} и \code{cat2}, соответственно, они имеют одинаковый набор полей \code{name}, \code{color}, \code{age}. Почему? Потому что они принадлежат одному классу, созданы по одному шаблону. Объекты всегда «знают», какого они класса. Однако каждому из них в эти поля записаны разные значения. Как видно из результата печати в консоли, изменение значения полей одного объекта, никак не влияет на значения полей другого объекта. Данные объектов \code{cat1} и \code{cat2} изолированы друг от друга. А значит мы делаем вывод о том, поля хранятся в классе, а значения полей хранятся в объектах. Логическая структура, демонстрирующая отношения объектов и классов, в том числе в части хранения полей и их значений показана на рис. \hrf{pic:class-obj-fields}.
\begin{figure}[H]
\centering
\def\svgscale{1.01}
\fontsize{12}{1}\selectfont
\includesvg{pics/jc-03-class-obj-fields.svg}
\caption{Логическая структура отношения класс-объект}
\label{pic:class-obj-fields}
\end{figure}
\subsubsection{Объекты}
Разобравшись с тем, как создавать новые типы данных (классы) и мельком посмотрев, как создаются объекты, нужно подробнее разобрать, как создавать объекты, и что при этом происходит. Создание объекта как любого ссылочного типа данных проходит в два этапа. Как и в случае с уже известными нам массивами.
\begin{itemize}
\item Сначала создается переменная, имеющая интересующий нас тип, в неё возможно записать ссылку на объект;
\item затем необходимо выделить память под объект;
\item создать и положить объект в выделенную часть памяти;
\item и сохранить ссылку на этот объект в памяти - в нашу переменную.
\end{itemize}
Для непосредственного создания объекта применяется оператор \code{new}, который динамически резервирует память под объект и возвращает ссылку на него, в общих чертах эта ссылка представляет собой адрес объекта в памяти, зарезервированной оператором \code{new}.
\begin{lstlisting}[language=Java,style=JCodeStyle]
Cat cat1; // cat1 = null;
cat1 = new Cat();
Cat cat2 = new Cat();
\end{lstlisting}
В первой строке кода переменная \code{cat1} объявляется как ссылка на объект типа \code{Cat} и пока ещё не ссылается на конкретный объект (первоначально значение переменной \code{cat1} равно \code{null}). В следующей строке выделяется память для объекта типа \code{Cat}, и в переменную \code{cat1} сохраняется ссылка на него. После выполнения второй строки кода переменную \code{cat1} можно использовать так, как если бы она была объектом типа \code{Cat}. Обычно новый объект создается в одну строку, то есть инициализируется.
\subsubsection{Оператор \code{new}}
\begin{frm}\info
[квалификаторы] ИмяКласса имяПеременной = \textbf{\code{new}} ИмяКласса();
\end{frm}
Оператор \code{new} динамически выделяет память для нового объекта, общая форма применения этого оператора имеет вид как на врезке выше, но на самом деле справа - не имя класса, конструкция ИмяКласса() в правой части выполняет вызов конструктора данного класса, который подготавливает вновь создаваемый объект к работе.
Именно от количества применений оператора \code{new} будет зависеть, сколько именно объектов будет создано в программе.
\begin{lstlisting}[language=Java,style=JCodeStyle]
Cat cat1 = new Cat();
Cat cat2 = cat1;
cat1.name = "Barsik";
cat1.color = "White";
cat1.age = 4;
cat2.name = "Murzik";
cat2.color = "Black";
cat2.age = 6;
System.out.println("Cat1 named: " + cat1.name +
" is " + cat1.color +
" has age: " + cat1.age);
System.out.println("Cat2 named: " + cat2.name +
" is " + cat2.color +
" has age: " + cat2.age);
\end{lstlisting}
На первый взгляд может показаться, что переменной \code{cat2} присваивается ссылка на копию объекта \code{cat1}, т.е. переменные \code{cat1} и \code{cat2} будут ссылаться на разные объекты в памяти. Но это не так. На самом деле \code{cat1} и \code{cat2} будут ссылаться на один и тот же объект. Присваивание переменной \code{cat1} значения переменной \code{cat2} не привело к выделению области памяти или копированию объекта, лишь к тому, что переменная \code{cat2} содержит ссылку на тот же объект, что и переменная \code{cat1}. Это явление дополнительно подчёркивает ссылочную природу данных в языке Java.
Таким образом, любые изменения, внесённые в объект по ссылке \code{cat2}, окажут влияние на объект, на который ссылается переменная \code{cat1}, поскольку \textit{это один и тот же объект в памяти}. Поэтому результатом выполнения кода, где мы как будто бы указали возраст второго кота, равный шести годам, станут строки, показывающие, что по обеим ссылкам оказался кот возраста шесть лет с именем Мурзика.
\begin{verbatim}
Cat1 named: Murzik is Black has age: 6
Cat2 named: Murzik is Black has age: 6
\end{verbatim}
\begin{frm}\info
Множественные ссылки на один и тот же объект в памяти довольно легко себе представить как ярлыки для запуска одной и той же программы на рабочем столе и в меню быстрого запуска. Или если на один и тот же шкафчик в раздевалке наклеить два номера - сам шкафчик можно будет найти по двум ссылкам на него.
\end{frm}
Важно всегда перепроверять, какие объекты созданы, а какие имеют множественные ссылки.
\subsubsection{Методы}
Ранее было сказано о том, что в языке Java любая программа состоит из классов и функций, которые могут описываться только внутри них. Именно поэтому все функции в языке Java являются методами. А метод - это функция, являющаяся частью некоторого класса, которая может выполнять операции над данными этого класса.
\begin{frm} \info
Метод - это функция, принадлежащая классу
\end{frm}
Метод для своей работы может использовать поля объекта и/или класса, в котором определен, напрямую, без необходимости передавать их во входных параметрах. Это похоже на использование глобальных переменных в функциях, но в отличие от глобальных переменных, метод может получать прямой доступ только к членам класса. Самые простые методы работают с данными объектов. Методы чаще всего формируют API классов, то есть способ взаимодействия с классами, интерфейс. Место методов во взаимодействии классов и объектов показано на рис. \hrf{pic:class-obj-nostatic}.
\begin{figure}[H]
\centering
\def\svgscale{1.01}
\fontsize{12}{1}\selectfont
\includesvg{pics/jc-03-class-obj-nostatic.svg}
\caption{Логическая структура отношения класс-объект}
\label{pic:class-obj-nostatic}
\end{figure}
Вернёмся к примеру с котиками. Широко известно, что котики умеют урчать, мяукать и смешно прыгать. В целях демонстрации в описании этих действий просто будем делать разные выводы в консоль, хотя возможно и научить котика в программе выбирать минимальное значение из массива, но это было бы, как минимум, неожиданно. Итак опишем метод например подать голос и прыгать.
\begin{lstlisting}[language=Java,style=JCodeStyle]
public class Cat {
String name;
String color;
int age;
void voice() {
System.out.println(name + " meows");
}
void jump() {
if (this.age < 5) System.out.println(name + " jumps");
}
}
\end{lstlisting}
Обращение к методам выглядит очень похожим на стандартный способом, через точку, как к полям. Теперь когда появляется необходимость позвать котика, он скажет: «мяу, я имя котика», а если в программе пришло время котику прыгнуть, он решит, прилично ли это -- прыгать в его возрасте.
\begin{lstlisting}[language=Java,style=JCodeStyle]
package ru.gb.jcore;
public class Main {
public static void main(String[] args) {
Cat cat1 = new Cat();
Cat cat2 = new Cat();
cat1.name = "Barsik";
cat1.color = "White";
cat1.age = 4;
cat2.name = "Murzik";
cat2.color = "Black";
cat2.age = 6;
cat1.voice();
cat2.voice();
cat1.jump();
cat2.jump();
}
}
\end{lstlisting}
\begin{verbatim}
Barsik meows
Murzik meows
Barsik jumps
\end{verbatim}
Как видно, Барсик замечательно прыгает, а Мурзик от прыжков воздержался, хотя попрыгать программа попросила их обоих.
\subsubsection{Ключевое слово \code{static}}
В завершение базовой информации о классах и объектах, остановимся на специальном модификаторе \code{static}, делающем переменную или метод «независимыми» от объекта.
\begin{frm}\info
\textbf{\code{static}} — модификатор, применяемый к полю, блоку, методу или внутреннему классу, он указывает на привязку субъекта к текущему классу.
\end{frm}
Для использования таких полей и методов, соответственно, объект создавать не нужно. В Java большинство членов служебных классов являются статическими. Возможно использовать это ключевое слово в четырех контекстах:
\begin{itemize}
\item статические методы;
\item статические переменные;
\item статические вложенные классы;
\item статические блоки.
\end{itemize}
В этом разделе рассмотрим подробнее только первые два пункта, третий опишем чуть позже, а четвёртый потребует от нас знаний, выходящих не только за этот урок, но и за десяток следующих.
\textbf{Статические методы} также называются методами класса, потому что статический метод принадлежит классу, а не его объекту. Нестатические называются методами объекта. Статические методы можно вызывать напрямую через имя класса, не обращаясь к объекту и вообще объект не создавая. Что это и зачем нужно? Например, умение кота мяукать можно вывести в статическое поле, потому что, например, весной можно открыть окно, не увидеть ни одного экземпляра котов, но зато услышать их, и точно знать, что мяукают не дома и не машины, а именно коты.
\begin{figure}[H]
\centering
\def\svgscale{1.01}
\fontsize{12}{1}\selectfont
\includesvg{pics/jc-03-class-obj-full.svg}
\caption{Логическая структура отношения класс-объект}
\label{pic:class-obj-full}
\end{figure}
Аналогично статическим методам, \textbf{статические поля} принадлежат классу и совершенно ничего «не знают» об объектах.
\begin{frm}\excl
Важной отличительной чертой статических полей является то, что их значения также хранятся в классе, в отличие от обычных полей, чьи значения хранятся в объектах.
\end{frm}
Рисунок \hrf{pic:class-obj-full} именно в этом виде автор настоятельно рекомендует если не заучить, то хотя бы хорошо запомнить, он ещё пригодится в дальнейшем обучении и работе. Из этого же изображения можно сделать несколько выводов.
\begin{lstlisting}[language=Java,style=JCodeStyle]
public class Cat {
static int pawsCount = 4;
String name;
String color;
int age;
// ...
}
\end{lstlisting}
Помимо того, что статические поля - это полезный инструмент создания общих свойств это ещ§ и опасный инструмент создания общих свойств. Так, например, мы знаем, что у котов четыре лапы, а не 6 и не 8. Не создавая никакого барсика будет понятно, что у кота - 4 лапы. Это полезное поведение.
лайвкод 03-статическое-поле-ошибка Посмотрим на опасность. Мы видим, что у каждого кота есть имя, и помним, что коты хранят значение своего имени каждый сам у себя. А знают экземпляры о названии поля потому что знают, какого класса они экземпляры. Но что если мы по невнимательности добавим свойство статичности к имени кота?
03-статическое-поле-признак Создав тех же самых котов, которых мы создавали весь урок, мы получим двух мурзиков и ни одного барсика. Почему это произошло? По факту переменная у нас одна на всех, и значение тоже одно, а значит каждый раз мы меняем именно его, а все остальные коты ничего не подозревая смотрят на значение общей переменной и бодро его возвращают. Поэтому, чтобы не запутаться, к статическим переменным, как правило, обращаются не по ссылке на объект — cat1.name, а по имени класса — Cat.name.
03-статические-поля К слову, статические переменные — редкость в Java. Вместо них применяют статические константы. Они определяются ключевыми словами static final и по соглашению о внешнем виде кода пишутся в верхнем регистре.
\subsubsection{Задание для самопроверки}
\begin{enumerate}
\item Что такое класс?
\item Что такое поле класса?
\item На какие три этапа делится создание объекта?
\item Какое свойство добавляет ключевое слово static полю или методу?
\begin{enumerate}
\item неизменяемость;
\item принадлежность классу;
\item принадлежность приложению.
\end{enumerate}
\item Может ли статический метод получить доступ к полям объекта?
\begin{enumerate}
\item не может;
\item может только к константным;
\item может только к неинициализированным.
\end{enumerate}
\end{enumerate}
\subsection{Стек и куча}
\subsection{Сборка мусора}
\subsection{Конструкторы}
\subsection{Инкапсуляция}
\subsection{Наследование}
\subsection{Полиморфизм}
- Также, хотелось бы отметить, что мы можем использовать -Xms и -Xmx опции JVM, чтобы определить начальный и максимальный размер памяти в куче. Для стека определить размер памяти можно с помощью опции -Xss;
\begin{lstlisting}[language=Java,style=JCodeStyle]
public class Cat {
private String name;
private String color;
private int age;
public Cat() {
System.out.println("constructor is constructing...");
name = "Barsik";
color = "White";
age = 2;
}
}
\end{lstlisting}
\begin{lstlisting}[language=Java,style=JCodeStyle]
public class Cat {
private String name;
private String color;
private int age;
Cat(String n, String c, int a) {
System.out.println("constructor is constructing...");
name = n;
color = c;
age = a;
}
}
\end{lstlisting}
\begin{lstlisting}[language=Java,style=JCodeStyle]
Cat cat1 = new Cat("Barsik", "White", 4);
Cat cat2 = new Cat("Murzik", "Black", 6);
\end{lstlisting}
\begin{lstlisting}[language=C,style=CCodeStyle]
public class Cat {
private String name;
private String color;
private int age;
public Cat(String name, String color, int age) {
this.name = name;
this.color = color;
this.age = age;
}
}
\end{lstlisting}
ключевое слово this в Java используется только в составе экземпляра класса. Но неявно ключевое слово this передается во все методы, кроме статических (поэтому this часто называют неявным параметром) и может быть использовано для обращения к объекту, вызвавшему метод.
\newpage
\printnomenclature[40mm]
\end{document}

1193
jc3-03a.tex Normal file

File diff suppressed because it is too large Load Diff

BIN
pics/jc-03-finalclass.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

290
pics/jc-03-memory.svg Normal file
View File

@ -0,0 +1,290 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
sodipodi:docname="jc-03-memory.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="true"
inkscape:zoom="1.1893044"
inkscape:cx="472.54513"
inkscape:cy="422.51588"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="2552"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid132" />
</sodipodi:namedview>
<defs
id="defs2" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="63.526459"
y="121.73479"
id="text318"><tspan
sodipodi:role="line"
id="tspan316"
style="stroke-width:0.264583"
x="63.526459"
y="121.73479">Java Memory Model</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="47.651459"
y="129.67229"
id="text322"><tspan
sodipodi:role="line"
id="tspan320"
style="stroke-width:0.264583"
x="47.651459"
y="129.67229">Heap</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="81.839859"
y="129.61302"
id="text326"><tspan
sodipodi:role="line"
id="tspan324"
style="stroke-width:0.264583"
x="81.839859"
y="129.61302">Stack</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="113.79729"
y="129.67229"
id="text330"><tspan
sodipodi:role="line"
id="tspan328"
style="stroke-width:0.264583"
x="113.79729"
y="129.67229">Non-heap</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="29.130625"
y="137.60979"
id="text442"><tspan
sodipodi:role="line"
id="tspan440"
style="stroke-width:0.264583"
x="29.130625"
y="137.60979">Old Generation</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="71.463959"
y="137.60979"
id="text446"><tspan
sodipodi:role="line"
id="tspan444"
style="stroke-width:0.264583"
x="71.463959"
y="137.60979">New Generation</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="59.557709"
y="145.54729"
id="text450"><tspan
sodipodi:role="line"
id="tspan448"
style="stroke-width:0.264583"
x="59.557709"
y="145.54729">Eden</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="76.755623"
y="145.54729"
id="text454"><tspan
sodipodi:role="line"
id="tspan452"
style="stroke-width:0.264583"
x="76.755623"
y="145.54729">Survivor1</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="103.21395"
y="145.54729"
id="text458"><tspan
sodipodi:role="line"
id="tspan456"
style="stroke-width:0.264583"
x="103.21395"
y="145.54729">Survivor2</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="134.96396"
y="137.60979"
id="text462"><tspan
sodipodi:role="line"
id="tspan460"
style="stroke-width:0.264583"
x="134.96396"
y="137.60979">Permanent Generation</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.264583"
x="134.96396"
y="143.78342"
id="tspan464">(Metaspace)</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
x="145.54729"
y="127.02646"
id="text468"><tspan
sodipodi:role="line"
id="tspan466"
style="stroke-width:0.264583"
x="145.54729"
y="127.02646">Code Cache</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect522"
width="48.947918"
height="6.6145854"
x="62.203541"
y="116.44312" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect524"
width="15.875001"
height="6.6145854"
x="46.328541"
y="124.38062" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect526"
width="15.875"
height="6.614583"
x="80.724373"
y="124.38062" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect528"
width="25.135416"
height="6.614583"
x="112.47437"
y="124.38062" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect530"
width="37.041668"
height="6.614583"
x="27.807707"
y="132.31813" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect532"
width="39.6875"
height="6.614583"
x="70.141045"
y="132.31813" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect534"
width="30.427082"
height="6.614583"
x="144.22437"
y="121.73479" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect536"
width="54.23959"
height="13.229161"
x="133.64104"
y="132.31813" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect538"
width="25.135416"
height="6.614583"
x="101.89104"
y="140.25562" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect540"
width="25.135416"
height="6.614583"
x="75.432709"
y="140.25562" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect542"
width="15.875"
height="6.614583"
x="58.234791"
y="140.25562" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 62.203541,119.08896 -9.260417,5.29166"
id="path607" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 111.15146,119.08896 13.22916,5.29166"
id="path609" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 88.661874,123.05771 v 1.32291"
id="path611" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 137.60979,127.02646 6.61458,-2.64584"
id="path613" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 137.60979,129.67229 15.875,2.64583"
id="path615" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 70.141041,136.28687 -3.96875,3.96875"
id="path617" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 88.661874,138.93271 v 1.32291"
id="path619" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 109.82854,136.28687 3.96875,3.96875"
id="path621" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 62.203541,128.34937 14.552083,3.96875"
id="path623" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 46.328541,128.34937 -7.9375,3.96875"
id="path625" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

103
pics/jc-03-modifiers.svg Normal file
View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.2.1 (9c6d41e4, 2022-07-14)"
sodipodi:docname="jc-03-modifiers.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="true"
showguides="true"
inkscape:zoom="15.985772"
inkscape:cx="308.14903"
inkscape:cy="419.154"
inkscape:window-width="1534"
inkscape:window-height="929"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid132" />
<sodipodi:guide
position="80.697915,197.78126"
orientation="1,0"
id="guide1128"
inkscape:locked="false" />
</sodipodi:namedview>
<defs
id="defs2" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
x="74.083336"
y="117.73959"
id="text250"><tspan
sodipodi:role="line"
id="tspan248"
style="stroke-width:0.765"
x="74.083336"
y="117.73959">public</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
x="72.760414"
y="104.51041"
id="text416"><tspan
sodipodi:role="line"
id="tspan414"
style="stroke-width:0.765"
x="72.760414"
y="104.51041">default</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
x="72.760414"
y="97.895836"
id="text420"><tspan
sodipodi:role="line"
id="tspan418"
style="stroke-width:0.765"
x="72.760414"
y="97.895836">private</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-dasharray:none;stroke-opacity:1"
d="M 80.697917,83.34375 55.5625,119.0625 h 50.27083 L 80.697917,83.34375"
id="path476"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:square"
d="m 68.791666,100.54167 h 23.8125"
id="path1130" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1"
d="M 64.822916,105.83333 H 96.572915"
id="path1132" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:square"
d="M 59.531249,113.77083 H 101.86458"
id="path1134" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
sodipodi:docname="jc-04-modifiers-full.svg"
inkscape:version="1.2.1 (9c6d41e4, 2022-07-14)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="true"
showguides="true"
inkscape:zoom="15.985772"
inkscape:cx="308.14903"
inkscape:cy="419.154"
inkscape:window-width="1534"
inkscape:window-height="929"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid132" />
<sodipodi:guide
position="80.697915,197.78126"
orientation="1,0"
id="guide1128"
inkscape:locked="false" />
</sodipodi:namedview>
<defs
id="defs2" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
x="74.083336"
y="117.73959"
id="text250"><tspan
sodipodi:role="line"
id="tspan248"
style="stroke-width:0.765"
x="74.083336"
y="117.73959">public</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
x="70.114586"
y="111.125"
id="text304"><tspan
sodipodi:role="line"
id="tspan302"
style="stroke-width:0.765"
x="70.114586"
y="111.125">protected</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
x="72.760414"
y="104.51041"
id="text416"><tspan
sodipodi:role="line"
id="tspan414"
style="stroke-width:0.765"
x="72.760414"
y="104.51041">default</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
x="72.760414"
y="97.895836"
id="text420"><tspan
sodipodi:role="line"
id="tspan418"
style="stroke-width:0.765"
x="72.760414"
y="97.895836">private</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-dasharray:none;stroke-opacity:1"
d="M 80.697917,83.34375 55.5625,119.0625 h 50.27083 L 80.697917,83.34375"
id="path476"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:square"
d="m 68.791666,100.54167 h 23.8125"
id="path1130" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1"
d="M 64.822916,105.83333 H 96.572915"
id="path1132" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:square"
d="M 59.531249,113.77083 H 101.86458"
id="path1134" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
seminars/build/jtc1-01c.pdf Normal file

Binary file not shown.

BIN
seminars/build/jtc1-02c.pdf Normal file

Binary file not shown.

324
seminars/jtc1-01c.tex Normal file
View File

@ -0,0 +1,324 @@
\documentclass[../j-spec.tex]{subfiles}
\usepackage{spreadtab}
\begin{document}
\section{Семинар: компиляция и интерпретация кода}
\subsection{Инструментарий}
\begin{itemize}
\item Презентация для преподавателя, ведущего семинар;
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
\item \href{https://jupyter.org/install}{Jupyter Notebook} для практики и примеров используется Jupyter notebook (потребуется установить \href{https://www.python.org/downloads/}{Python} и ядро \href{https://github.com/SpencerPark/IJava}{IJava}) и любой терминал операционной системы (bash, zsh, cmd);
\item JDK любая 11 версии и выше;
\end{itemize}
\subsection{Цели семинара}
\begin{itemize}
\item Закрепить полученные на лекции знания, касающиеся компиляции, интерпретации кода и создания программной документации;
\item Получить практический навык настройки терминала ОС для компиляции и исполнения кода, установки сторонних библиотек для интерпретации;
\item Попрактиковаться в написании терминальных команд и простых проектов. Лучше понять принцип импортирования кода и сборки проекта.
\end{itemize}
\subsection{План-содержание}
\noindent
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
\hline
@ Что происходит & @ Время & @ Слайды & @ Описание \\
\hline
\endhead
@ Организационный момент & 5 tag(beg) & @ 1-4 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
\hline
@ Quiz & 5 & @ 3-14 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ & 15 & @ 15-18 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 19 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 10 & @ 20-22 & @ Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки. Показать выполненные терминальные команды, результат компиляции. (* отделить исходный код от скомпилированных файлов, ** сложить исходный код в пакет) \\
\hline
@ Перерыв (если нужен) & 5 & @ 26 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 2 & 10 & @ 23-25 & @ Настроить окружение Jupyter Notebook с ядром Java, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown. (* осуществить форматированный вывод, ** сохранить форматирующую строку в ячейке с переменной) \\
\hline
@ Задание 3 & 15 & @ 27-29 & @ К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать программную документацию. (* создать документацию на каждый пакет по отдельности) \\
\hline
@ Домашнее задание & 5 & @ 39 & @ Объясните домашнее задание, подведите итоги урока \\
\hline
@ Рефлексия & 10 tag(end) & @ 40-42 & @ Преподаватель запрашивает обратную связь \\
\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 Запрашивает активность от аудитории в чате;
\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
\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{figure}[H]
\centering
\includegraphics[width=100mm]{sem-01-struct.png}
\caption{Структура проекта}
\end{figure}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код основного класса}]{src/s01-h01-Main.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код считающего класса}]{src/s01-h01-OtherClass.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код декоратора}]{src/s01-h01-Decorator.java}
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.
\textbf{Вариант решения}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
java -classpath ./out ru.gb.jcore.sample.Main
\end{lstlisting}
\begin{figure}[H]
\centering
\includegraphics[width=60mm]{sem-01-hw2-compile.png}
\caption{Результат компиляции}
\end{figure}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команда создания документации}]
javadoc -d docs -sourcepath ./src -cp ./out -subpackages ru
\end{lstlisting}
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-hw2-doc.png}
\caption{Результат создания документации}
\end{figure}
\item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.
\textbf{Вариант решения}\footnote{Обратите внимание, что все отступы сделаны не пробелами, а табуляцией, иначе Makefile не работает}
\lstinputlisting[style=CCodeStyle,caption={Makefile}]{src/s01-h03-Makefile}
\begin{figure}[H]
\centering
\includegraphics[width=80mm]{sem-01-hw03.png}
\caption{Результат выполнения тасков}
\end{figure}
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере пользователя, а второй забирать скомпилированные классы и исполнять их.
\textbf{Вариант решения}
\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{Тайминг} 10-20 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (запуск приложений на сервере, в контейнерах, настройка CI/CD в пет-проектах);
\item Выдать задание группам студентов, показать где именно следует искать терминал ОС;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}:
\begin{itemize}
\item Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Простейший проект}]
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
\end{lstlisting}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac Main.java
java Main
\end{lstlisting}
\item [$*_1$] отделить исходный код от скомпилированных файлов
\textbf{Вариант решения}
\begin{lstlisting}[style=ASMStyle]
javac -d out Main.java
java -classpath ./out Main
\end{lstlisting}
\item [$*_2$] сложить исходный код в пакет с глубиной иерархии не менее 3.
\textbf{Вариант решения}
Вручную создать соответствующие вложенные папки, переместить в них файл с исходным кодом \code{Main.java} и написать оператор \code{package} первой строкой файла \code{Main.java}.
\begin{lstlisting}[style=ASMStyle]
javac -d out ru/gb/jcore/Main.java
java -classpath ./out ru.gb.jcore.Main
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 2}
\begin{itemize}
\item \textbf{Ценность этапа} Настройка и изучение дополнительного инструментария для создания проектов и описания работы фрагментов кода в виде Jupyter notebook.
\item \textbf{Тайминг} 10-15 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (использование скриптовых возможностей среды разработки, таких как написание простых фрагментов кода без необходимости создавать большой проект в тяжеловесной среде разработки);
\item Пояснить студентам в каком виде выполнять и сдавать задания;
\item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item Настроить окружение Jupyter Notebook с ядром IJava, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown.
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-t2-1.png}
\caption{Вариант решения}
\end{figure}
\item [$*_1$] осуществить форматированный вывод
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант решения (вторая ячейка)}]
System.out.print("Your number is " + a);
\end{lstlisting}
\item [$*_1$] сохранить форматирующую строку в ячейке с переменной
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-t2-2.png}
\caption{Вариант решения}
\end{figure}
\end{itemize}
\end{itemize}
\subsubsection{Задание 3}
\begin{itemize}
\item \textbf{Ценность этапа} Закрепление навыков создания стандартной программной документации.
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (описание пет-проектов для потенциальных соисполнителей, создание базы знаний по проекту на случай длительных пауз в работе)
\item Выдать задание группам студентов
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции, и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать общую программную документацию.
\textbf{Вариант решения}
\begin{figure}[H]
\centering
\includegraphics[width=80mm]{sem-01-t3-1.png}
\caption{Иерархия получившегося проекта}
\end{figure}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основной класс}]{src/s01-t3-Simple.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Вспомогательный класс}]{src/s01-t3-Complex.java}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции и создания документации}]
javac -sourcepath . -d out ru/gb/Simple.java
java -classpath ./out ru.gb.Simple
javadoc -d doc -sourcepath . -cp ./out -subpackages ru
\end{lstlisting}
\item [$*_1$] создать документацию на каждый пакет по отдельности
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Вариант решения}]
javadoc -d doc_gb -sourcepath . -cp ./out ru.gb
javadoc -d doc_bg -sourcepath . -cp ./out ru.bg
\end{lstlisting}
\end{itemize}
\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 Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;
\item
\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}
\end{document}

348
seminars/jtc1-02c.tex Normal file
View File

@ -0,0 +1,348 @@
\documentclass[../j-spec.tex]{subfiles}
\usepackage{spreadtab}
\begin{document}
\section{Семинар: данные и функции}
\subsection{Инструментарий}
\begin{itemize}
\item Презентация для преподавателя, ведущего семинар;
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
\item \href{https://jupyter.org/install}{Jupyter Notebook} для практики и примеров используется Jupyter notebook (потребуется установить \href{https://www.python.org/downloads/}{Python} и ядро \href{https://github.com/SpencerPark/IJava}{IJava}) и любой терминал операционной системы (bash, zsh, cmd);
\item JDK любая 11 версии и выше;
\item \href{https://www.jetbrains.com/idea/download}{IntelliJ IDEA Community Edition} для практики и примеров используется IDEA.
\end{itemize}
\subsection{Цели семинара}
\begin{itemize}
\item Закрепить полученные на лекции знания, хранения примитивных и ссылочных типов данных;
\item Получить практический навык создания функций по описанию;
\item Попрактиковаться в написании простых функций, манипулирующих ссылочными данными.
\end{itemize}
\subsection{План-содержание}
\noindent
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
\hline
@ Что происходит & @ Время & @ Слайды & @ Описание \\
\hline
\endhead
@ Организационный момент & 5 tag(beg) & @ 1-4 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
\hline
@ Quiz & 5 & @ 3-14 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ лекции & 15 & @ 15-18 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 19 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 10 & @ 20-22 & @ Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки. Показать выполненные терминальные команды, результат компиляции. (* отделить исходный код от скомпилированных файлов, ** сложить исходный код в пакет) \\
\hline
@ Перерыв (если нужен) & 5 & @ 26 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 2 & 10 & @ 23-25 & @ Настроить окружение Jupyter Notebook с ядром Java, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown. (* осуществить форматированный вывод, ** сохранить форматирующую строку в ячейке с переменной) \\
\hline
@ Задание 3 & 15 & @ 27-29 & @ К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать программную документацию. (* создать документацию на каждый пакет по отдельности) \\
\hline
@ Домашнее задание & 5 & @ 39 & @ Объясните домашнее задание, подведите итоги урока \\
\hline
@ Рефлексия & 10 tag(end) & @ 40-42 & @ Преподаватель запрашивает обратную связь \\
\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 Запрашивает активность от аудитории в чате;
\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 Какой механизм используется для непосредственного исполнения скомпилированного кода? (3)
\begin{enumerate}
\item JDK;
\item JRE;
\item JVM.
\end{enumerate}
\item Сущность, объединяющая классы по смыслу (1)
\begin{enumerate}
\item Пакет;
\item Фреймворк;
\item Библиотека.
\end{enumerate}
\item Основная единица исходного кода программы. (1)
\begin{enumerate}
\item Класс;
\item Пакет;
\item Функция.
\end{enumerate}
\item Какой ключ используется для указания директории назначения в командах компилятора? (2)
\begin{enumerate}
\item \code{-out};
\item \code{-d};
\item \code{-classpath}
\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{figure}[H]
\centering
\includegraphics[width=100mm]{sem-01-struct.png}
\caption{Структура проекта}
\end{figure}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код основного класса}]{src/s01-h01-Main.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код считающего класса}]{src/s01-h01-OtherClass.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код декоратора}]{src/s01-h01-Decorator.java}
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.
\textbf{Вариант решения}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
java -classpath ./out ru.gb.jcore.sample.Main
\end{lstlisting}
\begin{figure}[H]
\centering
\includegraphics[width=60mm]{sem-01-hw2-compile.png}
\caption{Результат компиляции}
\end{figure}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команда создания документации}]
javadoc -d docs -sourcepath ./src -cp ./out -subpackages ru
\end{lstlisting}
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-hw2-doc.png}
\caption{Результат создания документации}
\end{figure}
\item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.
\textbf{Вариант решения}\footnote{Обратите внимание, что все отступы сделаны не пробелами, а табуляцией, иначе Makefile не работает}
\lstinputlisting[style=CCodeStyle,caption={Makefile}]{src/s01-h03-Makefile}
\begin{figure}[H]
\centering
\includegraphics[width=80mm]{sem-01-hw03.png}
\caption{Результат выполнения тасков}
\end{figure}
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере пользователя, а второй забирать скомпилированные классы и исполнять их.
\textbf{Вариант решения}
\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{Тайминг} 10-20 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (запуск приложений на сервере, в контейнерах, настройка CI/CD в пет-проектах);
\item Выдать задание группам студентов, показать где именно следует искать терминал ОС;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}:
\begin{itemize}
\item Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Простейший проект}]
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
\end{lstlisting}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac Main.java
java Main
\end{lstlisting}
\item [$*_1$] отделить исходный код от скомпилированных файлов
\textbf{Вариант решения}
\begin{lstlisting}[style=ASMStyle]
javac -d out Main.java
java -classpath ./out Main
\end{lstlisting}
\item [$*_2$] сложить исходный код в пакет с глубиной иерархии не менее 3.
\textbf{Вариант решения}
Вручную создать соответствующие вложенные папки, переместить в них файл с исходным кодом \code{Main.java} и написать оператор \code{package} первой строкой файла \code{Main.java}.
\begin{lstlisting}[style=ASMStyle]
javac -d out ru/gb/jcore/Main.java
java -classpath ./out ru.gb.jcore.Main
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 2}
\begin{itemize}
\item \textbf{Ценность этапа} Настройка и изучение дополнительного инструментария для создания проектов и описания работы фрагментов кода в виде Jupyter notebook.
\item \textbf{Тайминг} 10-15 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (использование скриптовых возможностей среды разработки, таких как написание простых фрагментов кода без необходимости создавать большой проект в тяжеловесной среде разработки);
\item Пояснить студентам в каком виде выполнять и сдавать задания;
\item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item Настроить окружение Jupyter Notebook с ядром IJava, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown.
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-t2-1.png}
\caption{Вариант решения}
\end{figure}
\item [$*_1$] осуществить форматированный вывод
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант решения (вторая ячейка)}]
System.out.print("Your number is " + a);
\end{lstlisting}
\item [$*_1$] сохранить форматирующую строку в ячейке с переменной
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-t2-2.png}
\caption{Вариант решения}
\end{figure}
\end{itemize}
\end{itemize}
\subsubsection{Задание 3}
\begin{itemize}
\item \textbf{Ценность этапа} Закрепление навыков создания стандартной программной документации.
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (описание пет-проектов для потенциальных соисполнителей, создание базы знаний по проекту на случай длительных пауз в работе)
\item Выдать задание группам студентов
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции, и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать общую программную документацию.
\textbf{Вариант решения}
\begin{figure}[H]
\centering
\includegraphics[width=80mm]{sem-01-t3-1.png}
\caption{Иерархия получившегося проекта}
\end{figure}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основной класс}]{src/s01-t3-Simple.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Вспомогательный класс}]{src/s01-t3-Complex.java}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции и создания документации}]
javac -sourcepath . -d out ru/gb/Simple.java
java -classpath ./out ru.gb.Simple
javadoc -d doc -sourcepath . -cp ./out -subpackages ru
\end{lstlisting}
\item [$*_1$] создать документацию на каждый пакет по отдельности
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Вариант решения}]
javadoc -d doc_gb -sourcepath . -cp ./out ru.gb
javadoc -d doc_bg -sourcepath . -cp ./out ru.bg
\end{lstlisting}
\end{itemize}
\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 Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;
\item
\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}
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,22 @@
package ru.gb.jcore.regular;
/**
* <@\lh{dkgreen}{Декоратор. Он декорирует, то есть, накладывает на результат декорации.}@>
* <@\lh{dkgreen}{Внешний вид важен, поэтому этот класс существует.}@>
* */
public class Decorator {
/**
* <@\lh{dkgreen}{Функция декорирования числа для вывода в консоль}@>
* <@\lh{dkgreen}{в виде строки с преамбулой 'Вот Ваше число'}@>
*
* @param a <@\lh{dkgreen}{число, требующее декорации}@>
* @return <@\lh{dkgreen}{Отформатированная строка.}@>
* */
public static String decorate(int a) {
/*
* <@\lh{dkgreen}{Метод декорирует число, добавляя к нему строку}@>
* <@\lh{dkgreen}{при помощи функции форматирования строк}@>
* */
return String.format("Here is your number: %d.", a);
}
}

View File

@ -0,0 +1,26 @@
package ru.gb.jcore.sample;
import ru.gb.jcore.regular.Decorator;
import ru.gb.jcore.regular.OtherClass;
/**
* <@\lh{dkgreen}{Основной класс приложения. Здесь мы можем описать}@>
* <@\lh{dkgreen}{его основное назначение и способы взаимодействия с ним.}@>
* */
public class Main {
/**
* <@\lh{dkgreen}{Точка входа в программу. С неё всегда всё начинается.}@>
*
* @param args <@\lh{dkgreen}{стандартные аргументы командной строки}@>
* */
public static void main(String[] args) {
int result = OtherClass.add(2, 2);
System.out.println(Decorator.decorate(result));
result = OtherClass.sub(2, 2);
System.out.println(Decorator.decorate(result));
result = OtherClass.mul(2, 2);
System.out.println(Decorator.decorate(result));
result = OtherClass.div(2, 2);
System.out.println(Decorator.decorate(result));
}
}

View File

@ -0,0 +1,51 @@
package ru.gb.jcore.regular;
/**
* <@\lh{dkgreen}{Другой, очень полезный класс приложения. Здесь мы можем описать}@>
* <@\lh{dkgreen}{его основное назначение и способы взаимодействия с ним.}@>
* */
public class OtherClass {
/**
* <@\lh{dkgreen}{Функция суммирования двух целых чисел}@>
*
* @param a <@\lh{dkgreen}{первое слагаемое}@>
* @param b <@\lh{dkgreen}{второе слагаемое}@>
* @return <@\lh{dkgreen}{сумма a и b, без проверки на переполнение переменной.}@>
* */
public static int add(int a, int b) {
return a + b; // <@\lh{dkgreen}{возврат без проверки переполнения}@>
}
/**
* <@\lh{dkgreen}{Функция деления двух целых чисел}@>
*
* @param a <@\lh{dkgreen}{делимое}@>
* @param b <@\lh{dkgreen}{делитель}@>
* @return <@\lh{dkgreen}{частное a и b, без проверки на переполнение переменной.}@>
* */
public static int div(int a, int b) {
return a / b; // <@\lh{dkgreen}{возврат без проверки переполнения}@>
}
/**
* <@\lh{dkgreen}{Функция умножения двух целых чисел}@>
*
* @param a <@\lh{dkgreen}{первый множитель}@>
* @param b <@\lh{dkgreen}{второй множитель}@>
* @return <@\lh{dkgreen}{произведение a и b, без проверки на переполнение переменной.}@>
* */
public static int mul(int a, int b) {
return a * b; // <@\lh{dkgreen}{возврат без проверки переполнения}@>
}
/**
* <@\lh{dkgreen}{Функция вычитания двух целых чисел}@>
*
* @param a <@\lh{dkgreen}{уменьшаемое}@>
* @param b <@\lh{dkgreen}{вычитаемое}@>
* @return <@\lh{dkgreen}{разность a и b, без проверки на переполнение переменной.}@>
* */
public static int sub(int a, int b) {
return a - b; // <@\lh{dkgreen}{возврат без проверки переполнения}@>
}
}

View File

@ -0,0 +1,24 @@
SRC_DIR := src
OUT_DIR := out
DOC_DIR := doc
JC := javac
JDOC := javadoc
JSRC := -sourcepath ./$(SRC_DIR)
JCLASS := -cp ./$(OUT_DIR)
JCDEST := -d $(OUT_DIR)
JDOCDEST := -d $(DOC_DIR)
MAIN_SOURCE := ru/gb/jcore/sample/Main
MAIN_CLASS := ru.gb.jcore.sample.Main
all:
${JC} ${JSRC} ${JCDEST} ${SRC_DIR}/${MAIN_SOURCE}.java
clean:
rm -R ${OUT_DIR}
run:
cd out && java ${MAIN_CLASS}
docs:
${JDOC}) ${JDOCDEST} ${JSRC} ${JCLASS} -subpackages ru

View File

@ -0,0 +1,15 @@
package ru.bg;
/**
* <@\lh{dkgreen}{Это уже весьма усложнённый класс, мы будем его вызывать из простого}@>
*/
public class Complex {
/**
* <@\lh{dkgreen}{Функция, возвращающая какую-то строку. Возможно, даже приветствующую мир.}@>
*
* @return <@\lh{dkgreen}{строка с приветствием.}@>
* */
public static String hello() {
return "Hello, world!";
}
}

View File

@ -0,0 +1,17 @@
package ru.gb;
import ru.bg.Complex;
/**
* <@\lh{dkgreen}{Это простой класс. Он простой настолько, что ничего не делает}@>
*/
public class Simple {
/**
* <@\lh{dkgreen}{Функция запускающая программу и приветствующая мир.}@>
* <@\lh{dkgreen}{Наверное, самая популярная функция в мире.}@>
*
* @param args <@\lh{dkgreen}{стандартные аргументы командной строки}@>
* */
public static void main(String[] args) {
System.out.println(Complex.hello());
}
}