Overview
Hi! I am Marcus Phua and I am currently a Year 2 Computer Engineering undergraduate at the National University of Singapore (NUS). This is where I document my contributions to PlanMySem.
For our Software Engineering project, my team and I were tasked with enhancing a basic command line interface address book  application.
We chose to morph it into a text-based (Command Line Interface) scheduling/calendar application called PlanMySem, which caters to NUS students and staff who prefer to use a desktop application for managing their schedule/calendar.
PlanMySem automatically creates a planner that is synchronised according to the NUS academic calendar for the current semester and enables easy creation, editing and deleting of items.
Special weeks such as recess week and reading week are taken into account within our unique recursion system.
Items can then be efficiently managed via the intuitive tagging system.
Note the following symbols and formatting used in this document:
| This symbol indicates important information. | 
Also take note:
| 
 | A grey highlight (called a mark-up) indicates that this is a command that can be inputted into the command line and executed by the application. | 
| 
 | Blue text with grey highlight indicates a component, class, method or object in the architecture of the application. | 
My role was to design and write the codes for the list, find, history, undo and redo features.
The following sections illustrate these enhancements in more detail, as well as
the relevant sections I have added to the user and developer guides in relation to these enhancements.
Summary of contributions
This section shows a summary of my coding, documentation, and other helpful contributions to the team project.
- 
Main Feature: I implemented the searching framework within the Planner. The searching framework comprises of 2 sections:- 
List: I added the ability to search and list Slotsusing a keyword user input.- 
What it does: The listcommand generates a list containing allSlotswhose name/tag directly matches the specified keyword (not case-sensitive).
- 
Justification: After the user has added Slotsto their planner, they may want to be able to view information regarding aSlotthat they have added. If the user wants to find out the dates, start times, end times, venues and descriptions pertaining to a specificSlot, they can use thelistcommand to locate that specificSlotand view all of its information in a list.
 
- 
- 
Find: I added the ability to search and find Slotsusing a keyword user input.- 
What it does: The findcommand generates a list containing allSlotswhose name closely matches the specified keyword and displays them as a list.
- 
Justification: Unlike the listcommand, thefindcommand will also consider searches that are similar to the desired name/tag. This is to account for a typo or an incomplete keyword, which can happen often while the user is typing. Additionally, the user may not remember the exact name he has added to the planner, and hence, thefindcommand provides a higher chance for the user to locate their desiredSlot.The findcommand ends up generating a longer output list, which potentially contains manySlots, which may not be optimal for the user to skim through. Thus, I provide users with the option to use thelistcommand to specifically pinpoint their desiredSlotto list.
- 
Highlights: It was challenging to provide an optimal string matching algorithm that accurately weighs the closeness of strings. An in-depth analysis of design alternatives was necessary to determine the kind of string matching algorithm to implement in order to improve search accuracy. 
- 
Credits: The string matching logic was largely dependent on the Levenshtein Distance algorithm. 
 
- 
 
- 
- 
Minor Feature: I added the ability to undo/redo previous commands and view the history of commands entered. - 
What it does: The undocommand allows the user to undo a previousadd/edit/deletecommand. The user may reverse this command with theredocommand.
- 
Justification: In the event that users have made a mistake or changed their minds about executing a command, the undocommand enables them to revert to a version immediately before the mistaken command was executed. If they change their minds again and decide to execute the command after all, then theredocommand enables them to do so easily.
- 
Highlights: As our group chose to morph the product from AddressBook 3, we did not have a History framework in place. I took up the responsibility to adapt the History Framework provided in AddressBook 4 in order to cater to our implementation of PlanMySem. 
- 
Credits: AddressBook 4 for providing the History framework. 
 
- 
To get a sense of how all these features function together, the activity diagram below shows how the search workflow for a Slot in PlanMySem looks like:
 
Essentially, if the user knows the exact keyword to use to locate his/her desired Slot, he would use the list command.
Otherwise, the find command is recommended for use. As a parallel process, CommandHistory records the user input and saves it to Planner’s history.
- 
Code contributed: [RepoSense] [Pull Requests] 
- 
Other contributions: - 
Project management: - 
I managed releases from version 1.1 to 1.4, which are all of the releases on GitHub. 
 
- 
- 
Enhancement to existing features: - 
I wrote additional tests for existing features to increase coverage. 
 
- 
- 
Documentation: 
- 
Community: 
- 
Tools: - 
I completed the initial set up of the developer team and organisation repository on GitHub. 
 
- 
 
- 
Contributions to the User Guide
| Given below are sections I contributed to the User Guide. I have added the descriptions of all features that I have implemented. I have also provided clear instructions for users to use my implemented features. | 
Here are the links to my contributed sections in the User Guide:
Below is an example of my addition to the User Guide for the find feature.
Finding Slots: find / f
Find all slots whose name closely matches the specified keyword and displays them as a list. (Case-sensitive)
Format: find n/KEYWORD
| Keywords are case sensitive! (e.g. CS2113T is not the same as cs2113t) | 
| The findcommand will return the closest matchingSlotwhich contains the specified keyword. The name/tag MUST
contain the specified keyword in order for a match to occur. | 
| Use short keywords (e.g CS) instead of long keywords to increase the chances of finding your desired slot. E.g. Let’s say you are finding a Slotnamed Golf.find n/Gowill detect the slot, whilefind n/Golfswill fail to detect the slot. (Golf does not contain Golfs) | 
Example:
- 
find n/CS
 Find all slots whose name closely matchesCS(eg. CS2101, CS2113T, SOCSMeet)
- 
find t/2113T
 Find all slots that contain tags that closely matches2113T.
 
find n/CSExplanation: As seen from the figure above, the output list of slots are ranked according to their degree of similarity.
All of the Slots listed contain the keyword 'CS'.
Since 'JSOCS' has less characters, it is considered closest to the keyword 'CS', which has only 2 characters.
Remember the tip above when you are finding your Slots.
Contributions to the Developer Guide
| Given below are sections I contributed to the Developer Guide. I have explained the logic behind the features that were tasked to me.
I have also elaborated on my design considerations in order to justify my implementation style. In addition, I was tasked with collating and polishing the User Stories which were generated during the ideation phase of the project. | 
Here are the links to my contributed sections in the Developer Guide:
- 
List Command: list
- 
Find Command: find
- 
Undo & Redo Command: undo&redo
- 
User Stories: User Stories 
Below is an example of my addition to the Developer Guide for the find feature.
Find feature
Current Implementation
The find function supports searching using a single keyword.
| The name/tag of the SlotMUST contain the specified keyword in order for a match to occur. Completely different keywords
do not constitute a match. | 
The matching Slots are then weighted based on their name/tag’s Levenshtein Distance from the keyword.
| A low Levenshtein Distance is attributed to a high level of similarity between the name/tag and the keyword.
(A value of 0 constitutes an exact match.) The maximum Levenshtein Distance set in PlanMySem is 20. | 
The weighted Slots are inserted into a PriorityQueue and the closest matching Slots
will be polled into the output list.
Upon executing the find command with valid parameters,
a sequence of events is executed. The sequence of events illustrated in the Sequence Diagram below will be in reference to the execution
of a find n/keyword command. The sequence of events are as follows:
- 
Upon calling the executemethod of theLogiccomponent, theLogiccomponent would then parse thefind n/keywordcommand.
- 
LogicManagerthen invokes theparseCommandfunction ofParserManager.
- 
ParserManagerin turn invokes theparsefunction of the appropriate parser for thefindcommand which in this case, isFindCommandParser.
- 
After parsing is done, FindCommandParserwould instantiate theFindCommandobject which would be returned to theLogicManager.
- 
LogicManageris then able to invoke theexecutefunction of the returnedFindCommandobject.
- 
The command execution will call the getDaysmethod of theFindCommandobject which retrieves data from theModelcomponent (i.e. retrieving data from the currentSemester).
- 
FindCommandwill execute thegetDiscoveredNamesmethod to find the closely matchingSlotswith names containing 'keyword'.
- 
The result of the command execution is encapsulated as a CommandResultobject which is passed back toUi.
- 
In addition, the CommandResultobject can also instruct theUito display results, such as displaying help to the user.
To give a graphical summary of the above process, a Sequence Diagram detailing the execution of the find n/keyword command is provided below.
 
find n/keyword CommandThe Communication Diagram below summarises the data links between the various objects in the find command.
 
find n/keyword Command
Design Considerations
Aspect: What constitutes a positive search result in find command
| No. | Alternatives | Pros | Cons | 
| Past Implementation 1 | Positive search result by strictly matching the entered keyword | Easy to implement. | Search must be exact, typos or an incomplete keyword will yield incorrect results. Nothing different from  | 
| Past Implementation 2 | Positive search result as long as name/tag contains the keyword. | Searches will detect names/tags similar to the keyword. | Output list will be longer. May become excessively long if short keyword is provided. | 
| Current Implementation | Store the search results in a  | Searches are ordered by a degree of similarity, instead of the random order of names/tags in Past Implementation 2. | Adds complexities in finding and searching. | 
Glossary
- Levenshtein Distance
- 
The Levenshtein distance is a string metric for measuring difference between two sequences. 
 Informally, the Levenshtein distance between two words is the minimum number of single-character edits (i.e. insertions, deletions or substitutions) required to change one word into the other.