Завдання: Реалізація Сервісу TaskManager
Практика
Час попрактикуватися. Ваше завдання — написати сервіс TaskManager, який відстежуватиме ваші завдання.
За допомогою цього сервісу користувач може додавати завдання, призначати їх собі, а потім виконувати їх у послідовному порядку.
Розпочнемо роботу над цим завданням разом, а далі ви продовжите самостійно.
Але спочатку потрібно створити модель завдання. Створимо клас Task:
Main.java
12345public class Task { private int id; private String name; private String description; }
Клас Task містить три атрибути: id, name та description. Кожне завдання повинно мати name та description, а id є необхідним атрибутом для будь-якої структури даних.
Як інакше можна було б отримати доступ до елементів?
Атрибути також захищені модифікатором доступу private, оскільки не бажано, щоб інші класи мали прямий доступ до полів цього класу, окрім як через конструктор або геттери.
Тепер реалізуємо ці геттери та конструктор. Це можна легко зробити за допомогою комбінації клавіш Control + Return на MacBook або Alt + Ins на Windows.
Після виконаних операцій ви маєте наступний клас Task:
Task.java
12345678910111213141516171819202122232425262728293031323334package codefinity.taskManager; public class Task { private int id; private String name; private String description; public Task(int id, String name, String description) { this.id = id; this.name = name; this.description = description; } public int getId() { return id; } public String getName() { return name; } public String getDescription() { return description; } @Override public String toString() { return "Task{" + "id=" + id + ", name='" + name + '\'' + ", description='" + description + '\'' + '}'; } }
Сервіси
Вам буде запропоновано дуже спрощений сервіс дошки завдань, тому реалізуємо сервіс, який дозволяє додавати завдання, позначати їх як виконані та перевіряти наявність завдань у черзі.
Назвемо цей клас TaskQueueService.
Спочатку потрібно визначити інтерфейс з цими завданнями:
TaskQueueService.java
123456789package codefinity.taskManager; public interface TaskQueueService { void addTask(Task task); Task getNextTask(); boolean isEmpty(); }
Цей інтерфейс визначає 3 методи, які класи-реалізації повинні реалізувати. До цих методів належать додавання завдання, перехід до наступного завдання (мається на увазі, що користувач вже виконав попереднє завдання), а також метод для перевірки наявності завдань у черзі.
Чудово, тепер створимо клас-реалізацію, який перевизначить і реалізує всі ці методи:
TaskQueueServiceImpl.java
12345678910package codefinity.taskManager.taskManagerImpl; import codefinity.taskManager.Task; import java.util.LinkedList; import java.util.Queue; public class TaskQueueServiceImpl { private Queue<Task> taskQueue = new LinkedList<>(); }
Ми створюємо приватний атрибут, який буде використовуватися лише всередині цього сервісного класу.
Варто зробити невеликий відступ, щоб поговорити про сервісні класи, які відіграють ключову роль в ООП.
Що таке сервісні класи?
Сервісні класи призначені для виконання конкретних операцій. Вони наслідують сервісні інтерфейси та реалізують їхні методи. Такий підхід підвищує зручність підтримки та масштабованість коду, а також відповідає принципам SOLID, з якими ви ознайомитеся в окремому курсі.
Поки що важливо розуміти, що сервісні класи існують виключно для виконання операцій над іншими об'єктами.
Наприклад, Якщо ви створюєте калькулятор, у вас буде окремий клас, який зберігатиме значення числа, з яким ви працюєте. Безпосередньо операції виконуватимуться за допомогою сервісного класу, де визначені додавання, віднімання тощо.
Сподіваюся, це прояснює призначення сервісних класів для вирішення поточного завдання.
Реалізація сервісу
Наш наступний крок — явно показати, що цей клас реалізує інтерфейс TaskQueueService.
Для цього використовується ключове слово implements після імені інтерфейсу. Це гарантує, що наш клас успадковує поведінку, визначену інтерфейсом.
Оскільки інтерфейси містять лише оголошення методів, необхідно перевизначити та реалізувати ці методи у нашому класі.
Тепер у нашому класі показані всі методи, які потрібно перевизначити. Давайте зробимо це!
TaskQueueServiceImpl.java
1234567891011121314151617181920212223242526package codefinity.taskManager.taskManagerImpl; import codefinity.taskManager.Task; import codefinity.taskManager.TaskQueueService; import java.util.LinkedList; import java.util.Queue; public class TaskQueueServiceImpl implements TaskQueueService { private Queue<Task> taskQueue = new LinkedList<>(); @Override public void addTask(Task task) { taskQueue.offer(task); } @Override public Task getNextTask() { return taskQueue.poll(); } @Override public boolean isEmpty() { return taskQueue.isEmpty(); } }
У нашому випадку нічого надто складного не було зроблено. Ми просто використали методи класу Queue для коректної реалізації наших методів. Таким чином, структура даних, така як черга, спрощує життя всім програмістам Java.
Ми використовуємо метод offer() для додавання, метод poll() для видалення та метод isEmpty() для перевірки, чи черга порожня.
Тепер ваша черга взяти участь у розв'язанні цієї задачі. Вам потрібно буде реалізувати сервісний клас, інтерфейс якого ми створимо разом:
Main.java
12345package codefinity.taskManager; public interface TaskProcessorService { void processTasks(); }
Ми створили інтерфейс сервісу з одним методом: processTasks(), який при виклику має запускати виконання всіх завдань, доки список завдань не стане порожнім. Цей метод представляє користувача, який починає виконувати завдання.
Завдання
Ваше завдання — написати клас TaskProcessorServiceImpl, який має реалізовувати інтерфейс TaskProcessorService. Цей клас повинен містити метод для обробки всіх завдань, тобто використовувати методи сервісу TaskQueueService. Ви можете використати композицію, створивши екземпляр цього класу всередині того класу, який потрібно реалізувати, наприклад:
Main.java
1234567package codefinity.taskManager.taskManagerImpl; import codefinity.taskManager.TaskQueueService; public class TaskProcessorServiceImpl { TaskQueueService taskQueueService = new TaskQueueServiceImpl(); }
Загалом, у верхній частині вже підготовлена композиція для вашого завдання. Далі потрібно лише реалізувати один метод з використанням екземпляра цього класу.
Після цього необхідно створити конструктор, який ініціалізує цей об'єкт класу taskQueueService.
Таким чином, ви зможете використовувати методи цього об'єкта. Також очевидно, що для обробки завдань потрібно передати чергу, з якою працюватиме taskProcessor.
Решта завдання залишається за вами. Підказки будуть у файлі README.md. Коли рішення буде готове, натисніть кнопку "Run Tests", і написані мною модульні тести перевірять ваше рішення.
- Спочатку використайте композицію та створіть екземпляр класу
TaskQueue. Далі додайте його ініціалізацію у конструкторі. - Далі реалізуйте інтерфейс
TaskProcessorImplта перевизначте його методи. - У реалізації інтерфейсу використовуйте цикл while з методом
isEmpty()як умовою. - Усередині циклу
whileвикористовуйте методtaskQueueService.getNextTask(), вказуючи, що завдання виконано. Виводьте інформацію на екран за допомогоюSystem.out.println()-"Processing Task: " + task. - Коли цикл завершить роботу, виведіть на екран
"All tasks processed.". - Запустіть тести та перевірте коректність вашого рішення.
package codefinity.taskManager.taskManagerImpl;
import codefinity.taskManager.Task;
import codefinity.taskManager.TaskProcessorService;
import codefinity.taskManager.TaskQueueService;
public class TaskProcessorServiceImpl implements TaskProcessorService {
private final TaskQueueService taskQueueImpl;
public TaskProcessorServiceImpl(TaskQueueService taskQueueImpl) {
this.taskQueueImpl = taskQueueImpl;
}
@Override
public void processTasks() {
while (!taskQueueImpl.isEmpty()) {
Task task = taskQueueImpl.getNextTask();
System.out.println("Processing Task: " + task + ";");
}
System.out.println("All tasks processed successfully.");
}
}
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Чудово!
Completion показник покращився до 4
Завдання: Реалізація Сервісу TaskManager
Свайпніть щоб показати меню
Практика
Час попрактикуватися. Ваше завдання — написати сервіс TaskManager, який відстежуватиме ваші завдання.
За допомогою цього сервісу користувач може додавати завдання, призначати їх собі, а потім виконувати їх у послідовному порядку.
Розпочнемо роботу над цим завданням разом, а далі ви продовжите самостійно.
Але спочатку потрібно створити модель завдання. Створимо клас Task:
Main.java
12345public class Task { private int id; private String name; private String description; }
Клас Task містить три атрибути: id, name та description. Кожне завдання повинно мати name та description, а id є необхідним атрибутом для будь-якої структури даних.
Як інакше можна було б отримати доступ до елементів?
Атрибути також захищені модифікатором доступу private, оскільки не бажано, щоб інші класи мали прямий доступ до полів цього класу, окрім як через конструктор або геттери.
Тепер реалізуємо ці геттери та конструктор. Це можна легко зробити за допомогою комбінації клавіш Control + Return на MacBook або Alt + Ins на Windows.
Після виконаних операцій ви маєте наступний клас Task:
Task.java
12345678910111213141516171819202122232425262728293031323334package codefinity.taskManager; public class Task { private int id; private String name; private String description; public Task(int id, String name, String description) { this.id = id; this.name = name; this.description = description; } public int getId() { return id; } public String getName() { return name; } public String getDescription() { return description; } @Override public String toString() { return "Task{" + "id=" + id + ", name='" + name + '\'' + ", description='" + description + '\'' + '}'; } }
Сервіси
Вам буде запропоновано дуже спрощений сервіс дошки завдань, тому реалізуємо сервіс, який дозволяє додавати завдання, позначати їх як виконані та перевіряти наявність завдань у черзі.
Назвемо цей клас TaskQueueService.
Спочатку потрібно визначити інтерфейс з цими завданнями:
TaskQueueService.java
123456789package codefinity.taskManager; public interface TaskQueueService { void addTask(Task task); Task getNextTask(); boolean isEmpty(); }
Цей інтерфейс визначає 3 методи, які класи-реалізації повинні реалізувати. До цих методів належать додавання завдання, перехід до наступного завдання (мається на увазі, що користувач вже виконав попереднє завдання), а також метод для перевірки наявності завдань у черзі.
Чудово, тепер створимо клас-реалізацію, який перевизначить і реалізує всі ці методи:
TaskQueueServiceImpl.java
12345678910package codefinity.taskManager.taskManagerImpl; import codefinity.taskManager.Task; import java.util.LinkedList; import java.util.Queue; public class TaskQueueServiceImpl { private Queue<Task> taskQueue = new LinkedList<>(); }
Ми створюємо приватний атрибут, який буде використовуватися лише всередині цього сервісного класу.
Варто зробити невеликий відступ, щоб поговорити про сервісні класи, які відіграють ключову роль в ООП.
Що таке сервісні класи?
Сервісні класи призначені для виконання конкретних операцій. Вони наслідують сервісні інтерфейси та реалізують їхні методи. Такий підхід підвищує зручність підтримки та масштабованість коду, а також відповідає принципам SOLID, з якими ви ознайомитеся в окремому курсі.
Поки що важливо розуміти, що сервісні класи існують виключно для виконання операцій над іншими об'єктами.
Наприклад, Якщо ви створюєте калькулятор, у вас буде окремий клас, який зберігатиме значення числа, з яким ви працюєте. Безпосередньо операції виконуватимуться за допомогою сервісного класу, де визначені додавання, віднімання тощо.
Сподіваюся, це прояснює призначення сервісних класів для вирішення поточного завдання.
Реалізація сервісу
Наш наступний крок — явно показати, що цей клас реалізує інтерфейс TaskQueueService.
Для цього використовується ключове слово implements після імені інтерфейсу. Це гарантує, що наш клас успадковує поведінку, визначену інтерфейсом.
Оскільки інтерфейси містять лише оголошення методів, необхідно перевизначити та реалізувати ці методи у нашому класі.
Тепер у нашому класі показані всі методи, які потрібно перевизначити. Давайте зробимо це!
TaskQueueServiceImpl.java
1234567891011121314151617181920212223242526package codefinity.taskManager.taskManagerImpl; import codefinity.taskManager.Task; import codefinity.taskManager.TaskQueueService; import java.util.LinkedList; import java.util.Queue; public class TaskQueueServiceImpl implements TaskQueueService { private Queue<Task> taskQueue = new LinkedList<>(); @Override public void addTask(Task task) { taskQueue.offer(task); } @Override public Task getNextTask() { return taskQueue.poll(); } @Override public boolean isEmpty() { return taskQueue.isEmpty(); } }
У нашому випадку нічого надто складного не було зроблено. Ми просто використали методи класу Queue для коректної реалізації наших методів. Таким чином, структура даних, така як черга, спрощує життя всім програмістам Java.
Ми використовуємо метод offer() для додавання, метод poll() для видалення та метод isEmpty() для перевірки, чи черга порожня.
Тепер ваша черга взяти участь у розв'язанні цієї задачі. Вам потрібно буде реалізувати сервісний клас, інтерфейс якого ми створимо разом:
Main.java
12345package codefinity.taskManager; public interface TaskProcessorService { void processTasks(); }
Ми створили інтерфейс сервісу з одним методом: processTasks(), який при виклику має запускати виконання всіх завдань, доки список завдань не стане порожнім. Цей метод представляє користувача, який починає виконувати завдання.
Завдання
Ваше завдання — написати клас TaskProcessorServiceImpl, який має реалізовувати інтерфейс TaskProcessorService. Цей клас повинен містити метод для обробки всіх завдань, тобто використовувати методи сервісу TaskQueueService. Ви можете використати композицію, створивши екземпляр цього класу всередині того класу, який потрібно реалізувати, наприклад:
Main.java
1234567package codefinity.taskManager.taskManagerImpl; import codefinity.taskManager.TaskQueueService; public class TaskProcessorServiceImpl { TaskQueueService taskQueueService = new TaskQueueServiceImpl(); }
Загалом, у верхній частині вже підготовлена композиція для вашого завдання. Далі потрібно лише реалізувати один метод з використанням екземпляра цього класу.
Після цього необхідно створити конструктор, який ініціалізує цей об'єкт класу taskQueueService.
Таким чином, ви зможете використовувати методи цього об'єкта. Також очевидно, що для обробки завдань потрібно передати чергу, з якою працюватиме taskProcessor.
Решта завдання залишається за вами. Підказки будуть у файлі README.md. Коли рішення буде готове, натисніть кнопку "Run Tests", і написані мною модульні тести перевірять ваше рішення.
- Спочатку використайте композицію та створіть екземпляр класу
TaskQueue. Далі додайте його ініціалізацію у конструкторі. - Далі реалізуйте інтерфейс
TaskProcessorImplта перевизначте його методи. - У реалізації інтерфейсу використовуйте цикл while з методом
isEmpty()як умовою. - Усередині циклу
whileвикористовуйте методtaskQueueService.getNextTask(), вказуючи, що завдання виконано. Виводьте інформацію на екран за допомогоюSystem.out.println()-"Processing Task: " + task. - Коли цикл завершить роботу, виведіть на екран
"All tasks processed.". - Запустіть тести та перевірте коректність вашого рішення.
package codefinity.taskManager.taskManagerImpl;
import codefinity.taskManager.Task;
import codefinity.taskManager.TaskProcessorService;
import codefinity.taskManager.TaskQueueService;
public class TaskProcessorServiceImpl implements TaskProcessorService {
private final TaskQueueService taskQueueImpl;
public TaskProcessorServiceImpl(TaskQueueService taskQueueImpl) {
this.taskQueueImpl = taskQueueImpl;
}
@Override
public void processTasks() {
while (!taskQueueImpl.isEmpty()) {
Task task = taskQueueImpl.getNextTask();
System.out.println("Processing Task: " + task + ";");
}
System.out.println("All tasks processed successfully.");
}
}
Дякуємо за ваш відгук!