\documentclass[russian]{beamer} \usepackage{multicol} \usepackage[russian]{babel} \usepackage{fontspec} \input{../settings/fancy-listings-preamble} \usepackage{forest} \makeatletter \def\beamer@framenotesbegin{% at beginning of slide \usebeamercolor[fg]{normal text} \gdef\beamer@noteitems{}% \gdef\beamer@notes{}% } \makeatother \newcommand{\code}[1]{\small{\texttt{\detokenize{#1}}}\normalsize} % \setbeamertemplate{note page}{\pagecolor{yellow!5}\insertnote} % \setbeameroption{show notes on second screen=right} \usetheme{Madrid} \usecolortheme{seahorse} \setsansfont{IBM Plex Sans} \title{Специализация: данные и функции} \author{Иван Игоревич Овчинников} \institute[GB: Java]{GeekBrains. Java Core.} \date{2022} \begin{document} \setbeamertemplate{enumerate items}[circle] \setbeamertemplate{note page}[plain] \setbeameroption{show notes} \frame{\titlepage} \note{Перейдём к интересному: что можно хранить в джаве, как оно там хранится, и как этим манипулировать} \begin{frame} \frametitle{В предыдущих сериях} \begin{itemize} \item Краткая история (причины возникновения); \item инструментарий, выбор версии; \item CLI; \item структура проекта; \item документирование; \item некоторые интересные способы сборки проектов. \end{itemize} \end{frame} \note{ На прошлом уроке мы коротко поговорили об истории и причинах возникновения языка джава, вскользь посмотрели на инструментарий, который позволит нам писать на джава и получать результат, поверхностно изучилит интерфейс командной строки, научились стремительно создавать довольно симпатичную документацию к своему коду и посмотрели на то как можно автоматизировать ручную работу при компиляции своих проектов. } \begin{frame} \frametitle{На этой лекции} \end{frame} \note{ Будет рассмотрен базовый функционал языка, то есть основная встроенная функциональность, такая как математические операторы, условия, циклы, бинарные операторы. Далее способы хранения и представления данных в Java, и в конце способы манипуляции данными, то есть функции (в терминах языка называющиеся методами). } \begin{frame} \frametitle{Типы, преобразование типов} \end{frame} \note{ Хранение данных в Java осуществляется привычным для программиста образом: в переменных и константах, желательно именованных, но об этом позже, для начала поговорим о том, какие вообще бывают языки относительно типов и собственно типы. Итак, языки программирования бывают типизированными и нетипизированными (бестиповыми). Про нетипизированные языки мы много говорить не будем, они не представляют интереса не только для джава программистов, но и в целом, в современном программировании. } \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, в котором запись 2 + true выдаст результат 3. \end{itemize} } \begin{frame} \frametitle{Типы, преобразование типов} таблица из методички «Основные типы данных в языке Java» \end{frame} \note{ Все данные в Java делятся на две основные категории: примитивные и ссылочные. Чтобы отправить на хранение какие-то данные используется оператор присваивания, который вам всем хорошо знаком. Думаю, не лишним будет напомнить, что присвавивание в программировании - это не тоже самое, что математическое равенство, а полноценная операция. все присваивания всегда происходят справа налево, то есть сначала вычисляется правая часть, а потом результат вычислений присваивается левой. Именно поэтому в левой части не может быть никакиз вычислений. Примитивных всего восемь и это, наверное, первое, что спрашивают на джуниорском собеседовании, это байт, шорт, инт, лонг, флоут, дабл, чар и булин. как вы можете заметить в этой таблице, шесть из восьми типов имеет диапазон значений, а значит основное их отличие в объёме занимаемой памяти. На самом деле у дабла и флоута тоже есть диапазоны, просто они заключаются в другом и их довольно сложно отобразить в простой таблице. Что значат эти диапазоны? они значат, что если мы попытаемся положить в переменную меньшего типа какое-то большее значение, произойдёт неприятность, которая носит название «переполнение переменной». } \begin{frame} \frametitle{Типы, преобразование типов} переполнение переменной если презы умеют в гифки, нужна вода, льющаяся в переполненный стакан \end{frame} \note{ Интересное явление, рассмотрев его мы рассмотрим одни из самых трудноуловимых ошибок в программах, написанных на строго типизированных языках. С переполнением переменных есть одна неприятность: их не распознаёт компилятор. Итак, переполнение переменной - это ситуация, в которой как и было только что сказано, мы пытаемся положить большее значение в переменную меньшего типа. чем именно чревато переполнение переменной легче показать на примере (тут забавно будет вставить в слайд пару-тройку картинок из вот этого описания расследования крушения ракеты из-за переполнения переменной https://habr.com/ru/company/pvs-studio/blog/306748/) } \newpage \note{ (далее, возможно, лайвкод) если мы создадим переменную скажем байт, диапазон которого от -128 до +127, и присвоим этой переменной значение, скажем, 200, что произойдёт? правильно, переполнение, как если попытаться влить пакет молока в напёрсток, но какое там в нашей переменной останется значение максимальное 127? 200-127? какой-то мусор? именно этими вопросами никогда не надо задаваться, потому что каждый язык, а зачастую и разные компиляторы одного языка ведут себя в этом вопросе по разному. лучше просто не допускать таких ситуаций и проверять все значения на возможность присвоить их своим переменным. В современном мире гигагерцев и терабайтов почти никто не пользуется маленькими типами, их, наверное, можно считать своего рода пережитком, но именно из-за этого ошибки переполнения переменных становятся опаснее испанской инквизиции, их никто не ожидает (тут не помешает кадр из монти пайтон «no one expects spanish inqisition»). } \begin{frame} \frametitle{Типы, преобразование типов} целые числа \end{frame} \note{ целочисленных типов аж 4 и они занимают 1,2,4,8 байт соответственно. про чар, несмотря на то, что он целочисленный мы поговорим чуть позднее. с четырьмя основными целочисленными типами всё просто - значения в них могут быть только целые, никак и никогда невозможно присвоить им дробных значений, хотя и тут можно сделать оговорку и поклон в сторону арифметики с фиксированной запятой, но мы этого делать не будем, чтобы не взрывать себе мозг и не сбиваться с основной мысли. итак, целочисленные типы с диапазонами \begin{itemize} \item минус 128 плюс 127, \item минус 32768 плюс 32767, \item я никогда не запомню что там после минус и плюс 2млрд \item и четвёртый, который лично я никогда даже не давал себе труд дочитать до конца \end{itemize} про эти типы важно помнить два факта: \begin{enumerate} \item инт - это самый часто используемый тип, если сомневаетесь, какой использовать, используйте инт \item все числа, которые вы пишете в коде - это инты, даже если вы пытаетесь их присвоить переменной другого типа \end{enumerate} } \newpage \note{ Я вот сказал, что инт самый часто используемый и внезапно подумал: а ведь чаще всего было бы достаточно шорта, например, в циклах, итерирующихся по массивам, или во временных хранениях значений, скажем, возраста человека, но всё равно все по привычке используют инт. далее - лайвкод в котором нужно показать присвоение к байту и попытку присвоения лонга, показать предупреждения среды. как мы видим, к маленькому байту вполне успешно присваивается инт. получается, обманул, сказав, что все числа это инты? давайте посмотрим на следующий пример - попытку присвоить значение 5 млрд переменной типа лонг. помним, что в лонге можно хранить очень большие числа, но среда показывает ошибку, значит и тут наврал? давайте разбираться по порядку: если мы посмотрим на ошибку, там английскими буквами будет очень понятно написано - не могу положить такое большое значение в переменную типа инт. а это может значить только одно: справа - инт. не соврал. } \begin{frame} \frametitle{Типы, преобразование типов} немного о хранении чисел с плавающей точкой \end{frame} \note{ Диапазоны значений флоута и дабла заключаются не в величине возможных хранимых чисел, а в точности этих чисел после запятой. до какого знака будет сохранена точность. } \begin{frame} \frametitle{Типы, преобразование типов} таблица из методички «Основные типы данных в языке Java» \end{frame} \note{ Что ещё важного мы видив в этой таблице? шесть из восьми примитивных типов могут иметь как положительные, так и отрицательные значения } \begin{frame} \frametitle{Типы, преобразование типов} \end{frame} \note{ } % Данные: типы, преобразование типов, константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными); % Базовые функции языка: математические операторы, условия, циклы, бинарные операторы; % Функции: параметры, возвращаемые значения, перегрузка функций; \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 как коэффициент для рассчёт чего-либо. Теперь править кода ещё сложнее, ведь возраст изменился, а коэффициент -нет. В случае с сохранением значений в константы мы снова меняем число в одном месте. } %константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными) % \subsection{Базовый функционал языка} % \subsubsection{Математические операторы} % \subsubsection{Условия} % \subsubsection{Циклы} % \subsubsection{Бинарные арифметические операторы}; % \subsection{Функции} % параметры, возвращаемые значения, перегрузка функций \end{document}