diff --git a/build/jtc2-02a.pdf b/build/jtc2-02a.pdf new file mode 100644 index 0000000..06eaf9f Binary files /dev/null and b/build/jtc2-02a.pdf differ diff --git a/jtc2-02a.tex b/jtc2-02a.tex new file mode 100644 index 0000000..9883edb --- /dev/null +++ b/jtc2-02a.tex @@ -0,0 +1,99 @@ +\documentclass[j-spec.tex]{subfiles} + +\begin{document} +\section{Специализация: данные и функции} +\subsection{В предыдущем разделе} +\begin{itemize} +\item Краткая история (причины возникновения); +\item инструментарий, выбор версии; +\item CLI; +\item структура проекта; +\item документирование; +\item некоторые интересные способы сборки проектов. +\end{itemize} + +\subsection{В этом разделе} +Будет рассмотрен базовый функционал языка, то есть основная встроенная функциональность, такая как математические операторы, условия, циклы, бинарные операторы. Далее способы хранения и представления данных в Java, и в конце способы манипуляции данными, то есть функции (в терминах языка называющиеся методами). + +\subsection{Данные} +\subsubsection{Типы, преобразование типов} +%константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными) + +Хранение данных в Java осуществляется привычным для программиста образом: в переменных и константах. Языки программирования бывают типизированными и нетипизированными (бестиповыми). + +Отсутствие типизации в основном присуще старым и низкоуровневым языкам программирования, например, Forth, некоторые ассемблеры. Все данные в таких языках считаются цепочками бит произвольной длины и, как следует из названия, не делятся на типы. Работа с ними часто труднее, и при чтении кода не всегда ясно, о каком типе переменной идет речь. При этом часто безтиповые языки работают быстрее типизированных, но описывать с их помощью большие проекты со сложными взаимосвязями довольно утомительно. +\begin{frm} +\info Java является языком со \textbf{строгой} (также можно встретить термин «\textbf{сильной}») \textbf{явной} \textbf{статической} типизацией. +\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{Основные типы данных в языке Java} + \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{Базовый функционал языка} +\subsubsection{Математические операторы} +\subsubsection{Условия} +\subsubsection{Циклы} +\subsubsection{Бинарные арифметические операторы}; + +\subsection{Функции} +параметры, возвращаемые значения, перегрузка функций + +\subsection*{Задания к семинару} +\begin{itemize} +\item Написать как можно больше вариантов функции инвертирования массива единиц и нулей за 15 минут (без ветвлений любого рода); +\item Сравнить без условий две даты, представленные в виде трёх чисел гггг-мм-дд; +\end{itemize} + + +\end{document} diff --git a/scenarios/build/jtc2-02b.pdf b/scenarios/build/jtc2-02b.pdf new file mode 100644 index 0000000..7eb6bd5 Binary files /dev/null and b/scenarios/build/jtc2-02b.pdf differ diff --git a/scenarios/jtc2-02b.tex b/scenarios/jtc2-02b.tex index ce02c3d..5929e4a 100644 --- a/scenarios/jtc2-02b.tex +++ b/scenarios/jtc2-02b.tex @@ -57,85 +57,77 @@ Будет рассмотрен базовый функционал языка, то есть основная встроенная функциональность, такая как математические операторы, условия, циклы, бинарные операторы. Далее способы хранения и представления данных в Java, и в конце способы манипуляции данными, то есть функции (в терминах языка называющиеся методами). } -\subsection{Данные} -\subsubsection{Типы, преобразование типов} -%константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными) +\begin{frame} +\frametitle{Типы, преобразование типов} +\end{frame} +\note{ +Хранение данных в Java осуществляется привычным для программиста образом: в переменных и константах, желательно именованных, но об этом позже, для начала поговорим о том, какие вообще бывают языки относительно типов и собственно типы. -Хранение данных в Java осуществляется привычным для программиста образом: в переменных и константах. Языки программирования бывают типизированными и нетипизированными (бестиповыми). +Итак, языки программирования бывают типизированными и нетипизированными (бестиповыми). Про нетипизированные языки мы много говорить не будем, они не представляют интереса не только для джава программистов, но и в целом, в современном программировании. +} -Отсутствие типизации в основном присуще старым и низкоуровневым языкам программирования, например, Forth, некоторые ассемблеры. Все данные в таких языках считаются цепочками бит произвольной длины и, как следует из названия, не делятся на типы. Работа с ними часто труднее, и при чтении кода не всегда ясно, о каком типе переменной идет речь. При этом часто безтиповые языки работают быстрее типизированных, но описывать с их помощью большие проекты со сложными взаимосвязями довольно утомительно. -\begin{frm} -\info Java является языком со \textbf{строгой} (также можно встретить термин «\textbf{сильной}») \textbf{явной} \textbf{статической} типизацией. -\end{frm} +\begin{frame} + \frametitle{Типы, преобразование типов} + рисунок перфокарты +\end{frame} +\note{ +Отсутствие типизации в основном присуще чрезвычайно старым и низкоуровневым языкам программирования, например, Forth и некоторым ассемблерам. Все данные в таких языках считаются цепочками бит произвольной длины и, как следует из названия, не делятся на типы. Работа с ними часто труднее, и при чтении кода не всегда ясно, о каком типе переменной идет речь. При этом часто безтиповые языки работают быстрее типизированных, но описывать с их помощью большие проекты со сложными взаимосвязями довольно утомительно. +} + +\begin{frame} +\frametitle{Типы, преобразование типов} +Java является языком со \textbf{строгой} (также можно встретить термин «\textbf{сильной}») \textbf{явной} \textbf{статической} типизацией. +\end{frame} +\note{ Что это значит? \begin{itemize} -\item Статическая - у каждой переменной должен быть тип и мы этот тип поменять не можем. Этому свойству противопоставляется динамическая типизация; -\item Явная - при создании переменной мы должны ей обязательно присвоить какой-то тип, явно написав это в коде. Бывают языки с неявной типизацией, например, Python; -\item Строгая(сильная) - невозможно смешивать разнотипные данные. С другой стороны, существует JavaScript, в котором запись \code{2 + true} выдаст результат \code{3}. +\item Статическая типизация означает, что у каждой переменной должен быть тип и мы этот тип поменять не можем. Этому свойству противопоставляется динамическая типизация, где мы можем назначить переменной сначала один тип, потом заменить на другой; +\item Термин явная типизация говорит нам о том, что при создании переменной мы должны ей обязательно присвоить какой-то тип, явно написав это в коде. Бывают языки с неявной типизацией, например, Python, там можно как указать тип, так его и не указывать, язык сам попробуед по контексту догадаться, что вы имели ввиду; +\item Строгая (или иначе сильная) типизация означает, что невозможно смешивать разнотипные данные. Тут есть некоторая оговорка, о которой мы поговорим позже, но с формальной точки зрения язык джава - это язык со строгой типизацией. С другой стороны, существует JavaScript, в котором запись 2 + true выдаст результат 3. \end{itemize} +} -Все данные в Java делятся на две основные категории: примитивные и ссылочные. +\begin{frame} +\frametitle{Типы, преобразование типов} +таблица из методички «Основные типы данных в языке Java» +\end{frame} +\note{ +Все данные в 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{Антипаттерн "магические числа"} +\begin{frame} + \frametitle{Антипаттерн «магические числа»} + кусок Петренко, спасибо ему за идею +\end{frame} +\note{ В прошлом примере мы использовали антипаттерн - плохой стиль для написания кода. Число 18 используется в коде коде без пояснений. Такой антипаттерн называется "магическое число". Рекомендуется помещать числа в константы, которые храняться в начале файла. ADULT = 18 age = float(input('Ваш возраст: ')) how\_old = age - ADULT print(how\_old, "лет назад ты стал совершеннолетним") -Плюсом такого подхода является возможность легко корректировать большие проекты. Представьте, что в вашем коде несколько тысяч строк, а число 18 использовалось несколько десятков раз. -● При развертывании проекта в стране, где совершеннолетием считается 21 год вы будете перечитывать весь код в поисках магических "18" и править их на "21". В случае с константой изменить число нужно в одном месте. -● Дополнительный сложности могут возникнуть, если в коде будет 18 как возраст совершеннолетия и 18 как коэффициент для рассчёт чего-либо. Теперь править кода ещё сложнее, ведь возраст изменился, а коэффициент -нет. В случае с сохранением значений в константы мы снова меняем число в одном месте. +Плюсом такого подхода является возможность легко корректировать большие проекты. Представьте, что в вашем коде несколько тысяч строк, а число 18 использовалось несколько десятков раз. +При развертывании проекта в стране, где совершеннолетием считается 21 год вы будете перечитывать весь код в поисках магических "18" и править их на "21". В случае с константой изменить число нужно в одном месте. +Дополнительный сложности могут возникнуть, если в коде будет 18 как возраст совершеннолетия и 18 как коэффициент для рассчёт чего-либо. Теперь править кода ещё сложнее, ведь возраст изменился, а коэффициент -нет. В случае с сохранением значений в константы мы снова меняем число в одном месте. +} -\subsection{Базовый функционал языка} -\subsubsection{Математические операторы} -\subsubsection{Условия} -\subsubsection{Циклы} -\subsubsection{Бинарные арифметические операторы}; +%константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными) -\subsection{Функции} -параметры, возвращаемые значения, перегрузка функций +% \subsection{Базовый функционал языка} +% \subsubsection{Математические операторы} +% \subsubsection{Условия} +% \subsubsection{Циклы} +% \subsubsection{Бинарные арифметические операторы}; -\subsection*{Задания к семинару} -\begin{itemize} -\item Написать как можно больше вариантов функции инвертирования массива единиц и нулей за 15 минут (без ветвлений любого рода); -\item Сравнить без условий две даты, представленные в виде трёх чисел гггг-мм-дд; -\end{itemize} +% \subsection{Функции} +% параметры, возвращаемые значения, перегрузка функций \end{document}