Introduction
This project portfolio has been written to elaborate on my contributions to a team-based software engineering project in the NUS Computing module CS2103T.
In this module, my team of five was tasked to create an application, by morphing the Address Book - Level 3.
Constraints
We had the the following constraints:
- Target Consumer:
-
-
The product should be targeting users who can type fast and prefer typing over other means of input.
-
- Solution
-
-
For this constraint, we ensured that the majority of the user’s interactions with the application are through the Command Line Interface (CLI), which implies that users have to type commands and instructions, instead of using a Graphical User Interface(GUI).
-
- Application requirements:
-
-
The product has to be Brownfield.
-
- Solution
-
-
This means that we had to morph the existing Address Book into another application. However, we were allowed to transform the concept of the application by incrementally changing the code.
-
Product - TravEzy
Keeping the above constraints in mind, we created TravEzy, a desktop-based CLI travel application. Our application erases the logistical nightmare that haunts regular travellers.
Instead of having to deal with several applications to organise and document a single trip, users can now combine critical travel applications such as calendars, itinerary planners, diaries and budgeting tools into one convenient and intuitive interface.
Our product is for NUS students who are avid travellers. Given their busy schedules and love for travelling, TravEzy is the optimal solution for their travel needs.
Overview of my contributions
I took up the responsibility of implementing the Diary Feature , end to end, in TravEzy. While this was my main task, I also worked on the common code base and design.
In addition, I provided structure and content for critical documentation such as the User and Developer guides. I shall elaborate more in the following sections.
Summary of contributions
Given that the largest feature that I implemented was the Diary, I have discussed it in detail below.
Diary Feature
Introduction to the feature:
-
The Diary Feature represents a real-life diary. In this implementation, every user has a Diary Book which contains a list (in the form of a Diary List) of all his/her Diary Entries.
Market Validation:
-
As part of our market validation process, we observed that most student travellers enjoy journaling and recording their trips in a text format. This feature allows for users to do exactly that, with some additional features to increase convenience and usability.
Highlights:
Other than being able to add, delete and display diary entries, this implementation of the diary feature also allows users to find specific entries and encrypt private memories to keep them safe.
find
and findSpecific
Looking through a large number of diary entries can be challenging, and that’s why,
I implemented a basic find
command which allows users to run through all their entries quickly and find entries
which match their query. The findSpecific
command takes this functionality to the next level by allowing users to segment their diary entries
based on the different componenets of an entry (Title, Date etc)
setDetails
Most diaries are for personal thoughts and opinions, and thus, I implemented the private
command which allows users to
protect their memories. In order to further safeguard entries, I implemented the setDetails
command which allows
users to password protect their memories. Finally, to fully protect the users, I encrypted their data to ensure that no
unauthorised users can read private information straight from the storage files.
Code contributed: Code
Other Contributions
Other contributions:
-
Delay Function
-
Added a delay function which allows users to see an exit message when leaving the application Delay
-
-
Solve Common Bugs
-
Solved common bugs such as CodeWindow
-
-
Project management:
-
Documentation:
Contributions to the User Guide
In this section, I shall be sharing some of the portions from the TravEzy Userguide which I wrote.
I shall be focusing on the find
, findSpecific
and setDetails
commands.
They showcase my ability to write documentation targeting end-users.
Find diary entries find
"Hey, when did I go to Spain?" It can be hard to remember all the details of your trips. That’s why, this Diary lets you look through all your entries quickly, to give you the entry that you want!
Format:
find TARGET
Example:
find rugby
To search for Dates, enter them in the same format as before, when you added the Diary Entry (dd/mm/yyyy HHMM) |
Step by step:
That was the craziest Rugby World Cup ever! Who lost?
Step 1: Type find rugby
into the User Input Box and press Enter on the keyboard. You can refer to the picture below, where the number 1 is.
Step 2: TravEzy will tell you if your find
command was successful in the Result Display, as can be seen where the number 2 is, in the picture below.
Step 3: You can see the matching Diary Entries in your Diary List Panel, similar to number 3 in the picture below.
Find specific diary entries findSpecific
Let’s narrow down your search! The Diary allows you to look through specific sections of each Diary Entry to find the exact entry that you want!
Format:
findSpecific [t/TITLE] [d/DATE TIME] [p/PLACE] [m/MEMORY]
Example:
findSpecific d/12/12/2019
Step by step:
You know that you had a trip on the 12th of December 2019, but you can’t remember what you did…
Step 1: Type findSpecific d/12/12/2019
into the User Input Box and press Enter on the keyboard. You can refer to the picture below, where the number 1 is.
Step 2: TravEzy will tell you if your findSpecific
command was successful in the Result Display, as can be seen where the number 2 is, in the picture below.
Step 3: You can see the specific matching Diary Entries in your Diary List Panel, similar to number 3 in the picture below.
Keep your diary protected setDetails
You never know who may use your laptop when you’re away. The Diary can help you to protect your memories to stop hackers from looking at your private memories with a username and password.
If you setDetails
, you will not be able to use the unprivate
command and will have to use the unlock
command (See below).
Format:
setDetails user/USERNAME password/PASSWORD
Example:
setDetails user/youcanthackme password/youreallycanthackme
You can only set your details once! After that, you will have to delete TravEzy if you forget your password and need to unlock entries. This is done to ensure NO ONE misues your personal information |
Keep your username and password long to keep those pesky hackers out! Minimally, make sure your username and password are alphanumeric and 8 characters long |
Step by step:
Better set a password to protect your memories against prying eyes
Step 1: Type setDetails user/youcanthackme password/youreallycanthackme
into the User Input Box and press Enter on the keyboard. You can refer to the picture below, where the number 1 is.
Step 2: TravEzy will tell you if your unprivate
command was successful in the Result Display, as can be seen where the number 2 is, in the picture below.
Contributions to the Developer Guide
Given below is a sample of the sections that I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project.
Sequence of Find Command
Above, we have the sequence diagram for the FindCommand
in the Diary. In this case, we have taken the scenario of finding any DiaryEntries
which contain the word "temp".
Process:
-
Upon receiving the instruction from
Logic
to parse the inputfind temp
, theDiaryBookParser
begins parsing the input to match it (based on the Command Word) to the appropriate Parser -
In this case, given that the Command Word is
find
the appropriate Parser is theFindCommandParser
, which is created and then begins toparse("temp")
-
This in turn creates a new
FindPredicate
, based on the inputtemp
. ThisFindPredicate
will be used to filter through theDiaryModel
to get the matchingDiaryEntries
-
With the
FindPredicate
, a newFindCommand
is created which is returned to logic and executed -
This execution leads to the
find(temp)
command being executed on theDiaryModel
, which returns the updatedDiaryModel
with the matchingDiaryEntries
-
This model is then returned to the user in the form of the
Command Result
, and is visible on the GUI in the form of a list of the matchingDiaryEntries
.
The lifeline for FindCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. |
Logic of Unprivate and Unlock Commands
Given the similar function of the 2 commands, unprivate
and unlock
, there is a more detailed explanation of the differences between the commands below.
Above, is the logical flow for the Unprivate Command. In brief, it allows a user to unprivate any private entry IF there are no Details
set. As a result, the command can be input like this:
unprivate 1
1 is the index of the Diary Entry which is to be unprivated
|
Above, is the logical flow for the Unlock Command. In brief, it allows a user to unlock any private entry IF there are Details
and the Details
input by the user match the original Details
set by the user.As a result, the command can be input like this:
unlock 1 user/username password/password
1 is the index of the Diary Entry which is to be unlocked and user/username and password/password are the relevant Details.
|
In summary, the unlock
command is only to be used when the user has already set Details
. Otherwise, the user has to use the unprivate
command to see private DiaryEntries