\immediate\write18{texcount -sum -1 -inc j-spec.tex > /tmp/wordcount.tex}

\documentclass[a4paper,12pt]{article}
\usepackage[english,russian]{babel}

\input{settings/main-style-preamble}
\input{settings/fancy-listings-preamble}

\graphicspath{{./pics/}}
\title{Техническая специализация Java\\\small{(1. Java Core)}}
\author{Иван Игоревич Овчинников}
\date{\today{} (\DTMcurrenttime)}

\usepackage{subfiles}

\begin{document}
\maketitle
\tableofcontents
\pagestyle{plain}

\newpage
%\chapter{Java Core}
\subfile{jtc1-1a}

\section{Управление проектом: сборщики проектов}
Управление проектом: Jar-файлы; Gradle/Maven: зависимости, выгрузка артефакта, публичные репозитории, свойства проекта, приватные репозитории (хостинг); Bazel
\subsection*{Задания к семинару}
\begin{itemize}
\item Создать загружаемый артефакт с функцией суммирования двух чисел и загрузить его в локальный кэш артефактов;
\end{itemize}

\section{Специализация: данные и функции}
Базовые функции языка: математические операторы, условия, циклы, бинарные операторы; Данные: типы, преобразование типов, константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными); Функции: параметры, возвращаемые значения, перегрузка функций;
\subsection{Данные}
Хранение данных в Java осуществляется привычным для программиста образом: в переменных и константах. Языки программирования бывают типизированными и нетипизированными (бестиповыми).

Отсутствие типизации в основном присуще старым и низкоуровневым языкам программирования, например, Forth, некоторые ассемблеры. Все данные в таких языках считаются цепочками бит произвольной длины и, как следует из названия, не делятся на типы. Работа с ними часто труднее, и при чтении кода не всегда ясно, о каком типе переменной идет речь. При этом часто безтиповые языки работают быстрее типизированных, но описывать с их помощью большие проекты со сложными взаимосвязями довольно утомительно.
\begin{frm}
 Java является языком со строгой (сильной) явной статической типизацией.  
\end{frm}
Что это значит?
\begin{itemize}
\item Статическая - у каждой переменной должен быть тип и мы этот тип поменять не можем. Этому свойству противопоставляется динамическая типизация;
\item Явная - при создании переменной мы должны ей обязательно присвоить какой-то тип, явно написав это в коде. Бывают языки с неявной типизацией, например, Python;
\item Строгая(сильная) - невозможно смешивать разнотипные данные. С другой стороны, существует JavaScript, в котором запись \code{2 + true} выдаст результат \code{3}.
\end{itemize}

Все данные в Java делятся на две основные категории: примитивные и ссылочные. 

Данные: типы, преобразование типов, константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными);

\begin{figure}[H]
    \centering
    \begin{tabular}{|p{17mm}|p{80mm}|p{55mm}|}
        \hline
        Тип & Пояснение & Диапазон \\
        \hline
        byte & Самый маленький из адресуемых типов, 8 бит, знаковый & [\textminus128, +127] \\
        \hline
        short & Тип короткого целого числа, 16 бит, знаковый & [\textminus32 768, +32 767]\\
        \hline
        char & Целочисленный тип для хранения символов в кодировке UTF-8, 16 бит, беззнаковый & [0, +65 535]\\
        \hline
        int & Основной тип целого числа, 32 бита, знаковый & [\textminus2 147 483 648, +2 147 483 647] \\
        \hline
        long & Тип длинного целого числа, 64 бита, знаковый & [\textminus9 223 372 036 854 775 808, +9 223 372 036 854 775 807] \\
        \hline
        float & Тип вещественного числа с плавающей запятой (одинарной точности, 32 бита) &  \\
        \hline
        double & Тип вещественного числа с плавающей запятой (двойной точности, 64 бита) &  \\
        \hline
        boolean & Логический тип данных & true, false \\
        \hline
    \end{tabular}
    \caption{Основные типы данных в языке С}
    \label{tab:types}
\end{figure}

Базовые функции языка: математические операторы, условия, циклы, бинарные операторы;

Функции: параметры, возвращаемые значения, перегрузка функций;



\subsubsection{Антипаттерн "магические числа"}
В прошлом примере мы использовали антипаттерн - плохой стиль для написания кода. Число 18 используется в коде коде без пояснений. Такой антипаттерн называется "магическое число". Рекомендуется помещать числа в константы, которые храняться в начале файла.
ADULT = 18
age = float(input('Ваш возраст: '))
how\_old = age - ADULT
print(how\_old, "лет назад ты стал совершеннолетним")

Плюсом такого подхода является возможность легко корректировать большие проекты. Представьте, что в вашем коде несколько тысяч строк, а число 18 использовалось несколько десятков раз. 
●	При развертывании проекта в стране, где совершеннолетием считается 21 год вы будете перечитывать весь код в поисках магических "18" и править их на "21". В случае с константой изменить число нужно в одном месте.
●	Дополнительный сложности могут возникнуть, если в коде будет 18 как возраст совершеннолетия и 18 как коэффициент для рассчёт чего-либо. Теперь править кода ещё сложнее, ведь возраст изменился, а коэффициент -нет. В случае с сохранением значений в константы мы снова меняем число в одном месте.

\subsection*{Задания к семинару}
\begin{itemize}
\item Написать как можно больше вариантов функции инвертирования массива единиц и нулей за 15 минут (без ветвлений любого рода);
\item Сравнить без условий две даты, представленные в виде трёх чисел гггг-мм-дд;
\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?

\newpage
\appendix
\sloppy
%\addcontentsline{toc}{chapter}{Термины, определения и сокращения}
\printnomenclature[20mm]

\chapter*{Приложения}
%\addcontentsline{toc}{chapter}{Приложения}
\renewcommand{\thesection}{\Asbuk{section}}

\end{document}
