-
Notifications
You must be signed in to change notification settings - Fork 248
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
[CS2113-T15-4] Clanki #36
base: master
Are you sure you want to change the base?
Changes from 172 commits
f57dc6a
4f414df
ce98df6
e3392d6
4be87ab
76e7e22
46b2a6d
c424ff6
ff66f53
4abae40
1016b94
1bc91e2
7f76746
28a0d8f
9ddf52a
2c7a17d
7bea748
89e6bf8
184c16d
6e9693f
be7d316
917c263
1718e24
1442aac
3971e98
52e43cf
936a878
6625332
5ad6e32
48b6d83
178ec6a
40ef176
3cdea4d
58a5fdd
371e7a6
7397259
f81b835
2a390f1
cfefde2
95dd3ef
510d38d
e3d91a8
4f70717
75bdc0d
bc3a284
74717dd
e70d563
5b4d680
031c85e
cf7bedd
b900a0c
1b5bc89
ba6bb47
6156397
4352a08
4935709
ead5e34
2ded8a3
f711d4b
eeb1fda
23f46a6
d42e8d3
d2a2c94
3cdbfc1
17bd74c
6eed601
f41b5da
ff5a9ca
108670f
92f02b7
0682497
8c2e0a9
1992ca0
4f02bab
7cf48b8
cb437c5
c51c557
5e7f642
c06efc7
bc94509
3088158
cd1f068
912057e
8eb1798
f083109
7a8c683
3fe66fd
7b19e13
a4ef384
5ae846c
f6c848e
c516fed
68e17b9
13357d8
97c456f
2800fc9
ead8d0d
8227ea0
fb17c1c
4a23dc2
b001a2d
8fb4ee6
120206d
3af44d9
b8c9c66
482fcbb
8216aec
5d2e7ca
1e6ec2f
04d8752
e966c86
911231e
138c05a
30e31ad
e9da01d
686a791
78a1988
7ee819e
fc574d7
fccc1e4
227b6ce
821f1bc
eae0421
a429c8c
53a41a9
e068e4d
373cbfb
7813aba
bb7f305
1a9f86d
543770d
4aadf9d
c91b1cf
f14a2d3
753fcc4
1e10df6
b7a656e
bd591f7
4a7b9dd
d1ff26f
9c4f63d
a5a3955
1256f77
42c8a40
4352460
02c4a58
8d8e4fd
d272e25
0c0da07
a290aa3
794637c
79684a0
c78be53
51f2f60
1200345
c4d0682
885f279
5279276
25a73f3
06ed210
9d97a44
4129797
6088225
91e8902
c36f21f
a93a071
105da85
fd7b5f5
e41fd43
356f7f1
c96e4d3
197c766
26f0ead
185c3da
dd8b8c8
5a3500d
c29bff3
987f71b
ba99402
647ce66
c6d1eb0
218216f
0ee4be1
b44c505
ef081f3
839f53d
d554883
b1c6e6b
0f1d16e
d689041
24cad58
8db7480
e42ea85
b94fc13
b1a65bd
050bda0
ae011c9
e7329d0
36205e5
73c5f97
5a3808a
8c6d776
efbe6c8
39e9ea3
a9c2c60
7aef4c8
1c7f022
d136604
03ff90a
af1a92f
766ae45
394999f
aa2c680
fdf21f8
d72efc9
4182522
e646366
b904fbd
e4653e1
2eabdc3
9e9e84e
a8b73a5
e8fe942
5d13cf3
257c1be
6d2df8f
2b4c5dc
21520df
afe5b44
d52631f
3dc7c17
ad7e339
3057025
932672d
07def8e
4eb31d3
7f1666f
6ed549b
7f9b3d9
d12c27d
d3fa058
699673e
ca99a01
0daaae7
8c77e19
6db02bb
7b3e148
5886283
0592ad1
eb60c8e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,9 @@ | ||
# About us | ||
|
||
Display | Name | Github Profile | Portfolio | ||
--------|:----:|:--------------:|:---------: | ||
![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) | ||
![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) | ||
![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) | ||
![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) | ||
![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) | ||
| Display | Name | GitHub Profile | Portfolio | | ||
| :------------------------------------------------------------------------------------------ | :----------- | :---------------------------------------- | :------------------------------------ | | ||
| ![](https://avatars.githubusercontent.com/u/16986946?v=4&s=100) | Kong Dehao | [GitHub](https://github.com/kdh3799) | [Portfolio](docs/team/kongdehao.md) | | ||
| ![](https://avatars.githubusercontent.com/u/44609036?v=4&s=100) | Vu Van Dung | [GitHub](https://github.com/joulev) | [Portfolio](https://joulev.dev) | | ||
| ![](https://avatars.githubusercontent.com/u/88227764?v=4&s=100) | Song Zijin | [GitHub](https://github.com/SongZijin) | [Portfolio](docs/team/songzijin.md) | | ||
| ![](https://avatars.githubusercontent.com/u/72350236?v=4&s=100) | Moses Lee | [GitHub](https://github.com/moseslee9012) | [Portfolio](docs/team/moseslee.md) | | ||
| <img src="https://avatars.githubusercontent.com/u/88180884" width="100px" height="100px" /> | Javienne Yeo | [GitHub](https://github.com/javienneyeo) | [Portfolio](docs/team/javienneyeo.md) | |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,14 +2,266 @@ | |
|
||
## Acknowledgements | ||
|
||
{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} | ||
{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the | ||
original source as well} | ||
|
||
## Design & implementation | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you could include class diagrams for the various components showing the overall interactions and relationships between key components used in your application. |
||
|
||
{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps include a brief description of the design of the product. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps an architecture overview of the application would provide better insight to the project There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps it might be better to give a brief description for the project for future developers. |
||
|
||
### Add Flashcard Feature | ||
|
||
#### Current implementation | ||
|
||
The current add flashcard allows the user to add a flashcard to the list of flashcards, | ||
it is implemented through the following steps: | ||
|
||
Step 1: | ||
The input of user is collected by `getUserCommand()` inside class `Ui`. | ||
|
||
Step 2: | ||
The input string will be converted into a `Command` object by being passed through | ||
`parseCommand(String userInput)` inside `Parser`. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you could include what the Flashcard is for |
||
|
||
In this case, an `AddCommand` will be created and returned. | ||
|
||
Step 3: | ||
The `execute()` function of `AddCommand` will run, calling `addNewFlashcard(questionText, answerText)` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe you could explain what the code is executing (why is it adding a command) |
||
of class `FlashcardList` to create and add the new flashcard to the list. | ||
|
||
Then it will also call `printSuccessfulAddMessage(questionText, answerText)` of class `Ui` | ||
to display text indicating the successful adding function to the user. | ||
|
||
At this point, the adding process is completed and the program is ready to take another | ||
command. | ||
|
||
The following sequence diagram show how the add operation works: | ||
![AddFlashcard-0.png](umlDiagrams%2FAddFlashcard-0.png) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps use a dashed line for the return arrow There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps include an arrow to show the invocation of the Clanki class There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps remove the space between the 'Add Command' class There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would a dashed-line be more appropriate for the return arrows for the sequence diagram? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would a User "actor" be more fitting for sending the userInput to Clanki? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you could distinguish between arrows that return from method calls using dashed arrows. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you can illustrate that the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you could extend the activation bar for "UI" and "Add Command" all the way until the last call since you did not terminate it in between calls There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps the return arrows from method calls should be dashed instead of solid. |
||
|
||
#### Reason for current implementation | ||
|
||
Through using `AddCommand` class, which extends `Command` class it increases the level of | ||
abstraction as the code can now perform the various commands on a class level. | ||
|
||
Moreover, since the creating of new `Flashcard` of object and adding of the newly created | ||
flashcard are both done in the same class as where the flashcards are stored, this reduces | ||
coupling in the program as the `AddCommand` will not have access to the inner structure of | ||
`FlashcardList`, which stores the list of flashcards. | ||
|
||
#### Alternative implementation | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You might want to remove this section since it it extra information that does not explain the current functionality of your implemented design |
||
|
||
- Alternative 1: Have the add command function directly in `FlashcardList` | ||
- Pros: Easy to implement | ||
- Cons: Will require another function in another program to differentiate it from other | ||
commands | ||
- Alternative 2: Have the constructor of `Flashcard` include adding the card to list of flashcards | ||
- Pros: Simplifies code | ||
- Cons: Will cause trouble when temporary flashcard (that need not be stored) are | ||
created | ||
|
||
### Delete Flashcard Feature | ||
|
||
#### Current implementation | ||
|
||
The current delete flashcard allows the user to remove a flashcard from the list of flashcards, | ||
it is implemented through the following steps: | ||
|
||
Step 1: The input of user is collected by `getUserCommand()` inside class `Ui`. | ||
|
||
Step 2: The input string will be converted into a `Command` object by being passed through | ||
`parseCommand(String userInput)` inside `Parser`. | ||
|
||
In this case, a `DeleteCommnad` will be created and returned. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe there is a typo here, i think it should be DeleteCommand |
||
|
||
Step 3: The `execute()` function of `DeleteCommand` will run, creating a copy of the list of flashcards. | ||
Then `findFlashcards(flashcards, query)` is called to find the flashcards with questions matching the query, | ||
before calling `printFlashcardList(matchingFlashcards)` to display the found flashcards. | ||
|
||
User input is taken to get the index of the flashcard to be removed. `deleteFlashcard` is called from | ||
class `flashcardList` to remove the flashcard from the original list of flashcards. Finally | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
`printSuccessfulDelete` is called from class `Ui` to indicate a successful removal of the flashcard. | ||
|
||
The deletion process is now completed and the program will await another command. | ||
|
||
An overview of how the Delete operation works is shown with the following sequence diagram | ||
![DeleteFlashcard.png](umlDiagrams%2FDeleteFlashcard.png) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps call 'deactivate' on the Clanki class activation bar if it terminates. Else, indicate that this is a reference (small aspect of a larger sequence diagram). If not the sequence diagram might appear as incomplete. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you could extend the activation bar for "UI" and "Delete Command" all the way until the last call since you did not terminate it in between calls |
||
|
||
#### Reason for current implementation | ||
|
||
Through using `DeleteCommand` class, which extends `Command` class it increases the level of | ||
abstraction as the code can now perform the various commands on a class level. | ||
|
||
In order to minimise the time for users to search for the flashcard to delete, they are able | ||
to first search for a sub-list of flashcards with matching questions as the query. This method | ||
makes the deletion process simple even if the user does not remember the index of the flashcard. | ||
|
||
#### Alternative implementation | ||
|
||
- Alternative 1: Delete flashcard by index from the start | ||
- Pros: Easy to implement and simplifies code | ||
- Cons: Cumbersome to delete if user forgets the flashcard's index and has to search | ||
through the whole list of flashcards. | ||
|
||
### Update Flashcard Feature | ||
|
||
#### Current implementation | ||
|
||
The current update flashcard feature allows users search for a specific flashcard and update the contents of this | ||
flashcard. | ||
It is implemented through the following steps: | ||
|
||
Step 1: | ||
The input of user is collected by `getUserCommand()` inside class `Ui`. | ||
|
||
Step 2: | ||
The input string will be converted into a `Command` object by being passed through | ||
`parseCommand(String userInput)` inside `Parser`. | ||
|
||
In this case, an `UpdateCommand` will be created and returned. | ||
|
||
Step 3: | ||
The `execute()` function of `UpdateCommand` will run, creating an ArrayList of flashcards. Then | ||
`findFlashcard(flashcards, query)` is called to find flashcards that contain questions or answers that match `query`, | ||
after which it will call `printFlashCards(matchingFlashcards)` in `UpdateCommand` class to display the flashcards | ||
found. | ||
|
||
The index of the flashcard to be updated is taken from the user input, which is collected by `getUserCommand()`. | ||
`implementUpdate(flashcards, userText)` is then called to update the question or answer of the flashcard. Finally, | ||
`printFlashCard(flashcards.get(index))` will be called which prints the flashcard that was updated with its new content. | ||
|
||
At this point, the update flashcard process is completed and the program is read to take another command. | ||
|
||
An overview of how the Update command works is shown with the following sequence diagram | ||
![UpdateFlashcard.png](umlDiagrams%2FUpdateFlashcard.png) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It might be a fault on my end, but I currently do not see the linked diagram. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The diagram is not displaying on the page. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
|
||
#### Reason for current implementation | ||
|
||
Implementing the update flashcard in an `UpdateCommand` class makes it easier during the debugging process related to | ||
update flashcard feature alone as most of the methods and attributes are within this `UpdateCommand` class. | ||
|
||
#### Alternative implementation | ||
|
||
- Alternative 1: Instead of creating a new arrayList `matchingFlashcards` that store flashcards containing the | ||
`query` and then printing the list of flashcards, directly print the flashcards when there is a match with the query` | ||
- Pros: Easier to implement | ||
- Cons: Harder to track the total number of flashcards that has `query` and will need to have another way to track | ||
the index of the matching flashcards. it will also be more confusing as the index of the user input is not | ||
aligned with the index of the arrayList that contains all the flashcards | ||
|
||
### Parser | ||
|
||
#### Current implementation | ||
|
||
The parser mostly relies on the `ParsedInput` class, which can parse any user provided string input in the format of | ||
Windows command prompt commands (`command body /opt-key opt-value`). | ||
|
||
##### `ParsedInput` | ||
|
||
Initiated with a string `input`, it splits the input to sections that are of use. From there it splits each section | ||
further to a "title" (denoted with `=` below) and a "body" (denoted with `-` below) part. | ||
|
||
``` | ||
command blah blah /opt1 hello /opt2 world blah bleh | ||
| Part 1 | | Part 2 | | Part 3 | | ||
|=====| |-------| |==| |---| |==| |-------------| | ||
``` | ||
Comment on lines
+319
to
+323
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps your group can consider separating into the following components for clarity. |
||
|
||
Then these small subparts are grouped together to a format where the command part of the command, the body part and the | ||
options can be retrieved programmatically. | ||
|
||
The command and body can be read with `getCommand()` and `getBody()` respectively. `getCommand()` is guaranteed to be | ||
non-null. | ||
|
||
The options can be read with `getOptionByName(optionKeyName)`. The reason we don't have specific `getDate` | ||
or `getQuestion` command is because we don't know what the user will input and what options we will require for each | ||
command. So depending on the command, we retrieve the option accordingly with e.g. | ||
|
||
```java | ||
"command blah blah /opt1 hello /opt2 world blah bleh" | ||
getOptionByName("opt2") // -> "world blah bleh" | ||
getOptionByName("opt3") // -> null | ||
``` | ||
|
||
##### `Parser` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You could add a sequence diagram to explain how the parser works! |
||
|
||
This is now just a matter of wrapping `ParsedInput` with suitable error handling and logic such that each command will | ||
be used to initiated a corresponding command class (e.g. `AddCommand`), while errors are handled gracefully. | ||
|
||
#### Reason for current implementation | ||
|
||
We need an intuitive, safe and declarative way to parse the user input. Alternative implementations that can only parse | ||
specific commands with specific options are more imperative, less readable, less maintainable and overall just a pain to | ||
handle. That's why the two classes are here. | ||
|
||
#### Alternative implementation | ||
|
||
No. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps your team can consider putting "No alternative implementations" instead |
||
|
||
### Review Flashcard Feature | ||
|
||
#### Current implementation | ||
|
||
The current review flashcard allows the user to review all the flashcards that are due today or before, | ||
it is implemented through the following steps: | ||
|
||
Step 1: | ||
The input of user is collected by `getUserCommand()` inside class `Ui`. | ||
|
||
Step 2: | ||
The input string will be converted into a `Command` object by being passed through | ||
`parseCommand(String userInput)` inside `Paser`. | ||
|
||
In this case, an `ReviewCommand` will be created and returned. | ||
|
||
Step 3: | ||
The `execute()` function of `ReviewCommand` will run, calling `getFlashCards()` | ||
of class `FlashcardList` to get the list of the flashcards. | ||
|
||
Then it will iterate through the `FlashcardList` and call the function `isDueBeforeToday()` of class `Flashcard` to | ||
check if the flashcard is due by today. | ||
|
||
If the flashcard is due by today, `reviewCurrentFlashcard(Ui display, Flashcard flashcard)` of class `ReviewCommand` | ||
will be called to review the card. | ||
|
||
First, the `Ui` will display the question of the current card by calling the `getQuestion()` method of | ||
class `Flashcard`, and ask user if user is ready to view the answer. After user enters any keyboard input, the answer of | ||
the current card will be shown by calling the `getAnswer()` method of class `Flashcard`, and `Ui` will ask the user if | ||
he/she has got the card correct. If the user inputs "y", then the current `Flashcard` is considered to be | ||
cleared and `updateDueDateAfterCorrectAnswer()` of `Flashcard` will be called to update its `dueDate`. Then Clanki will | ||
let user review the next `Flashcard`. If the user inputs "n", then the card is considered to be not cleared | ||
and `updateDueDateAfterIncorrectAnswer()` will be called to update its `dueDate`. Then Clanki will let user review the | ||
next `Flashcard`. This process will repeat until all the `Flashcards` in the `FlashcardList` are iterated. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps your group can consider breaking it down into smaller steps. E.g 3.1, 3.2, 3.3 ... |
||
|
||
After the whole `FlashcardList` has been iterated through, a message congratulating the user that he/she has completed | ||
the reviewing task will be displayed. | ||
|
||
At this point, the reviewing process is completed and the program is ready to take another command. | ||
|
||
The following sequence diagram show how the review operation work: | ||
![ReviewFlashcard-0.png](umlDiagrams%2FReviewFlashcard-1.png) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The diagram might be too complex. You can try to simplify it by splitting into a few diagrams. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
|
||
#### Reason for current implementation | ||
|
||
Through using `ReivewCommand` class, which extends `Command` class it increases the level of | ||
abstraction as the code can now perform the various commands on a class level. | ||
|
||
Moreover, `ReviewCommand` only has access to the public methods of `FlashcardList` and `Flashcard`, this reduces | ||
coupling in the program as the `ReviewCommand` will not have access to the inner structure of | ||
`FlashcardList` and `Flashcard`. | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You can consider adding a class diagram, at the start of the DG or otherwise, to show the overview of what is happening, to supplement the reader's understanding |
||
#### Alternative implementation | ||
|
||
- Alternative 1: Have the review command function directly in `FlashcardList` | ||
- Pros: Easy to implement | ||
- Cons: Will require another function in another program to differentiate it from other | ||
commands | ||
- Alternative 2: After entering the `ReviewCommand`, go back to `Clanki.run()` and take further commands for review | ||
process | ||
- Pros: Simplifies code in `ReviewCommand` | ||
- Cons: Will have to pass around a lot of parameters and variables | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For some reason, this part is not reflected on github pages for me. Your group can check if this part is showing correctly. |
||
|
||
## Product scope | ||
|
||
### Target user profile | ||
|
||
{Describe the target user profile} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps a brief overview of the target user can be added. |
||
|
@@ -20,18 +272,18 @@ | |
|
||
## User Stories | ||
|
||
|Version| As a ... | I want to ... | So that I can ...| | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you should add more user stories to better illustrate the purpose of the app and justify the various features |
||
|--------|----------|---------------|------------------| | ||
|v1.0|new user|see usage instructions|refer to them when I forget how to use the application| | ||
|v2.0|user|find a to-do item by name|locate a to-do without having to go through the entire list| | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you could elaborate more on the user stories so that the rest can better understand the motivations of this application and how it caters to the target users. |
||
| Version | As a ... | I want to ... | So that I can ... | | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. you could add more user stories to better explain why you are making this product |
||
|---------|----------|---------------------------|-------------------------------------------------------------| | ||
| v1.0 | new user | see usage instructions | refer to them when I forget how to use the application | | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you could provide more compelling user stories to explain the functionality of the product |
||
| v2.0 | user | find a to-do item by name | locate a to-do without having to go through the entire list | | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You can consider separating each command to be each user story, that way it will motivate the use of your commands. |
||
## Non-Functional Requirements | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you could elaborate on the non-functional requirements that your group is trying to achieve in your application, which may be linked to your user stories. |
||
|
||
{Give non-functional requirements} | ||
|
||
## Glossary | ||
|
||
* *glossary item* - Definition | ||
- _glossary item_ - Definition | ||
|
||
## Instructions for manual testing | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps provide some instructions for manual testing There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps you could elaborate more on how various testing is performed in your application, such as unit testing, integration testing, system testing, etc. |
||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps you could include the overall architecture of the application so that first-time developers would be able to have a clearer picture of your application without having to trace through the source code.
See example