Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[yu-sutong] iP #644

Open
wants to merge 45 commits into
base: master
Choose a base branch
from
Open

Conversation

yu-sutong
Copy link

@yu-sutong yu-sutong commented Sep 4, 2024

MySutong frees your mind of having to remember things you need to do. It's,

  • text-based
  • easy to learn
  • SUPER FAST to use

All you need to do is,

  1. download it from here.
  2. double-click it.
  3. add your tasks.
  4. let it manage your tasks for you 😉

And it is FREE!

Features:

  • Managing tasks
  • Managing deadlines (coming soon)
  • Reminders (coming soon)

Copy link

@kevin-pek kevin-pek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, just have some nitpicks with regards to the coding standards. Have highlighted them for your consideration. Thanks!

Comment on lines 15 to 87
switch (command) {
case "bye":
ui.showGoodbye();
System.exit(0);
break;

case "list":
ui.showTaskList(tasks);
break;

case "mark":
int markIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(markIndex).markAsDone();
ui.showLine();
ui.showMessage("Nice! I've marked this task as done:");
ui.showMessage(tasks.getTask(markIndex).toString());
ui.showLine();
storage.save(tasks);
break;

case "unmark":
int unmarkIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(unmarkIndex).unmark();
ui.showLine();
ui.showMessage("OK, I've marked this task as not done yet:");
ui.showMessage(tasks.getTask(unmarkIndex).toString());
ui.showLine();
storage.save(tasks);
break;

case "todo":
tasks.addTask(new Todo(inputs[1]));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;

case "deadline":
String[] deadlineDetails = inputs[1].split("/by");
tasks.addTask(new Deadline(deadlineDetails[0].trim(), LocalDateTime.parse(deadlineDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;

case "event":
String[] eventDetails = inputs[1].split("/from|/to");
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;

case "delete":
int deleteIndex = Integer.parseInt(inputs[1]) - 1;
Task removedTask = tasks.getTask(deleteIndex);
tasks.removeTask(deleteIndex);
ui.showLine();
ui.showMessage("Noted. I've removed this task:");
ui.showMessage(removedTask.toString());
ui.showLine();
storage.save(tasks);
break;

default:
throw new UnknownCommandException("I'm sorry, but I don't know what that means.");
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch (command) {
case "bye":
ui.showGoodbye();
System.exit(0);
break;
case "list":
ui.showTaskList(tasks);
break;
case "mark":
int markIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(markIndex).markAsDone();
ui.showLine();
ui.showMessage("Nice! I've marked this task as done:");
ui.showMessage(tasks.getTask(markIndex).toString());
ui.showLine();
storage.save(tasks);
break;
case "unmark":
int unmarkIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(unmarkIndex).unmark();
ui.showLine();
ui.showMessage("OK, I've marked this task as not done yet:");
ui.showMessage(tasks.getTask(unmarkIndex).toString());
ui.showLine();
storage.save(tasks);
break;
case "todo":
tasks.addTask(new Todo(inputs[1]));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "deadline":
String[] deadlineDetails = inputs[1].split("/by");
tasks.addTask(new Deadline(deadlineDetails[0].trim(), LocalDateTime.parse(deadlineDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "event":
String[] eventDetails = inputs[1].split("/from|/to");
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "delete":
int deleteIndex = Integer.parseInt(inputs[1]) - 1;
Task removedTask = tasks.getTask(deleteIndex);
tasks.removeTask(deleteIndex);
ui.showLine();
ui.showMessage("Noted. I've removed this task:");
ui.showMessage(removedTask.toString());
ui.showLine();
storage.save(tasks);
break;
default:
throw new UnknownCommandException("I'm sorry, but I don't know what that means.");
}
switch (command) {
case "bye":
ui.showGoodbye();
System.exit(0);
break;
case "list":
ui.showTaskList(tasks);
break;
case "mark":
int markIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(markIndex).markAsDone();
ui.showLine();
ui.showMessage("Nice! I've marked this task as done:");
ui.showMessage(tasks.getTask(markIndex).toString());
ui.showLine();
storage.save(tasks);
break;
case "unmark":
int unmarkIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(unmarkIndex).unmark();
ui.showLine();
ui.showMessage("OK, I've marked this task as not done yet:");
ui.showMessage(tasks.getTask(unmarkIndex).toString());
ui.showLine();
storage.save(tasks);
break;
case "todo":
tasks.addTask(new Todo(inputs[1]));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "deadline":
String[] deadlineDetails = inputs[1].split("/by");
tasks.addTask(new Deadline(deadlineDetails[0].trim(), LocalDateTime.parse(deadlineDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "event":
String[] eventDetails = inputs[1].split("/from|/to");
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "delete":
int deleteIndex = Integer.parseInt(inputs[1]) - 1;
Task removedTask = tasks.getTask(deleteIndex);
tasks.removeTask(deleteIndex);
ui.showLine();
ui.showMessage("Noted. I've removed this task:");
ui.showMessage(removedTask.toString());
ui.showLine();
storage.save(tasks);
break;
default:
throw new UnknownCommandException("I'm sorry, but I don't know what that means.");
}

The coding standard mentions that switch statements should not have indentation for case clauses. Default formatting for your IDE may have conflicted with this.

Comment on lines 32 to 47
switch (taskType) {
case "T":
task = new Todo(description);
break;
case "D":
LocalDateTime deadlineDate = LocalDateTime.parse(parts[3], DateTimeFormatter.ofPattern("d/M/yyyy HHmm"));
task = new Deadline(description, deadlineDate);
break;
case "E":
LocalDateTime eventStart = LocalDateTime.parse(parts[3], DateTimeFormatter.ofPattern("d/M/yyyy HHmm"));
LocalDateTime eventEnd = LocalDateTime.parse(parts[4], DateTimeFormatter.ofPattern("d/M/yyyy HHmm"));
task = new Event(description, eventStart, eventEnd);
break;
default:
throw new IllegalStateException("Unknown task type: " + taskType);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue with switch formatting.

import mysutong.Deadline;
import mysutong.Event;

import java.io.*;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Imports should be made explicit according to the coding standard.

Suggested change
import java.io.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.BufferedWriter;
import java.io.IOException;


case "event":
String[] eventDetails = inputs[1].split("/from|/to");
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is past the 120 character line limit for the coding standards. It would be good to consider doing line wrapping. Alternatively you might want to separate the logic into multiple lines instead.

Suggested change
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
tasks.addTask(new Event(eventDetails[0].trim(),
LocalDateTime.parse(eventDetails[1].trim(),
DateTimeFormatter.ofPattern("d/M/yyyy HHmm")),
LocalDateTime.parse(eventDetails[2].trim(),
DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));

# Conflicts:
#	src/main/java/mysutong/Storage.java
# Conflicts:
#	src/main/java/mysutong/Parser.java
#	src/main/java/mysutong/Ui.java
The executeCommand method in Parser handles user commands by splitting the input string into two parts: the command itself and any additional arguments.

Currently, the split operation does not validate that the input string contains at least one element, which could potentially lead to unexpected behaviour or bugs if empty input is passed.

To mitigate this, let's add an assert statement to ensure that the inputs array has at least one element. This ensures that the code always receives a valid command to process. In situations where assertions are enabled, this will help catch empty or invalid commands during development and testing.

While this doesn't address user input validation directly (since assert can be disabled in production), it adds an extra layer of safety during development.

This change also avoids unnecessary array access errors and improves the stability of the command handling logic.
This commit refactors the code to conform to the Checkstyle configuration, ensuring consistency and compliance with coding standards.

Changes made:
- Replaced wildcard imports (e.g., import static org.junit.jupiter.api.Assertions.*) with explicit imports for better clarity and to avoid unnecessary imports.
- Corrected import order to follow the standard conventions, ensuring that java.* imports are grouped together and listed alphabetically.
- Fixed spacing issues, such as ensuring a single space between comments and code, and after operators (e.g., =, +).
- Improved overall code readability and conformance to Checkstyle rules by addressing minor formatting inconsistencies.

These changes are intended to improve the maintainability of the codebase by ensuring that it follows consistent styling rules as enforced by Checkstyle. By doing this, we minimize the chances of formatting-related errors and enhance code readability across the project.

All changes are purely stylistic and do not alter the functionality of the code.
Add assertion to ensure valid command input
Refactor code style to adhere to Checkstyle guidelines
@yu-sutong yu-sutong changed the title Yu Sutong iP [yu-sutong] iP Sep 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants