From 7a3987a75d3fea339e39c23272b25ece95a205e2 Mon Sep 17 00:00:00 2001 From: SachinGoud9 Date: Fri, 8 Sep 2023 17:11:25 +0530 Subject: [PATCH] feat: Modified code according to SOLID principles. --- .idea/.gitignore | 4 + .../training/tasks/TaskExceptionsImpl.java | 29 +++++ .../training/tasks/TaskExecution.java | 108 +++++++++++++++++ .../codurance/training/tasks/TaskList.java | 112 +----------------- .../training/tasks/{ => classes}/Task.java | 2 +- .../tasks/interfaces/TaskActions.java | 11 ++ .../tasks/interfaces/TaskExceptions.java | 6 + 7 files changed, 162 insertions(+), 110 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 java/src/main/java/com/codurance/training/tasks/TaskExceptionsImpl.java create mode 100644 java/src/main/java/com/codurance/training/tasks/TaskExecution.java rename java/src/main/java/com/codurance/training/tasks/{ => classes}/Task.java (92%) create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/TaskActions.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/TaskExceptions.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..70828780 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,4 @@ +# Default ignored files +/shelf/ +/workspace.xml +*.xml \ No newline at end of file diff --git a/java/src/main/java/com/codurance/training/tasks/TaskExceptionsImpl.java b/java/src/main/java/com/codurance/training/tasks/TaskExceptionsImpl.java new file mode 100644 index 00000000..3c260934 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/TaskExceptionsImpl.java @@ -0,0 +1,29 @@ +package com.codurance.training.tasks; + +import com.codurance.training.tasks.interfaces.TaskExceptions; + +import java.io.PrintWriter; + +public class TaskExceptionsImpl implements TaskExceptions { + + private final PrintWriter out; + + public TaskExceptionsImpl(PrintWriter out) { + this.out = out; + } + + public void help() { + out.println("Commands:"); + out.println(" show"); + out.println(" add project "); + out.println(" add task "); + out.println(" check "); + out.println(" uncheck "); + out.println(); + } + + public void error(String command) { + out.printf("I don't know what the command \"%s\" is.", command); + out.println(); + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/TaskExecution.java b/java/src/main/java/com/codurance/training/tasks/TaskExecution.java new file mode 100644 index 00000000..08fb0790 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/TaskExecution.java @@ -0,0 +1,108 @@ +package com.codurance.training.tasks; + + +import com.codurance.training.tasks.classes.Task; +import com.codurance.training.tasks.interfaces.TaskActions; + +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class TaskExecution implements TaskActions { + private long lastId = 0; + private final PrintWriter out; + private TaskExceptionsImpl taskExceptions; + private final Map> tasks = new LinkedHashMap<>(); + public TaskExecution(PrintWriter out) { + this.out = out; + } + + public void execute(String commandLine) { + String[] commandRest = commandLine.split(" ", 2); + String command = commandRest[0]; + taskExceptions = new TaskExceptionsImpl(out); + switch (command) { + case "show": + show(); + break; + case "add": + add(commandRest[1]); + break; + case "check": + check(commandRest[1]); + break; + case "uncheck": + uncheck(commandRest[1]); + break; + case "help": + taskExceptions.help(); + break; + default: + taskExceptions.error(command); + break; + } + } + + public void show() { + for (Map.Entry> project : tasks.entrySet()) { + out.println(project.getKey()); + for (Task task : project.getValue()) { + out.printf(" [%c] %d: %s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription()); + } + out.println(); + } + } + + public void add(String commandLine) { + String[] subcommandRest = commandLine.split(" ", 2); + String subcommand = subcommandRest[0]; + if (subcommand.equals("project")) { + addProject(subcommandRest[1]); + } else if (subcommand.equals("task")) { + String[] projectTask = subcommandRest[1].split(" ", 2); + addTask(projectTask[0], projectTask[1]); + } + } + + public void addProject(String name) { + tasks.put(name, new ArrayList()); + } + + public void addTask(String project, String description) { + List projectTasks = tasks.get(project); + if (projectTasks == null) { + out.printf("Could not find a project with the name \"%s\".", project); + out.println(); + return; + } + projectTasks.add(new Task(nextId(), description, false)); + } + + public void check(String idString) { + setDone(idString, true); + } + + public void uncheck(String idString) { + setDone(idString, false); + } + + public void setDone(String idString, boolean done) { + int id = Integer.parseInt(idString); + for (Map.Entry> project : tasks.entrySet()) { + for (Task task : project.getValue()) { + if (task.getId() == id) { + task.setDone(done); + return; + } + } + } + out.printf("Could not find a task with an ID of %d.", id); + out.println(); + } + + public long nextId() { + return ++lastId; + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/TaskList.java b/java/src/main/java/com/codurance/training/tasks/TaskList.java index 9a4a8202..8f2ded5a 100644 --- a/java/src/main/java/com/codurance/training/tasks/TaskList.java +++ b/java/src/main/java/com/codurance/training/tasks/TaskList.java @@ -4,19 +4,13 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; public final class TaskList implements Runnable { private static final String QUIT = "quit"; - - private final Map> tasks = new LinkedHashMap<>(); private final BufferedReader in; private final PrintWriter out; - private long lastId = 0; + private final TaskExecution taskExecution; public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); @@ -27,6 +21,7 @@ public static void main(String[] args) throws Exception { public TaskList(BufferedReader reader, PrintWriter writer) { this.in = reader; this.out = writer; + this.taskExecution = new TaskExecution(writer); } public void run() { @@ -42,108 +37,7 @@ public void run() { if (command.equals(QUIT)) { break; } - execute(command); - } - } - - private void execute(String commandLine) { - String[] commandRest = commandLine.split(" ", 2); - String command = commandRest[0]; - switch (command) { - case "show": - show(); - break; - case "add": - add(commandRest[1]); - break; - case "check": - check(commandRest[1]); - break; - case "uncheck": - uncheck(commandRest[1]); - break; - case "help": - help(); - break; - default: - error(command); - break; - } - } - - private void show() { - for (Map.Entry> project : tasks.entrySet()) { - out.println(project.getKey()); - for (Task task : project.getValue()) { - out.printf(" [%c] %d: %s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription()); - } - out.println(); - } - } - - private void add(String commandLine) { - String[] subcommandRest = commandLine.split(" ", 2); - String subcommand = subcommandRest[0]; - if (subcommand.equals("project")) { - addProject(subcommandRest[1]); - } else if (subcommand.equals("task")) { - String[] projectTask = subcommandRest[1].split(" ", 2); - addTask(projectTask[0], projectTask[1]); - } - } - - private void addProject(String name) { - tasks.put(name, new ArrayList()); - } - - private void addTask(String project, String description) { - List projectTasks = tasks.get(project); - if (projectTasks == null) { - out.printf("Could not find a project with the name \"%s\".", project); - out.println(); - return; - } - projectTasks.add(new Task(nextId(), description, false)); - } - - private void check(String idString) { - setDone(idString, true); - } - - private void uncheck(String idString) { - setDone(idString, false); - } - - private void setDone(String idString, boolean done) { - int id = Integer.parseInt(idString); - for (Map.Entry> project : tasks.entrySet()) { - for (Task task : project.getValue()) { - if (task.getId() == id) { - task.setDone(done); - return; - } - } + taskExecution.execute(command); } - out.printf("Could not find a task with an ID of %d.", id); - out.println(); - } - - private void help() { - out.println("Commands:"); - out.println(" show"); - out.println(" add project "); - out.println(" add task "); - out.println(" check "); - out.println(" uncheck "); - out.println(); - } - - private void error(String command) { - out.printf("I don't know what the command \"%s\" is.", command); - out.println(); - } - - private long nextId() { - return ++lastId; } } diff --git a/java/src/main/java/com/codurance/training/tasks/Task.java b/java/src/main/java/com/codurance/training/tasks/classes/Task.java similarity index 92% rename from java/src/main/java/com/codurance/training/tasks/Task.java rename to java/src/main/java/com/codurance/training/tasks/classes/Task.java index 31b39c98..91a9cfe1 100644 --- a/java/src/main/java/com/codurance/training/tasks/Task.java +++ b/java/src/main/java/com/codurance/training/tasks/classes/Task.java @@ -1,4 +1,4 @@ -package com.codurance.training.tasks; +package com.codurance.training.tasks.classes; public final class Task { private final long id; diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/TaskActions.java b/java/src/main/java/com/codurance/training/tasks/interfaces/TaskActions.java new file mode 100644 index 00000000..74be1742 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/TaskActions.java @@ -0,0 +1,11 @@ +package com.codurance.training.tasks.interfaces; +public interface TaskActions { + void show(); + void add(String commandLine); + void addProject(String name); + void addTask(String project, String description); + void check(String idString); + void uncheck(String idString); + void setDone(String idString, boolean done); + long nextId(); +} \ No newline at end of file diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/TaskExceptions.java b/java/src/main/java/com/codurance/training/tasks/interfaces/TaskExceptions.java new file mode 100644 index 00000000..80e7455b --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/TaskExceptions.java @@ -0,0 +1,6 @@ +package com.codurance.training.tasks.interfaces; + +public interface TaskExceptions { + public void help(); + public void error(String command); +} \ No newline at end of file