Introduction
This project portfolio highlights the contributions I have made in for my project, KeyboardFlashCards, also known as KFC. A key part of our software engineering module in the National University of Singapore, we started off by morphing an address book application into our very own product, a Flashcard manager using purely the Command-Line Interface (CLI). This was a key requirement of the project, as we had to ensure users only utilise the application by keying in commands exclusively using the keyboard. In addition, this is a desktop application, used only on a computer.
This is a 6 week software engineering project, where we worked in a team of 5 who are students from the NUS School of Computing. Our team consists of 3 Computer Science sophomores and 2 Computer Engineering seniors (myself included).
Our finalised product, KeyboardFlashCards is an educational tool that aims to make remembering things easy. We wanted to provide an efficient way to study for our peers to NUS School of Computing. As such, we came up with an easy to use, FlashCard manager using CLI for efficient and quick storage of important revision material to aid their study.
Note the following symbols and formatting used in this document.
This section explains certain information that require the user to take note of. i.e. prefixes used in our application and what it represents, certain functionality of the command |
This section is used clarify certain possible assumptions the user/developer might have when using our application. These assumptions could result in errors and exceptions in the application. |
Summary of contributions
This section shows a summary of the personal contributions I had on our project. Contributions included enhancements to the application with new major features, project management implementations and additions to the documentation in the User Guide and Developer Guide.
-
Major enhancement #1: added the ability to store deadlines in a schedule
-
What it does: This feature allows the user to store specific tasks as deadlines. The user can now add specific dates that are important to their study and revision i.e. exam dates, revision dates. In addition, the user can have an overview of all upcoming deadlines by looking at the pop-up calendar.
-
Justification: This feature improves the product significantly as the user can now ensure they would not miss important dates and can now allocate their study and revision schedule according to these dates.
-
Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.
-
Credits: Credit goes to SirGoose3232 for the JavaFX Calendar GUI which was adapted before adding deadlines.
-
-
Major enhancement #2: added the ability to perform spaced repetition of FlashCards
-
What it does: This feature allows the user to store specific tasks as deadlines that will be reminded to the user. The user can now add specific dates that are important to their study and revision i.e. Exam dates, revision dates. In addition, the user can have an overview of all upcoming deadlines by looking at the pop-up calendar.
-
Justification: This feature improves the product significantly as the user keep track of FlashCard questions that they are weak at and be reminded to do these questions again. important dates and can now allocate their study and revision schedule according to these dates.
-
Highlights: This feature is not included by chance. I wanted to incorporate an effective study technique that is proven to work based on research. I decided to implement spaced repetition as it was an evidence-based learning technique.
-
Credits: This feature is inspired by the theory of Forgetting Curve by Hermann Ebbinghaus, who theorised that training in mnemonic techniques can help overcome speed of forgetting. One effective way is the use of active recall, especially using Spaced Repetition. I implemented a simple version of spaced repetition through rating of "Bad" FlashCards.
-
-
Code contributed: [Contributed code]
-
Other contributions
Contributions to the User Guide
Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users. |
Add general Deadline: deadline t>TASK d>DUEDATE
This command adds a general Deadline
into a list. The list will be displayed on the right-side pane.
Note: DUEDATE
has to be in dd/MM/yyyy format.
You can refer to the example below.
deadline t>CS2103 Exam d>10/12/2019
After keying in the command, the result box will show the success message.
The new Deadline
will now be shown at the right-side pane.
Note that Deadline (s) entered will be sorted in ascending order i.e. earliest Deadline on index 1
|
Deadline (s) can only be after/on the current date. Leap year dates are also taken into account.
|
Remove Deadline from list: remove index
Removes a specific Deadline
. The list on the right-side pane will no longer have the Deadline
.
remove 2
When a Deadline of re-test questions is removed, the list of questions will still be stored in the specific date.
|
Show monthly calendar with all Deadline(s): calendar
Shows the calendar filled with all deadlines in the month. The calendar will be shown as a new window pop-up.
calendar
The calendar will pop up, seen below.
The calendar window does not show the specific Deadline , but an overview of all your Deadline (s) for the month ahead.
|
Rate Flashcard as "Bad", with Deadline to re-test: bad index
Rates a specific FlashCard
as "Bad". It will then be stored as a Deadline
in the list on the right-side pane.
bad 2
Key the above mentioned example into the command box.
The command will add the 2nd FlashCard
on the list, "How to declare a pointer in C?" as a "Bad" FlashCard
.
After which, the result box will show the success message.
A new Deadline
will now be shown at the right side-bar, 3 days later from the day it was entered.
"Bad" rated FlashCard (s) will be added to as a Deadline which is due 3 days later. This is an approximated value that based on
the theory of Spaced Repetition, referring to Ebbinghaus Forgetting Curve
by Hermann Ebbinghaus who hypothesised this theory in 1985.
|
List all "Bad" FlashCards for a specific date listbad d>DATE
List all the "Bad" rated FlashCard
(s) from a specific date. The FlashCard
questions will be shown.
listbad d>14/11/2019
The automated test mode for the "Bad" FlashCard is not functional at this point and will be implemented in KFC v2.0.
|
Remove a specific "Bad" FlashCard for a specific date removebad d>DATE i>INDEX
You can remove a specific "Bad" rated FlashCard
from the list
removebad d>14/11/2019 i>2
You can refer to the example above.
As seen from before, after listing all the "Bad" rated FlashCard
(s) for a specific date using listbad d>14/11/2019
,
you can observe the full list as seen below.
Afterwards, you can choose to remove as specific "Bad" rated FlashCard
from that list.
Using the example removebad d>14/11/2019 i>2
, you can observe this.
Once removed, a success message will be shown!
Using the remove command to remove a "ToDo: Bad Questions" Deadline does not remove all the "Bad" FlashCard
stored for that date.
|
Contributions to the Developer Guide
Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project. |
Add and Remove Deadline feature
Implementation
The deadline feature allows the user to add tasks with specific due dates, with a compulsory field
of TASK
and DUE DATE
.
The following are new classes used to integrate the Deadline
feature.
-
Deadline
— Object class, containing important information such as theTask
andDueDate
. -
UniqueDeadlineList
— Contains aObservableList
ofDeadline
objects. The list will be initialised from the storage at start up of application. AComparator
class was added to arrange the list according to ascendingDueDate
. -
DeadlineCommand
— Embodies theDeadline
command by the user. It will hold all the information about theDeadline
that will be added. -
DeadlineCommandParser
— Parses user input and uses it to construct aDeadlineCommand
instance. -
RemoveCommand
— Holds information on whichDeadline
to be removed. Contains anIndex
object. -
RemoveCommandParser
— Parses user input and uses it to construct aRemoveCommand
instance.
In addition, various Exception classes are added to handle possible runtime errors while adding or removing Deadline
(s).
This is done to ensure that the user specified Deadline
is valid for storage and processing.
-
DuplicateDeadlineException
— This exception is thrown when the user attempts to add an identicalDeadline
object is added into the existingUniqueDeadlineList
. -
DeadlineNotFoundException
— This exception is thrown when the user attempts to remove aDeadline
object that does not exist in theUniqueDeadlineList
.
For the add Deadline
feature - deadline
, the following are the prefixes for each field
- t> : TASK
- d> : DUE DATE
- For DUE DATE
: Date format must be in dd/MM/yyyy
i.e. 01/01/2020
The upper cased Deadline represents the object class that contains Task and DueDate , while the lower-cased
deadline represents the command used to add Deadline objects into our storage.
|
Given below is an example usage scenario of deadline
command:
The user executes deadline t>Complete Homework d>04/10/2020
to add new Deadline
to the task
of completing homework by the 4th October 2020.
The deadline feature does not allow adding of duplicate/identical Deadline (s). Also, new Deadline (s) must
be later than the current date and is a valid type of date i.e. 29/02/2019 is invalid as 2019 is not a leap year.
|
The following sequence diagram shows how the deadline
operation works:
The following activity diagram summarizes what happens when a user executes a deadline
command.
The remove
command works in a similar way, and hence the sequence and activity diagrams will be omitted for redundancy.
Design considerations
Aspect: How to implement Deadline
-
Alternative 1(current choice): Use command
deadline
together with prefixes liket>
andd>
-
Pros: Easier to implement
-
Cons: User might miss the prefixes hence adding wrong
Deadline
(s)
-
-
Alternative 2: Make use of the GUI. after user execute
deadline
command, an adddeadline
window would pop up with a section for individual fields-
Pros: More user friendly
-
Cons: Difficult to implement. Might be slower for the user to key in
Deadline
(s) as compared to using a one liner with prefixes
-
Bad rating feature
Implementation
The bad
feature allows the user to rate specific FlashCard
(s) as "Bad" if they did not perform well on them.
These rated FlashCard
(s) will then we stored as a Deadline
dated 3 days later, where the user will then be reminded to
re-test them.
This is a simple implementation of a type of evidence-based learning technique known as Spaced Repetition. This is used as a form of active recall technique which is said to overcome forgetting, theorised by Hermann Ebbinghaus, and his theory of Forgetting Curve.
The following are new classes used to integrate the "Bad" FlashCard
rating feature.
-
BadQuestions
— Main object class for the feature. Makes use of aHashMap
of key-value pairing of a DateString
that is converted to aLocalDate
class as the key, and the value is aArrayList
ofFlashCard
(s). This allows ease of search for "Bad" ratedFlashCard
(s) based on the date stored. -
BadCommand
— Contains aObservableList
ofDeadline
objects. The list will be initialised from the storage at start up of application. AComparator
class was added to arrange the list according to ascendingDueDate
. -
ListBadCommand
— Embodies theDeadline
command by the user. It will hold all the information about theDeadline
that will be added. -
RemoveBadCommand
— Parses user input and uses it to construct aDeadlineCommand
instance.
In addition, two Exception classes are added to handle possible runtime errors while adding new "Bad" FlashCard
(s).
This is done to ensure that the user specified "Bad" FlashCard
is valid for storage and processing.
-
NoBadFlashCardException
— This exception is thrown when the user attempts to add an identicalDeadline
object is added into the existingUniqueDeadlineList
. -
DuplicateFlashCardAndDeadlineException
— This exception is thrown when the user attempts to add an identicalDeadline
object is added into the existingUniqueDeadlineList
.
Following are the prefixes for each field: - bad INDEX i.e. bad 2 |
Design considerations
Aspect: How to store "Bad" FlashCard in storage
-
Alternative 1(current choice): Use a
HashMap
with the specified date as the key and the values asArrayList
ofFlashCard
(s). Use of the Google Gson library to save and fetchHashMap
from and to Json format.-
Pros: Easier for searching and sorting purposes, as entire
FlashCard
object is stored and easily referred using the date as key. Can fetch more than just the answer of theFlashCard
-
Cons: Separated from the
FlashCard
UniqueFlashCardList
, which might confuse the user as there will be two different lists ofFlashCard
-
-
Alternative 2: Use similar implementation as how
FlashCard
andDeadline
objects are stored in storage; use anObservableList
that can be displayed in GUI.-
Pros: Easier to implement, clearer for user to see and fetch these "Bad" rated
FlashCard
(s) -
Cons: Difficult to manipulate in the future, especially when we want to implement automated test reminders for these "Bad" rated
FlashCard
(s). AHashMap
will allow easy fetching using the specified date as key
-