-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit d11a196
Showing
29 changed files
with
2,128 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
# Домашние задания по курсу «Основы Java» | ||
|
||
### [Словарь терминов Java](./java_glossary.md/) | ||
|
||
### Блок 3. Основы ООП | ||
|
||
3.1 Модификаторы доступа, наследование (квиз) | ||
|
||
[3.2 Полиморфизм](polymorphism) | ||
|
||
[3.3 Абстракции и интерфейсы](abstractions-interfaces) | ||
|
||
[3.4 Исключения, Stacktrace](exceptions) | ||
|
||
|
||
### Блок 4. InMemory хранение данных — коллекции | ||
|
||
4.1 Generics в коллекциях и методах (квиз) | ||
|
||
[4.2 Коллекции List](list) | ||
|
||
[4.3 Коллекции Queue](queue) | ||
|
||
[4.4 Коллекция HashMap и HashSet](hash-collections) | ||
|
||
[4.5 Коллекции Treemap и TreeSet](tree-collections) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
## Задача 1. Библиотека | ||
|
||
### Описание | ||
Необходимо разработать иерархию работников библиотеки. Нужно реализовать совмещение нескольких ролей в библиотеке в одном исполнителе через интерфейсы. Каждый объект в программе имеет определенный набор действий. | ||
|
||
Часто программист, создающий объект, не представляет все ситуации, в которых тот будет использоваться. | ||
Также программисту, использующему объект, часто неизвестны все его детали. | ||
|
||
Для передачи информации о том, что должен уметь объект, используются интерфейсы. | ||
|
||
Примером интерфейсов в нашей библиотеке может служить понятие роли на проекте. | ||
Каждая роль подразумевает набор определенных операций, которые должен "уметь" объект пользователь — User в программе. | ||
|
||
### Функционал программы | ||
1. Создайте иерархию "Пользователи библиотеки" со следующими интерфейсами: | ||
- Читатель – берет и возвращает книги. | ||
- Библиотекарь – заказывает книги. | ||
- Поставщик книг – приносит книги в библиотеку. | ||
- Администратор – находит и выдает книги и уведомляет о просрочках времени возврата. | ||
2. В методе `public static void main` создайте 2-3 объекта, реализующих эти интерфейсы. | ||
|
||
### Дополнительная информация | ||
Учтите, что интерфейсов у пользователя (`User`) может быть несколько. | ||
Объекты класса User могут взаимодействовать друг с другом (например, библиотекарь заказывает у поставщика). | ||
|
||
### Пример реализации | ||
1. Создайте 4 интерфейса: `Reader`, `Librarian`, `Supplier`, `Administrator`. | ||
Каждый из них должен содержать описанные выше методы. Например, у администратора должен быть метод `overdueNotification(Reader reader)`. | ||
Методы могут принимать в качестве параметра других user-ов. Например, читатель берет книги у администратора, библиотекарь заказывает у поставщика и т.д. | ||
|
||
2. Создайте несколько классов, демонстрирующих использование интерфейсов. | ||
В частности, продемонстрируйте совмещение, например, поставщик, который может быть также и читателем, библиотекарь – администратором и т.д. | ||
В качестве реализации методов можно сделать вывод подробного сообщения в консоль по типу "Библиотекарь Вася заказал у поставщика Петя книгу Игра Престолов". |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
## Задача 2. Банковские счета | ||
|
||
### Описание | ||
Часто в проектировании программ нам удобно опираться на понятия, которые не представлены в реальном мире, | ||
но служат удобной "опорой" для объединения нескольких классов. | ||
|
||
Так, например, в банковском деле нет абстрактного понятия "Счет". Каждый счет в банке имеет четкое назначение: сберегательный, кредитный, расчетный. | ||
Но банковская программа работает с общими для счетов операциями как с одинаковыми объектами, и выполняет их, обращаясь к общему типу "Счет", | ||
хотя его и невозможно явно инстанцировать в программе. Реализуйте этот сценарий, опираясь на механизмы полиморфизма. | ||
|
||
### Функционал программы | ||
1. Создайте несколько классов — различных счетов на основе общего интерфейса: | ||
- Сберегательный счет (`SavingsAccount`) | ||
- Кредитный счет (`CreditAccount`) | ||
- Расчетный счет (`CheckingAccount`) | ||
2. Выполните перевод с одного счета на другой в методе `public static void main`. | ||
|
||
### Пример реализации | ||
1. Создайте абстрактный класс `Account` с тремя методами: заплатить, перевести, пополнить (`pay(int amount)`, `transfer(Account account, int amount)`, `addMoney(int amount)`). | ||
Платеж в нашем случае будет выглядеть просто как списание средств. | ||
2. Добавьте классы Сберегательный, Кредитный, Расчетный (`SavingsAccount`, `CreditAccount`, `CheckingAccount` соответственно) как потомков класса Счет. | ||
В них нужно переопределить методы базового класса. Каждый из них должен хранить баланс. Со сберегательного счета нельзя платить, только переводить и пополнять. Также сберегательный не может уходить в минус. | ||
Кредитный не может иметь положительный баланс – если платить с него, то уходит в минус, чтобы вернуть в 0, надо пополнить его. | ||
Расчетный может выполнять все три операции, но не может уходить в минус. | ||
3. Продемонстрируйте работу счетов. Создайте три переменные типа `Account` и присвойте им три разных типа счетов. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
Домашнее задание к занятию 3.3. Основы ООП - абстракции и интерфейсы | ||
== | ||
|
||
1. [Библиотека](3.3.1); | ||
|
||
Дополнительная задача со * : | ||
|
||
2. [Банковские счета](3.3.2); | ||
|
||
======= | ||
|
||
Задачи со звездочкой `*` необязательны для получения зачета. | ||
Если вы хотите прислать дополнительное задание позже, напишите об этом при сдаче домашнего задания в личном кабинете на сайте [netology.ru](https://netology.ru). | ||
|
||
Любые вопросы по решению задач задавайте в чате учебной группы (ссылку вы найдете в письме на вашей эл. почте). | ||
|
||
## Инструкция по выполнению домашнего задания | ||
|
||
1. Пишите код в IDE (рекомендуем [Intellij Idea](https://www.jetbrains.com/idea/download/), версия Community). | ||
1. Почему лучше работать в IDE? — Ускоряет работу, есть подсветка ошибок, отладка по шагам. | ||
1. Почему Intellij Idea? — Родитель Android Studio, бесплатная, умная. | ||
2. Опирайтесь на принятый [стиль оформления кода](https://github.com/netology-code/codestyle/blob/master/java/README.md). | ||
3. Готовый код сдаем в Repl.it. Для этого зарегистрируйтесь на сайте [Repl.IT](http://repl.it/). | ||
4. Перейдите в раздел **my repls**. | ||
5. Нажмите кнопку **Start coding now!**, если приступаете впервые, или **New Repl**, если у вас уже есть работы. | ||
6. В списке языков выберите `Java`. | ||
7. Убедитесь, что на сайте всё работает так же, как и у вас на компьютере, нажав на кнопку **Run**. Результат появится в правой части окна. | ||
8. После окончания работы скопируйте ссылку на ваш repl в адресной строке браузера. | ||
9. В личном кабинете на сайте [netology.ru](http://netology.ru/) в поле комментария к домашней работе вставьте скопированную ссылку и отправьте работу на проверку. | ||
|
||
*Никаких файлов прикреплять не нужно.* |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
## Задача 1. Проверка доступа к ресурсу | ||
|
||
### Описание | ||
В этом задании мы напишем программу для проверки доступа к ресурсу. Во время запуска программы нужно запросить логин или пароль пользователя. Если один из введеных параметров не совпадает (логин/пароль), то нужно выбросить checked исключение UserNotFoundException. Если возраст пользователя менее 18 лет, то нужно выбросить исключение AccessDeniedException, а если 18 и больше лет - вывести сообщение "Доступ предоставлен". <br> | ||
<br> | ||
Массив пользователей для авторизации нужно описать до запуска программы. Каждая запись пользователя содержит поля: login, password, age (возраст) и email. | ||
|
||
### Функционал программы | ||
1. Создание Scanner для чтения логина и пароля пользователя из консоли; | ||
2. Создание checked исключения UserNotFoundException; | ||
3. Создание checked исключения AccessDeniedException; | ||
4. Выбрасывать ошибку UserNotFoundException, если логин или пароль введены не верно; | ||
5. Выбрасывать ошибку AccessDeniedException, если возраст пользователя меньше 18 лет; | ||
5. Если ошибок не возникло, вывести сообщение "Доступ предоставлен". | ||
|
||
### Процесс реализации | ||
1. Создадим класс User, в котором будем хранить инфомрацию о логине, пароле и возрасте пользователя: | ||
class User, login, password, email, age; | ||
2. Создадим класс исключение UserNotFoundException на основе базового класса Exception. Это исключение будем использовать, если пользователь ввел неверный логин или пароль: | ||
```java | ||
public class UserNotFoundException extends Exception { | ||
public UserNotFoundException(String message) { | ||
super(message); | ||
} | ||
} | ||
``` | ||
3. Аналогичным образом создадим класс исключения AccessDeniedException | ||
4. Создадим класс Main, в котором создадим метод getUsers, этот метод должен возвращать список заранее созданных пользователей: | ||
```java | ||
public static User[] getUsers() { | ||
User user1 = new User("jhon", "[email protected]", "pass", 24); | ||
... | ||
return new User[]{user1, ...}; | ||
} | ||
``` | ||
5. Создадим в классе Main метод getUserByLoginAndPassword(String login, String password), в этом методе нужно найти соответствие пары логина и пароля пользователя из массива, возвращаемого методом getUsers. Если пользователь не найден, выбрасываем исключение UserNotFoundException, если найден - возвращаем найденного пользователя: | ||
```java | ||
public static User getUserByLoginAndPassword(String login, String password) throws UserNotFoundException { | ||
User[] users = getUsers(); | ||
for (User user : users) { | ||
... | ||
} | ||
throw new UserNotFoundException("User not found"); | ||
} | ||
``` | ||
6. Создадим к классу Main еще один метод validateUser для проверки возрастра пользователя. Если возраст менее 18 лет, метод должен выбросить исключение AccessDeniedException: | ||
```java | ||
public static void validateUser(User user) throws AccessDeniedException | ||
``` | ||
7. Добавим последний метод в классе Main для запуска программы public static void main(String[] args) throws UserNotFoundException, AccessDeniedException | ||
В нем нужно запросить логин и пароль пользователя, проверить есть ли данная пара "логин и пароль" в массиве пользователей и последним шагом провалидировать возраст. | ||
```java | ||
public static void main(String[] args) throws UserNotFoundException, AccessDeniedException { | ||
|
||
Scanner scanner = new Scanner(System.in); | ||
|
||
System.out.println("Введите логин"); | ||
String login = scanner.nextLine(); | ||
System.out.println("Введите пароль"); | ||
String password = scanner.nextLine(); | ||
|
||
//Проверить логин и пароль | ||
|
||
//Вызвать методы валидации пользователя | ||
|
||
System.out.println("Доступ предоставлен"); | ||
} | ||
|
||
``` | ||
8. Программа завершена. Отличная работа! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
## Задача 2. Валидация прочитанных событий | ||
|
||
### Описание | ||
Для выполнения задачи со звездочкой мы напишем программу проверки коррекности прочитанных значений. Для этого подготовим список событий - такими событиями (event) могут быть фильмы/спектакли. <br> | ||
<br> | ||
Базовый класс event содержит поля: название (title), год выпуска (releaseYear), ограничение по возрасту (age).<br> | ||
<br> | ||
Если любое из полей прочитанного объекта равно null или 0 (для целочисленных полей), нужно выбсроить RuntimeException и завершить работу программы, если ошибок не возникло - вывести сообщение "Все события корректны". <br> | ||
<br> | ||
### Функционал программы | ||
1. Создание заранее подготовленного списока событий - отдельно для кино и отдельно для театров; | ||
2. Возможность валидации каждолго из списка событий с помощью универсального метода; | ||
3. Если хотя бы одно из событий содержит поля со значением null или 0, завершить работу программы и вывести это событие; | ||
4. Если ошибок не возникло, вывести сообщение "Все события корректны". | ||
|
||
### Процесс реализации | ||
1. Создадим класс Event для описания базового события с полями title, releaseYear и age (класс можно сделать абстрактным); | ||
2. Переопределим метод toString для класса Event, чтобы вывести значения всех полей; | ||
3. Создадим два дочерних класса от класса Event - Movie и Theatre; | ||
4. Создадим класс Main в котором нужно создать два метода для получения массива Movies, Theatres: | ||
```java | ||
public static Movie[] getMovies() { | ||
return new Movie[]{ | ||
new Movie("Начало", 2010, 16), | ||
... | ||
}; | ||
} | ||
|
||
public static Theatre[] getTheatres() { | ||
return new Theatre[]{ | ||
new Theatre("Анна Каренина", 2017, 16), | ||
... | ||
}; | ||
} | ||
``` | ||
5. Добавим в класс Main метод для валидации событий (Event) | ||
```java | ||
public static void validEvent(Event event) | ||
``` | ||
Если хоть одно из полей не заполнено, нужно выбросить исключение throw new RuntimeException, обрабатывать | ||
или перехватывать эту ошибку нигде не нужно. | ||
|
||
6. Добавим в класс Main метод main для запуска и валидации созданных событий: | ||
```java | ||
public static void main(String[] args) { | ||
for (Event event: getMovies()) { | ||
validEvent(event); | ||
} | ||
for (Event event: getTheatres()) { | ||
validEvent(event); | ||
} | ||
System.out.println("Все события корректны"); | ||
} | ||
``` | ||
7. Завершим работу программы. Прекрасно! |
Oops, something went wrong.