На девятом занятии мы практиковались собирать проект с помощью Apache Ant. Про Ant и про Maven я рассказывал на последнем 19 уроке из курса Java для Тестировщиков. В этот раз мы более подробно остановились на создании скрипта сборки, написали скрипт "с нуля" для очень простого Java проекта и рассмотрели основные цели Ant. Чтобы не объяснять все это "на пальцах" и не писать много текста на доске, я воспользовался Eclipse, где сразу в IDE и показывал, как что делать.
Ответ на вопрос, почему именно Ant, а не Maven, достаточно прост: Ant часто используется в проектах в нашей компании и поэтому оказался востребованным для слушателей курса. Объяснять, что лучше, а что хуже, я не здесь не буду - решите каждый сам для себя, попробовав оба инструмента. Урок по использованию Maven мы, возможно, сделаем, однако пока в планах такого нету.
Скачать исходные файла примера, который был создан на видео, можно по этой ссылке.
На восьмом занятии мы рассмотрели работу с XML файлами в Java. Про то, что такое XML, я не рассказывал в курсе Java для тестировщиков и на этом занятии тоже не останавливался — подразумевается, что Вы это уже знаете. Мы рассмотрели три базовых способа взаимодействия со структурными файлами XML: чтение и поиск с помощью SAX, чтение и создание с помощью DOM, и маршалинг и демаршалинг с помощью JAXB. Мы рассматривали работу с очень простыми XML документами без схем или DTD описаний.
SAX-парсер — это самый простой способ чтения XML документа и поиска информации в нём. Однако, в силу своей простоты, обработка чуть более сложных документов (с множеством уровней иерархии элементов) становится очень трудоёмкой задачей. На практике применяется, скорее, для очень простых, либо очень больших по объёму документов. SAX-парсер встроен в саму Java, и никаких дополнительных библиотек для его использования не нужно. На этом ресурсе (англ.) есть простой пример по чтению документа этим парсером. Также, там внизу ссылка на то, как читать UTF-8 XML документ c помощью SAX.
Другой способ чтения XML документов — это использование объектной модели документа DOM. Данный способ позволяет также легко модифицировать и создавать документ. Так как структура XML файлов представлена в виде иерархии, то ее легко отобразить с помощью объектов в Java, где можно выделить родителя (Document) со списком потомков (Element), у которых могут быть свои потомки и т.д. DOM — это программный интерфейс, и существует различные его реализации. В самой Java есть классическая реализация, но большей популярностью пользуется библиотека JDOM. Попросту говоря, в ней больше полезных функций, и поэтому работать с ней легче. Собственно, на видео я приводил примеры функций как раз этой библиотеки. На том же англ. ресурсе есть простые и хорошие примеры как читать XML с помощью DOM и как создавать документ. Также там есть пример, как читать документ с помощью JDOM и создавать его.
Еще одним способом работы с XML документами, который уже можно отнести к классическим — это использование JAXB: отображения XML в Java классы. Раньше, эта технология была доступна при подключении дополнительной библиотеки, но сейчас она уже включена в ядро Java. Суть отображения можно вкратце описать так: приложение, которое обрабатывает информацию, представляет данные в виде иерархии и взаимосвязи различных объектов; определенные поля в этих объектах (которые описаны в соответствующих классах) помечаются мета-информацией (в нашем случае, аннотациями), которая используется JAXB для сохранения значений полей в XML документ, а также для чтения их из документа. Процесс сохранения данных называется маршалингом. Процесс чтения — демаршалингом. Использовать JAXB очень удобно, если цель Вашего приложения — это не работа с XML, а работа с информацией. А так как информацию надо где-то хранить и где-то брать, и если это «где-то» - это XML-файл, то процесс ввода/вывода можно сделать достаточно прозрачным и легко модифицируемым. И снова, тот же англ. ресурс содержит пример работы с JAXB.
Так как XML — это достаточно взрослый формат представления данных, то очень много написано документации по работе с ним на любом языке.
В качестве домашнего задания для данного урока, можно выполнить следующее:
Создать XML документ.
Найти какую-либо информацию в документе с помощью SAX-парсера.
Прочитать весь документ с помощью DOM-парсера (или JDOM) и вывести его на экран.
Создать несколько взаимосвязанных классов с несколькими полями и отобразить их с помощью JAXB: сохранить XML документ и прочитать его. Для тех, кто выполнял задания из нескольких первых занятий, то можно добавить аннотации к классам Product и сохранить информацию о продуктах в XML.
Седьмое занятие мы посвятили работе с файлами в Java. Мы рассмотрели базовые операции, такие как создание, удаление, и получение доступа к файлам и каталогам. Немного остановились на потоках, как бинарных, так и символьных, и их использовании для чтения и записи файлов. В конце занятия, я рассказал про библиотеку Apache Commons IO, в которой реализованы полезные методы для работы с файлами и потоками ввода/вывода. И, конечно, домашнее задание для закрепления материала. Про работу с файлами и потоками я рассказывал на уроке 11 из курса Java для тестировщиков, так что начинать изучение темы следует оттуда.
Для доступа к файлам в Java используются классы из пакета java.io. Для реализации высокопроизводительных операций ввода/вывода существуют также классы из пакета java.nio. Однако, их рассмотрение выходит за рамки данного курса. К тому же, я считаю, что разобраться там не составит труда после освоения традиционных способов.
Работу с файлами можно условно разделить на две составляющие. Во-первых, это операции, связанные с доступом и местоположением файлов и каталогов, такие как создание, перемещение, удаление, получение списка (у директории). Во-вторых, это операции чтения и записи содержимого файлов. Для первого случая используется базовый класс java.io.File, а также другие системные классы. Во втором случае используются потоки ввода/вывода. Стандартных системных классов Java часто бывает недостаточно для выполнения необходимых операций с файлами (например, копирование файла), и в таком случае использование сторонних библиотек выручает разработчика, чтобы не "изобретать велосипед" заново. Для работы с потоками в Java есть все, что нужно, хоть часто и приходится писать много сопутствующего кода для корректной обработки всех ситуаций. В данном случае также помогают сторонние библиотеки, предоставляющие методы, которые либо полностью выполняют нужные действия, либо избавляют от необходимости писать блоки стандартных вызовов.
Все операции ввода/вывода, а также методы создания потоков в Java выбрасывают проверяемые исключения. В обязательном порядке их необходимо отлавливать и обрабатывать. Как именно — это зависит уже от приложения, можно просто завершить работу, а можно попытаться восстановить нормальное функционирование с уведомлением пользователя. В любом случае, программист должен решить, что будет делать программа в случае возникновения ошибок ввода/вывода. Для ознакомления с исключениями можно послушать мой урок 9 из курса Java для тестировщиков.
На следующем занятии мы рассмотрим работу с двумя распространёнными типами файлов — properties и XML.
Домашнее задание для этого занятия:
Написать программу, которая читает текстовый файл, состоящий из нескольких строк, и записывает эти строки в отсортированном по длине порядке в другой текстовый файл.
Например, файл aa.txt, содержит следующие строки:
World! Hello And how do you do?
Созданный файл bb.txt будет содержать эти же строки в отсортированном по длине виде:
Hello
World!
And how do you do?
Для небольшого усложнения этого задания можно сделать следующее:
добавить возможность указывать исходный файл, целевой файл и направление сортировки (восходящая или спадающая) в командной строке, например так:
java SortFile aa.txt bb.txt asc
, где SortFile — класс, который мы запускаем, aa.txt — исходный файл, bb.txt — целевой файл, asc или desc — направление сортировки.
Написать программу, которая копирует все файлы из заданного каталога в целевой, при этом переименовывая их в случайном порядке, назначая имена файлам из числовой последовательности от 1 до N, где N — это количество файлов в каталоге. При этом имена файлов не могут повторяться.
Например, есть каталог, в котором хранятся файлы:
a.txt
b.txt
c.txt
Программа копирует эти файлы в другой каталог, назначая им следующие имена:
1.txt
2.txt
3.txt
При этом назначение имен происходит случайным образом, т. е. например, a.txt → 2.txt, b.txt → 1.txt, c.txt → 3.txt. Для выбора случайного числа, можно использовать Java класс Random.
Ну и, собственно, видео. Прошу прощения за качество видео - в последний момент сломался мой фотоаппарат и пришлось записывать на телефоны - сначала на один (пока там место не закончилось), потом на второй. Стол, на котором были установлены телефоны, шатался, поэтому видео я обработал стабилизатором от youtube.
После длительного перерыва, вызванного жарким летом и моим двойным отпуском, мы наконец-то вернулись к занятиям. Так как многие слушатели тоже были в отпуске, и кто-то что-то подзабыл, мы решили немного восстановить знания, обобщить известную информацию и уточнить план дальнейших действий. По просьбе "трудящихся" мы еще раз более подробно остановились на использовании интерфейсов в Java. Я уже рассказывал про это на уроке 5 из курса Java для тестировщиков. Можно рассматривать данное занятие, как дополнительную информацию, либо как подачу информации другими словами. Занятие получилось скорее теоретическим, чем практическим. Домашнего задания по определенным причинам нету :)
На пятом занятии я решил остановиться на использовании коллекций, как альтернативу применению массивов для хранения наборов данных. Интерфейсы коллекций в Java обеспечивают весь необходимый инструментарий для работы с различными наборами данных, поэтому их употребление, во-первых, повышает скорость разработки программ, а во-вторых, улучшает качество кода за счет повторного использования уже написанного и отлаженного кода. Про коллекции я рассказывал на уроке 10 в курсе Java для тестировщиков. Так как применение коллекций упрощает разбираемый пример, я немного усложнил логику приложения, чтобы сделать ее более интересной. В дополнению к работе над разбираемой задачей в конце занятия было поставлено одна интересная задача для самостоятельной работы.
На этом занятии мы рассмотрели не все интерфейсы коллекций и возможные варианты их использования. Это еще предстоит в будущем. Пока что мы остановились только на интерфейсах Collection, List, Map. Также рассмотрели использование итератора для прохождения коллекции и возможного удаления элементов.
Домашнее задание для этого занятия:
Добавить Map продуктов в класс Deal
Изменить методы getCost() и getSum(), чтобы они работали, используя Map продуктов.
Добавить Map свойств в Party вместо массивов keys и value.
Исправить методы ввода/вывода для работы с Map
Добавить возможность выбирать ранее введенный продукт при добавлении его в сделку.
Дополнительная задача для развития навыков программирования:
Написать программу, которая заполняет матрицу (двумерный массив) нулями и единицами так, чтобы получился рисунок песочных часов. Матрица обязательно квадратная. Размер матрицы пользователь вводит с консоли.
Например, для матрицы, размером 5х5, должен получиться такой рисунок: 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1
Я также написал возможное решение этой задачи, если вдруг кому-то будет очень сложно. Скачать исходные файлы можно тут: JavaPractice05.zip (5,9 KB)
Чтобы откомпилировать и запустить этот пример, выполните следующие команды:
cd <каталог_куда_распаковали_архив> cd src javac *.java java Program5 - это для запуска программы о сделках java Program5Additional - это для запуска песочных часов
Также, если Вы уже умеете работать со средой разработки Eclipse, то можете импортировать этот проект в нее и запустить.
На четвертом занятии мы продолжили разбирать пример из предыдущего урока, немного усложнив его. Основное внимание в этот раз было уделено наследованию: класс Product мы сделали абстрактным и создали два его потомка. Также я показал, как можно использовать переопределение метода для уточнения логики в классе FotoProduct. Также немного поговорили об использовании констант в Java.
Домашним заданием к этому занятию будет сделать все то, о чем мы говорили, а именно:
Написать классы FotoProduct и BotinkiProduct
Написать методы для расчета скидки
Написать метод для расчета стоимости продукта с учетом скидки
Добавить поля в классы Product и Party
Также, заданием является сделать программу рабочей после вышеуказанных изменений, а именно:
Добавить ввод отдельных продуктов
Добавить ввод информации о Party
Добавить вывод информации о Party
В качестве дополнительного задания можно сделать следующее:
Добавить вывод полей отдельных продуктов
Усовершенствовать ввод и вывод, чтобы был более приятным для глаз :)
Обновление: Я в очередной раз написал возможное решение этой задачи. Скачать исходные файлы можно тут: JavaPractice04.zip (4,8 KB). Запуск программы описан в предыдущем посте.
На третьем занятии мы уже подошли к объектам и проектированию. Я рассмотрел создание программы с позиции объектно-ориентированного дизайна. Бегло прошелся по теме третьего урока из курса Java для тестировщиков, чтобы вспомнить, что такое объект и как с ним работать. Далее мы решали задачу, немного похожую на реальный пример: выделяли объекты, рисовали диаграммы и реализовывали методы.
На этом занятии я также впервые упомянул про одну из очень полезных книг, а именно книгу по шаблонам проектирования: Приемы объектно-ориентированного проектирования. Паттерны проектирования ("Банда четырёх": Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидс). Я считаю, что каждый программист просто обязан изучить эту книгу и по возможности использовать шаблоны в своих программах. Конечно, это не легко будет делать сразу - понимание, где и какой шаблон лучше применять, приходит с опытом. Также, не расстраивайтесь, если Вы сразу не поймете эту книгу. Продолжайте изучать программирование и больше практикуйтесь писать программы - со временем Вы поймете, насколько мощный инструмент у Вас в руках. Однако, есть небольшое предостережение по поводу шаблонов проектирования: фокусируйтесь на простых решениях проблем, прежде чем сразу браться за применение сложных "рецептов" шаблонов. Так что не забывайте: Keep It Simple :)
Задачу, которую мы решали на занятии следующая:
Необходимо реализовать программу, которая будет позволять вводить сделки купли-продажи товаров между двумя участниками. В каждой сделке может быть несколько товаров, сумма сделки рассчитывается из суммы всех товаров. Сумма каждого товара рассчитывается из его стоимости и количества. Программа должна позволить ввести информацию о сделках, сохранить ее в памяти и вывести на экран. Ввод информацию осуществляется с экрана (консоли). Количество дополнительной информацию о сделке, участнике, товаре придумать самому (больше одного поля для класса).
Форматы данных для хранения информации, которые я предложил, конечно же, не самые оптимальные. Например, использование массивов вместо коллекций, а также использование double для представления денег. Но это не главное для данного примера. Также, вводить информацию с консоли - это долго и нудно, но это тоже не главное. Я не хотел углубляться в способы представления определенной информации, в способы работы с файлами или базой данных - это все темы следующих занятий. Цель этого занятия - это научится выделять объекты, строить между ними связи и попрактиковаться программировать несложную логику. Поэтому ввод с консоли тут идеально подходит, ведь надо будет подумать, как последовательно все ввести, да еще чтобы это было красиво :)
На видео я вспоминаю про метод keyboard, который позволяет вводить данные с консоли, и который я обещал выслать слушателям. Итак, вот он:
Я также написал возможное решение этой задачи, если вдруг кому-то будет очень сложно. Скачать исходные файлы можно тут: JavaPractice03.zip (3,4 KB) Чтобы откомпилировать и запустить этот пример, выполните следующие команды:
cd <каталог_куда_распаковали_архив> cd src javac *.java java Program
Также, если Вы уже умеете работать со средой разработки Eclipse, то можете импортировать этот проект в нее и запустить.
В качестве дополнительного задания, можно написать отдельные класс Keyboard, который будет содержать статические методы для ввода строки (String), целого числа (Integer) и дробного числа (Double). Методы по вводу чисел будет проверять, а число ли введено вообще, и выдавать сообщение об ошибке или требовать правильный ввод.
Второе занятие из курса Java Практика я посвятил такому важному для каждого программиста явлению, как выделение части кода в отдельные подпрограммы (функции) с целью их многократного использования и устранения дублирования кода. Само собой разумеется, что эти две причины - далеко не единственные, ради которых используют функции. Однако, наверное, они основные, если не вдаваться в сложные механизмы взаимодействия объектов в Java программе. Дополнительно, я остановился на способах передачи данных в функции. Конечно, пришлось немного забегать наперед, рассказывая про объекты в Java, ведь функции не могут существовать сами по себе (даже статические функции принадлежат классу), но много на объектах я не останавливался. Все-таки, основное, что надо вынести из этого урока - это то, что в программе необходимо выделять логически связанные блоки в отдельные подпрограммы, чтобы повторно их использовать, устранить дублирование кода и сделать программу более понятной и обозримой.
Перед просмотром этого занятия можно посмотреть Урок 4 из курса Java для тестировщиков, где я как раз рассказываю про объявление функций (методов класса), аргументы функций и возврат значений из них. Там, конечно, еще и много чего другого, так что Урок 3 тоже посмотрите, если не совсем понятно, что такое объекты и "с чем их едят".
Из, собственно, практики в этом занятии я немного остановился на заданиях из первого занятия. Также мы рассмотрели, что можно вынести в отдельные подпрограммы в алгоритмах сортировки массива. А также рассмотрели алгоритм бинарного поиска в массиве, реализация которого и есть следующим заданием.
Итак, задания для самостоятельной работы:
реализовать еще один алгоритм сортировки массива (отличный от того, что был реализован для предыдущего занятия)
реализовать алгоритм бинарного поиска элемента в отсортированном массиве.
Ну и собственно видео второго занятия, которое, кстати, было записано в FullHD :)
И вот я снова вернулся к преподаванию Java.
В очередной раз в компании, где я работаю, возникла необходимость
рассказать о языке программирования Java некоторым нашим сотрудникам.
Чтобы не повторятся и снова не рассказывать то, что и так уже известно и
доступно на youtube, мы решили в этом новом курсе сделать упор на
практическое применение Java.
Так как предыдущий курс Java для тестировщиков был в основном
теоретическим и ознакомительным, то в этот раз занятия будут проходить
следующим образом. Слушатели сначала самостоятельно смотрят уроки на youtube (не все сразу, а по одной или две), потом на занятии я некоторое
время резюмирую теоретический материал, на чем-то, возможно,
останавливаюсь подробнее или что-то добавляю, отвечаю на вопросы. Далее,
я разбираю какую-нибудь практическую задачку, решение которой
основывается на полученных теоретических знаниях. Ну и в конце я задаю
небольшое задание для самостоятельной работы.
Как и в прошлый раз, видео я буду записывать и выкладывать на youtube,
объединяя их в отдельный плейлист. Надеюсь, что наличие практической
составляющей поможет многим быстрее и лучше разобраться с Java, тем
более, что многие просили о различных задачах в многочисленных
комментариях.
Итак, первое занятие из курса Java практика можно посмотреть ниже. Перед
просмотром этого видео, рекомендуется ознакомиться с уроком 1 и уроком 2
из курса Java для тестировщиков. Обратите также внимание на комментарии ко второму уроку, где многие поправляли ошибки, которые я допускал.
Вообще, некоторые комментарии очень даже хорошие и полезные, особенно от
пользователя hazartilirot .
Задания для самостоятельной работы после первого занятия: