18 Commits
Author SHA1 Message Date
KamaSK 276b4caa5e Merge pull request 'feature/tasks/enum-status-and-idgen' (#19) from feature/tasks/enum-status-and-idgen into main
Reviewed-on: #19
2025-05-20 20:52:25 +03:00
KamaSK a257a76f37 Реализован генератор идентификаторов задач с использованием перечисления TaskIdGenerator для упрощения управления уникальными идентификаторами. Удалена статическая переменная nextId. Closes #5 2025-05-20 20:51:52 +03:00
KamaSK 2db26eb77a Изменён тип поля completed на status в классе Task для использования перечисления TaskStatus. Добавлены методы для изменения статуса задачи: markCompleted, markInProgress и markCanceled. Обновлён класс TaskPrinter для отображения статуса задачи. Изменены методы в классе TodoApp для работы с новым статусом задач. Улучшена читаемость кода и логика управления задачами. 2025-05-20 20:17:46 +03:00
KamaSK 1932cdb297 Добавлено перечисление TaskStatus для управления статусами задач и улучшения читаемости кода. 2025-05-20 12:26:48 +03:00
KamaSK 5652c8246b Merge pull request 'Исправлена опечатка в запросе описания задачи.' (#18) from fix/spelling-create-task into main
Reviewed-on: #18
2025-05-19 21:54:09 +03:00
KamaSK c0ee62a58e Исправлена опечатка в запросе описания задачи. 2025-05-19 21:53:35 +03:00
KamaSK 2104fcdb50 Merge pull request 'feature/tasks/nested-classes' (#17) from feature/tasks/nested-classes into main
Reviewed-on: #17
2025-05-19 21:10:51 +03:00
KamaSK 8fadb464b1 Merge branch 'feature/tasks/nested-classes' of git.kamask.ru:KamaSK/todo.pet into feature/tasks/nested-classes 2025-05-19 21:09:42 +03:00
KamaSK 27be75bade Добавлен интерфейс TaskAction в класс TodoApp для определения действия над задачами. Закомментированы примеры использования интерфейса и тестовой задачи, что упрощает структуру кода и улучшает читаемость. Closes #4 2025-05-19 21:09:01 +03:00
KamaSK e0275f14e6 Добавлен интерфейс TaskAction в класс TodoApp для определения действия над задачами. Закомментированы примеры использования интерфейса и тестовой задачи, что упрощает структуру кода и улучшает читаемость. 2025-05-19 21:08:30 +03:00
KamaSK 92bfdd9b95 Fiz 2025-05-19 19:46:38 +03:00
KamaSK 7dd64801b5 Merge branch 'feature/tasks/nested-classes' of git.kamask.ru:KamaSK/todo.pet into feature/tasks/nested-classes 2025-05-19 19:45:16 +03:00
KamaSK 7312f115ad Merge branch 'feature/tasks/nested-classes' of git.kamask.ru:KamaSK/todo.pet into feature/tasks/nested-classes 2025-05-19 19:44:41 +03:00
KamaSK 605b340082 Merge branch 'feature/tasks/nested-classes' of git.kamask.ru:KamaSK/todo.pet into feature/tasks/nested-classes 2025-05-19 19:42:27 +03:00
KamaSK 27ee8ca369 В классе TodoApp обновлён метод printTasks для отображения списка задач с их идентификаторами и названиями. Добавлен метод getTitle в класс Task для получения названия задачи. 2025-05-19 19:40:01 +03:00
KamaSK f4f5440d8d В классе TodoApp обновлён метод printTasks для отображения списка задач с их идентификаторами и названиями. Добавлен метод getTitle в класс Task для получения названия задачи. 2025-05-19 19:35:27 +03:00
KamaSK 780f1b1fed Добавлен новый статический класс TaskPrinter в Task для упрощения вывода информации о задачах. В классе TodoApp закомментированы примеры использования нового класса. 2025-05-19 18:51:55 +03:00
KamaSK 57ae7e6bcb Оптимизирована логика управления задачами в классе TodoApp. Добавлен класс TaskManager для обработки задач, что улучшает структуру кода. Обновлены методы для добавления задач и отображения информации о них. Исправлены ошибки в логике подсчета задач. Теперь используется tasksCounter вместо статического поля taskCount для отслеживания количества задач. Это улучшает читаемость и поддержку кода. 2025-05-19 17:17:26 +03:00
3 changed files with 237 additions and 112 deletions
+57 -45
View File
@@ -3,71 +3,83 @@ package ru.kamask.pet;
import java.time.LocalDate; import java.time.LocalDate;
class Task { class Task {
private static int nextId; static int taskCount = 0;
static int taskCount;
static { enum TaskIdGenerator {
taskCount = 0; INSTANCE;
nextId = 0;
private int currentId = 1;
int nextId() {
return currentId++;
}
} }
private int id; private int id;
private String title; private String title;
private String description; private String description;
private boolean completed = false; private TaskStatus status;
private LocalDate createdAt; private LocalDate createdAt;
Task(String title, String description) { Task(String title, String description) {
id = TaskIdGenerator.INSTANCE.nextId();
status = TaskStatus.NEW;
createdAt = LocalDate.now();
taskCount++;
this.title = title; this.title = title;
this.description = description; this.description = description;
}; };
{
id = ++nextId;
createdAt = LocalDate.now();
++taskCount;
}
static void printTotalTasksCreated() { static void printTotalTasksCreated() {
System.out.println("Колличество дел: " + taskCount); System.out.println("Колличество дел: " + taskCount);
} }
void printInfo() {
String stringCompleted = completed ? "[х]" : "[ ]";
System.out.printf("%-3d | %-20s | %s\n", id, title, stringCompleted);
}
void printInfo(boolean full) {
if (!full) {
printInfo();
return;
}
String template = """
──────────────────────────────
Номер: %-3d
Дата создания: %s
Статус: %s
Название: %-20s
------------------------------
%s
""";
;
String stringCompleted = completed ? "выполнено" : "не выполнено";
System.out.printf(template, id, createdAt, stringCompleted, title, description);
}
void toggleCompleted() {
completed = !completed;
}
int getId() { int getId() {
return id; return id;
} }
boolean getCompleted() { String getTitle() {
return completed; return title;
} }
boolean isCompleted() {
return status == TaskStatus.COMPLETED;
}
void markCompleted() {
status = TaskStatus.COMPLETED;
}
void markInProgress() {
status = TaskStatus.IN_PROGRESS;
}
void markCanceled() {
status = TaskStatus.CANCELLED;
}
TaskStatus getStatus() {
return status;
}
static class TaskPrinter {
static void print(Task task) {
String template = """
──────────────────────────────
Номер: %-3d
Дата создания: %s
Статус: %s
Название: %-20s
------------------------------
%s
""";
;
String stringCompleted = task.status.getColorCode() + task.status.getDescription() + "\u001B[0m";
System.out.printf(template, task.id, task.createdAt, stringCompleted, task.title, task.description);
}
}
} }
@@ -0,0 +1,41 @@
package ru.kamask.pet;
public enum TaskStatus {
NEW("новое") {
@Override
String getColorCode() {
return "\u001B[34m";
}
},
IN_PROGRESS("в работе") {
@Override
String getColorCode() {
return "\u001B[35m";
}
},
COMPLETED("сделано") {
@Override
String getColorCode() {
return "\u001B[32m";
}
},
CANCELLED("отменено") {
@Override
String getColorCode() {
return "\u001B[31m";
}
};
abstract String getColorCode();
private final String description;
TaskStatus(String description) {
this.description = description;
}
String getDescription() {
return description;
}
}
+139 -67
View File
@@ -4,50 +4,21 @@ import java.util.Scanner;
public class TodoApp { public class TodoApp {
private static TaskManager taskManager;
private static Task[] tasks = new Task[10]; private static Task[] tasks = new Task[10];
private static int tasksCounter = 0;
private static Scanner scanner = new Scanner(System.in); private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) { public static void main(String[] args) {
/* TodoApp app = new TodoApp();
* System.out.println("\n\nDeveloper mode:\n\n"); taskManager = app.new TaskManager();
*
* Task t1 = new Task("Дело тест - t1", ""); app.run();
* Task t2 = new Task("Дело тест - t2", "");
* Task t3 = new Task("Дело тест - t3", "");
* printAll(t1, t2, t3);
* System.out.println(markTaskCompletedById(new Task[] { t1, t2, t3 }, 2));
* printAll(t1, t2, t3);
*
* System.out.println("\n\n" + "*".repeat(20) + "\n\n");
*/
displayMainMenu();
} }
private static int requestIntFromInput(String template, int[] allowedInts) { private void run() {
do {
System.out.print(template);
int input;
do {
if (scanner.hasNextInt()) {
input = scanner.nextInt();
scanner.nextLine();
break;
} else {
scanner.next();
System.out.print("Ошибка: используйте цифры.\nПовторите ввод:");
}
} while (true);
for (int i : allowedInts)
if (i == input)
return input;
System.out.print("Ошибка: укажите номер выбранного пункта.\nПовторите ввод:");
} while (true);
}
private static void displayMainMenu() {
while (true) { while (true) {
Task.printTotalTasksCreated(); Task.printTotalTasksCreated();
String menu = """ String menu = """
@@ -91,16 +62,44 @@ public class TodoApp {
System.out.print("\nОшибка: Название должно содержать от 3 до 20 символов.\nПопробуйте снова: "); System.out.print("\nОшибка: Название должно содержать от 3 до 20 символов.\nПопробуйте снова: ");
} while (true); } while (true);
System.out.print("\nНпишите описание дела: "); System.out.print("\nНaпишите описание дела: ");
description = scanner.nextLine().trim(); description = scanner.nextLine().trim();
var task = new Task(title, description); taskManager.addTask(new Task(title, description));
tasks[Task.taskCount - 1] = task; }
private static void displayTask(Task task) {
Task.TaskPrinter.print(task);
String firstOption = switch (task.getStatus()) {
case NEW, CANCELLED -> "Начать";
case IN_PROGRESS -> "Выполнено";
case COMPLETED -> "Доделать";
};
int input = requestIntFromInput("[1]" + firstOption + " [2]Отменить [0]Главное меню\n\nВвод:",
new int[] { 0, 1, 2 });
switch (input) {
case 0:
return;
case 1: {
switch (task.getStatus()) {
case NEW, CANCELLED, COMPLETED -> taskManager.markInProgress(task.getId());
case IN_PROGRESS -> taskManager.markCompleted(task.getId());
}
break;
}
case 2:
taskManager.markCanceled(task.getId());
}
displayTask(task);
} }
private static void displayTasks() { private static void displayTasks() {
if (Task.taskCount == 0) { if (tasksCounter == 0) {
int input = requestIntFromInput(""" int input = requestIntFromInput("""
Список дел пуст. Список дел пуст.
@@ -112,7 +111,6 @@ public class TodoApp {
if (input == 1) { if (input == 1) {
displayCreateTask(); displayCreateTask();
displayTasks();
} else } else
System.exit(0); System.exit(0);
} }
@@ -122,12 +120,12 @@ public class TodoApp {
"""); """);
printAll(tasks); taskManager.printTasks();
int[] variantsInput = new int[Task.taskCount + 1]; int[] variantsInput = new int[tasksCounter + 1];
for (int i = 0; i < Task.taskCount; i++) for (int i = 0; i < tasksCounter; i++)
variantsInput[i] = tasks[i].getId(); variantsInput[i] = tasks[i].getId();
variantsInput[Task.taskCount] = 0; variantsInput[tasksCounter] = 0;
int input = requestIntFromInput(""" int input = requestIntFromInput("""
@@ -148,31 +146,105 @@ public class TodoApp {
return null; return null;
} }
private static void displayTask(Task task) { private static int requestIntFromInput(String template, int[] allowedInts) {
task.printInfo(true); do {
String firstOption = task.getCompleted() ? "[1]Не выполнено" : "[1]Выполнено"; System.out.print(template);
int input = requestIntFromInput(firstOption + " [0]Главное меню\n\nВвод:", int input;
new int[] { 0, 1 }); do {
if (input == 1) { if (scanner.hasNextInt()) {
task.toggleCompleted(); input = scanner.nextInt();
displayTask(task); scanner.nextLine();
break;
} else {
scanner.next();
System.out.print("Ошибка: используйте цифры.\nПовторите ввод:");
}
} while (true);
for (int i : allowedInts)
if (i == input)
return input;
System.out.print("Ошибка: укажите номер выбранного пункта.\nПовторите ввод:");
} while (true);
}
interface TaskAction {
default void execute(Task task) {
};
default void start(Task task) {
};
default void cancel(Task task) {
};
}
private class TaskManager {
void addTask(Task task) {
tasks[tasksCounter++] = task;
} }
}
private static void printAll(Task... tasks) { boolean markCompleted(int id) {
for (Task t : tasks) for (int i = 0; i < tasksCounter; i++)
if (t != null) if (tasks[i].getId() == id) {
t.printInfo(); TaskAction action = new TaskAction() {
} @Override
public void execute(Task task) {
task.markCompleted();
}
};
action.execute(tasks[i]);
return true;
}
return false;
}
private static boolean markTaskCompletedById(Task[] tasks, int id) { boolean markInProgress(int id) {
for (Task t : tasks) for (int i = 0; i < tasksCounter; i++)
if (t != null && t.getId() == id) { if (tasks[i].getId() == id) {
if (!t.getCompleted()) TaskAction action = new TaskAction() {
t.toggleCompleted(); @Override
return true; public void start(Task task) {
task.markInProgress();
}
};
action.start(tasks[i]);
return true;
}
return false;
}
boolean markCanceled(int id) {
for (int i = 0; i < tasksCounter; i++)
if (tasks[i].getId() == id) {
TaskAction action = new TaskAction() {
@Override
public void cancel(Task task) {
task.markCanceled();
}
};
action.cancel(tasks[i]);
return true;
}
return false;
}
void printTasks() {
class ShortTaskPrinter {
void print(Task task) {
int id = task.getId();
String title = task.getTitle();
TaskStatus status = task.getStatus();
String stringCompleted = status.getColorCode() + status.getDescription() + "\u001B[0m";
System.out.printf("%-3d | %-20s | %s\n", id, title, stringCompleted);
}
} }
return false;
}
ShortTaskPrinter printer = new ShortTaskPrinter();
for (int i = 0; i < Task.taskCount; i++)
printer.print(tasks[i]);
}
}
} }