diff --git a/.gitignore b/.gitignore index 9f852b0..858c740 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,12 @@ .DS_Store *.*# .*~ +/.vscode /build/* +/*/build/* /sources-draft !/build/*.pdf +!/*/build/*.pdf diff --git a/build/j-spec.pdf b/build/j-spec.pdf new file mode 100644 index 0000000..d29ddf3 Binary files /dev/null and b/build/j-spec.pdf differ diff --git a/build/prog-draft.pdf b/build/prog-draft.pdf index 6623d95..1875eb8 100644 Binary files a/build/prog-draft.pdf and b/build/prog-draft.pdf differ diff --git a/j-spec.tex b/j-spec.tex new file mode 100644 index 0000000..0dd5d8b --- /dev/null +++ b/j-spec.tex @@ -0,0 +1,135 @@ +\immediate\write18{texcount -sum -1 prog-draft.tex > /tmp/wordcount.tex} +\documentclass[12pt, a4paper]{report} +\usepackage[english,russian]{babel} % локализация и переносы +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{titlesec} +\usepackage{tikz} +\usepackage{indentfirst} +\usepackage{datetime2} +\usepackage{geometry} +\usepackage{enumitem} +\usepackage{multicol} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{longtable} +\usepackage{tikz} +\usepackage{hyperref} +\usetikzlibrary{mindmap,trees} + +\titlelabel{\thetitle. \quad} +\babelfont{rm}{PT Astra Serif} +\babelfont{sf}{PT Astra Serif} +\babelfont{tt}{PT Mono} +\graphicspath{{./pics/}} + +\newcommand{\wordcount}{\input{/tmp/wordcount.tex}} +\newcommand{\code}[1]{\small{\texttt{\detokenize{#1}}}\normalsize} +\renewcommand\labelitemi{\textemdash} +\newenvironment{frm} + { \begin{center} \begin{tabular}{|p{0.9\textwidth}|} \hline\\ } + { \\\\\hline \end{tabular} \end{center} } + +\fancypagestyle{plain}{ + \setlength{\headheight}{33pt} + \fancyhf{} + \lhead{\includegraphics[height=5mm]{logo.png}} + \rhead{И.И. Овчинников \\ \href{https://t.me/ivanigorevichfeed}{Telegram: ivanigorevichfeed}} + \chead{\thepage} + \cfoot{\faRocket} + \rfoot{Всего слов: \wordcount} +} + +\geometry{ + left=2cm, + right=1cm, + top=2cm, + bottom=2cm +} + +\title{ТЗ на "Специализацию Java"} +\author{Иван Игоревич Овчинников} +\date{\today{} (\DTMcurrenttime)} + +\setlist{nolistsep} +\setlist[itemize]{leftmargin=10mm} +\setlist[enumerate]{leftmargin=10mm} +\usepackage{subfiles} + + +\begin{document} +\maketitle +\tableofcontents + +\chapter{Java Core} + +\section{Платформа: история и окружение} +Краткая история (причины возникновения); JDK, JRE, JVM, выбор версии; CLI: сборка, множественные источники, пакеты, запуск; структура проекта: пакеты, классы, метод main, комментарии, документирование; +\subsection{Задания к семинару} +\begin{itemize} +\item [C-1] Скомпилировать проект из трёх классов, находящихся в двух пакетах, а также создать для этого проекта стандартную веб-страницу с документацией +\end{itemize} + +\section{Управление проектом: сборщики проектов} +Управление проектом: Jar-файлы; Gradle/Maven: зависимости, выгрузка артефакта, публичные репозитории, свойства проекта, приватные репозитории (хостинг); Bazel +\subsection{Задания к семинару} +\begin{itemize} +\item [C-2] Создать загружаемый артефакт с функцией суммирования двух чисел и загрузить его в локальный кэш артефактов; +\end{itemize} + +\section{Специализация: данные и функции} +Базовые функции языка: математические операторы, условия, циклы, бинарные операторы; Данные: типы, преобразование типов, константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными); Функции: параметры, возвращаемые значения, перегрузка функций; +\subsection{Задания к семинару} +\begin{itemize} +\item [C-3] Написать как можно больше вариантов функции инвертирования массива единиц и нулей за 15 минут (без ветвлений любого рода); +\item [C-3] Сравнить без условий две даты, представленные в виде трёх чисел гггг-мм-дд; +\end{itemize} + +\section{Специализация: ООП} +Инкапсуляция: Классы и объекты (внутренние классы, вложенные классы, static, private/public, final, интерфейс взаимодействия с объектом), перечисления (создание, конструкторы перечислений, объекты перечислений, дополнительные свойства); Наследование: extends, Object (глобальное наследование), protected, преобразование типов, final; Полиморфизм: override, abstract, final; +\subfile{scenarios/jc-4} + +\section{Специализация: Тонкости работы} +Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML? + + + +\chapter{Java Development Kit} +\section{Исключения} +Механизм и понятие, введение в \textbf{многопоточность}, throw; Наследование и полиморфизм в исключениях; Способы обработки исключений (try/catch, throws, finally); try-with-resources, штатные и нештатные ситуации + +\section{Интерфейсы} +Понятие и принцип работы, implements; Наследование и множественное наследование интерфейсов; Значения по-умолчанию + +\section{Обобщённое программирование} + +\section{Коллекции} +List, Set; Хэш-код, интерфейс Comparable; Map, Object (Использование методов, Переопределение методов); Итераторы, \textbf{Многопоточные} коллекции + +\section{Многопоточность} +Понятие, Принцип (реальная и псевдопараллельность); Runnable, Thread (Свойства, Особенности создания); Deadlock, Состояние гонки, Object (Ожидание/уведомление); Синхронизация (Синхронизация по монитору, Частичная, по классу) + +\section{Графический интерфейс пользователя} +GUI (Swing): Окна и свойства окон, \textbf{Многопоточность} и абстргирование асинхронных вызовов; менеджеры размещений и проведение параллелей с веб-фреймворками, разделение на фронт-энд и бэк-энд; JPanel и рисование, Обработка действий пользователя + + +\chapter{Java Junior} +\section{JDBC} + +\section{Сетевое программирование} +Socket, ServerSocket, Многопоточность, абстрагирование сетевого взаимодействия, интерфейсы + +\section{Введение в архитектуры приложений на Java} +клиент-серверы, веб-приложения, сервлеты, толстые и тонкие клиенты, выделение бизнес-логики и хранения, создание общих пространств и модульность проекта + +\section{Сериализация, StreamAPI, ReflectionAPI} + +\section{Введение в Java EE} + +\section{Введение в Spring framework} + + +\chapter{Java Junior+} + +\end{document} + diff --git a/prog-draft.tex b/prog-draft.tex index 9f716c0..e688658 100644 --- a/prog-draft.tex +++ b/prog-draft.tex @@ -26,7 +26,9 @@ \newcommand{\wordcount}{\input{/tmp/wordcount.tex}} \newcommand{\code}[1]{\small{\texttt{\detokenize{#1}}}\normalsize} \renewcommand\labelitemi{\textemdash} - +\newenvironment{frm} + { \begin{center} \begin{tabular}{|p{0.9\textwidth}|} \hline\\ } + { \\\\\hline \end{tabular} \end{center} } \fancypagestyle{plain}{ \setlength{\headheight}{33pt} diff --git a/scenarios/build/jc-4.pdf b/scenarios/build/jc-4.pdf new file mode 100644 index 0000000..0ebcfb6 Binary files /dev/null and b/scenarios/build/jc-4.pdf differ diff --git a/scenarios/jc-4.tex b/scenarios/jc-4.tex new file mode 100644 index 0000000..7ccca77 --- /dev/null +++ b/scenarios/jc-4.tex @@ -0,0 +1,43 @@ +\documentclass[../j-spec.tex]{subfiles} +\begin{document} + +\subsection{Сценарий урока} +\textit{(несмотря на наличие базовых знаний об ООП, глубоко убеждён, что базовое вступление всё равно нужно, поэтому...)} +Добрый вечер, вот мы с вами и покончили со вступлениями, добравшись до самого интересного. Объектно ориентированное программирование. + +Главное, что нам нужно сегодня сделать - это получить понимание. А для этого нам нужно, в первую очередь, расслабиться и не пытаться судорожно запомнить все умные слова которые мы слышим сразу, слова запомнятся сами собой, когда придёт понимание. На деле за аббревиатурой ООП не стоит ничего страшного. Все новички часто пугаются, мол, ООП то, ООП сё, я же призываю вас не думать о сложностях. + +Как вы, вероятнее всего, уже слышали и знаете, основа всего языка Java это классы. На классах построен весь язык Java. Все программы, которые мы писали до этого - это тоже классы. Не очень полезные, и особо ничего не делающие, но всё же классы. Самое важное, что надо знать о классах - это то, что классы определяют новый тип данных для нашей программы. + +\textbf{нарисовать котика} + +Скорее всего, все видят на этой картинке котика? Понятно, что мой художественный талант оставляет желать лучшего, но всё же, это скорее котик, чем, скажем, дом или дерево. Что это значит? То, что у нас в голове есть некоторый шаблон, по которому мы определяем, является-ли объект котиком. Класс это как бы чертёж. Когда мы увидим настоящего котика - мы сразу поймём это, будь он рыжий чёрный или цветной, и какой-бы породы он ни был - мы понимаем, что это кот. + +В данной ситуации, кот - это класс. Для объявления класса в Java внезапно используется ключевое слово \code{class} и далее пишется название класса с большой буквы. В общем случае, когда мы пишем большую программу, в которой используем большое количество классов - они все раскидываются по отдельным файлам, и не должны создавать из кода малочитаемую простыню символов. \textbf{Важно, что название публичного класса в файле должно полностью совпадать с названием самого файла, здесь же стоит напомнить о том, что Java - это регистрозависимый язык, то есть заглавные буквы с точки зрения компилятора отличаются от строчных}. Классы обычно представляют модели объектов из реального мира: машина, книга, котик; или некоторые программные абстракции: строка текста, поток ввода, соединение с сервером. + +Создадим наш первый класс, котика. У котика, как минимум, должно быть имя, окрас и возраст. Раньше мы работали с уже определёнными типами данных, такими, как инты, байты, стринги и массивы. Теперь у нас есть свой собственный тип данных - кот. Он, как и массив, является ссылочным, но может хранить в себе вот такие разнородные данные, а также содержать методы, но об этом чуточку позже. Как и в случае с массивами, объекты классов надо создавать. Иногда они также называются экземплярами, котик номер один, котик номер два и так далее. Много котиков всё ещё остаются котиками, но каждый из них - отдельный экземпляр. Экземпляр класса - это и есть объект из той самой аббревиатуры “ООП”. Создание экземпляра класса в общем виде выглядит так + +\code{Cat c1 = new Cat();} + +После выполнения этой инструкции, c1 станет экземпляром класса Cat. Ничего не напоминает? Да именно так мы создавали массивы. Только теперь мы создали не набор однотипных переменных, а набор тех переменных, которые посчитали нужными. Удобно, не правда-ли? По описанному нами шаблону мы теперь можем создать любое количество объектов, экземпляров этого класса, и все они будут независимы друг от друга, если мы явно не укажем обратное. Как мы помним, в нашем классе были три переменных, значит и в нашем объекте они тоже есть. На первый взгляд, может показаться, что мы в правой части этого выражения только лишний раз продублировали название класса, но это не так. На самом дела - это вызов конструктора, но о конструкторах мы также поговорим немного позже, пока разберёмся с тем, что находится внутри экземпляра класса кота. + +В переменных хранится так называемое состояние объекта. В методах-же описывается поведение объекта, то есть те вещи, которые он, объект, умеет делать. Наверняка вы помните, как на более ранних уроках вы мучительно не понимали, зачем нам писать отдельные функции и методы, если можно просто взять и написать всю нашу программу строчками подряд? Вот оно - то самое место, где они, функции и методы, очень нужны и важны. Для описания поведения наших классов. Фактически, этим мы и занимались всё время - описывали поведение нашего основного класса. Все экземпляры всех классов имеют свои адреса в памяти и занимают там отдельные области, а идентификатор хранит ссылку на адрес в памяти, где всё это находится. + +Рисовать очередной арт-хаус. + +С полями разобрались, поговорим о методах. Все мы знаем, что котики умеют мяукать и смешно прыгать. В целях демонстрации мы в описании этих действий просто делать разные выводы в консоль, хотя мы и можем научить нашего котика выбирать минимальное значение из массива, но это было бы, как минимум, неожиданно. Итак опишем метод, например, подать голос и прыгать, а прыгать наш котик будет только если он моложе, скажем, пяти лет. Теперь когда мы хотим позвать нашего котика, он нам скажет, «мяу, я *имя котика*», а если мы решили что котику надо прыгать, он решит, прилично-ли это - прыгать в его возрасте. + +Конструкторы классов нужны для нескольких вещей, например, для того, чтобы наш класс сразу что-то сделал при создании. Например, + +\code{public Cat () { System.out.println("hello, class"); }}. Шучу, это бесполезно. + +Например, чтобы мы могли не создать пустой экземпляр и наполнять его, а чтобы сразу задать ему базовые параметры окраса и имени. Или возраста и окраса, если сделать перегрузку конструктора. Все помнят про перегрузку методов? Тут ситуация точно такая же, в зависимости от типов передаваемых параметров, компилятор выберет нужный конструктор. + +Обратите внимание, что мы описываем конструкторы и вызываем именно их в правой части выражения, создающего новые экземпляры котиков. Но, что за конструктор мы видели в самом начале, когда ни о каких конструкторах ещё совсем ничего не знали? Это называется, конструктором по-умолчанию, его создаёт компилятор, если не увидит в описании класса никаких конструкторов. То есть, рассуждения компилятора можно представить себе примерно следующим образом: +\begin{itemize} +\item так, этот программист ничего не знает о конструкторах и о том что у языка полностью объектно-ориентированная природа, добавлю для него пустой конструктор, пусть не думает о моём внутреннем устройстве; +\item о, программист написал какой-то конструктор, значит он знает о том, что это такое и зачем нужно, не буду ему помогать, ему виднее. +\end{itemize} +Из чего мы можем сделать простой вывод: как только мы добавили любой конструктор в наш класс, конструктор по-умолчанию создаваться не будет, а значит, если он нам нужен, придётся его добавить вручную. Зачем может понадобиться конструктор по-умолчанию, поговорим далее. + +\end{document} \ No newline at end of file