From b7262054b2cacc3154914cd11d97b1898b933617 Mon Sep 17 00:00:00 2001 From: solomonng2001 Date: Thu, 28 Mar 2024 12:57:55 +0800 Subject: [PATCH] Add explanation on extensions to add and edit command Lack of explanation to how add and edit command works, and birthday and priority features. Updating the developer guide will make future understanding easier. Let's * Add PUML object and sequence diagrams for add command. * Add brief explanation on how add and edit commands and command parsers work. * Add explanation of birthday class. * Add explanation of priority class and priority value enum. --- docs/DeveloperGuide.md | 43 +++++++++++++++ docs/diagrams/AddPersonObjectDiagram.puml | 23 ++++++++ docs/diagrams/AddPersonSequenceDiagram.puml | 60 +++++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 docs/diagrams/AddPersonObjectDiagram.puml create mode 100644 docs/diagrams/AddPersonSequenceDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d6673171639..4cb34d39522 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -184,6 +184,49 @@ The following object diagram illustrates the above: The following sequence diagram shows the addpolicy operation: +### Enhancements to add command end edit command: Add birthday, edit birthday, add priority, edit priority features + +The add birthday and edit birthday features allow users to add and edit the birthday of a client. Birthdays support the birthday reminders feature. The birthday is stored in the `Birthday` class, which contains the birthday details such as day, month, and year. The `Birthday` class is part of the `Person` object in the `Model` component. + +The add priority and edit priority features allow users to add and edit the priority of a client. Priority supports the sort by priority feature, and helps optimise client management. The priority is stored in the `Priority` class, which contains the priority details such as priority value. The priority value are enumerated, and can be one of the following: LOW, MEDIUM, HIGH, VIP. The `Priority` class is part of the `Person` object in the `Model` component. + +#### Implementation + +The functionality to add and edit birthday and priority is implemented in the `AddCommand` and `EditCommand` classes. The `AddCommandParser` and `EditCommandParser` classes are responsible for parsing the user input and creating an `AddCommand` or `EditCommand` object respectively. + +The `AddCommandParser` and `EditCommandParser` classes parse the input arguments by storing the prefixes of their respective values in a `ArgumentMultimap` object, and create a new `AddCommand` or `EditCommand` object with the parsed birthday or priority, amongst other fields. + +The `AddCommand` and `EditCommand` objects then communicate with the `Model` component to add or edit the birthday or priority of the client. The `Model` component then updates the `Person` object with the new birthday or priority, amongst other fields. + +The `AddCommand` object then communicates with the `Model` component to add a person. +- `Model#addPerson(Person)` - Adds the new client to the existing client list. +- `Model#setDisplayClient(Person)` - Updates the displayed client in the UI to the client that has been added. + +The following object diagram illustrates the above: + + +The following sequence diagram shows the addpolicy operation: + + +More on birthday class +* Birthday is immutable and stores the day, month and year as a `LocalDate` object, as time is not relevant for birthday. +* The message constraints for birthday utilise the `DateUtil` common class to ensure that the date is valid and in the correct format. +* `DateUtil` class is used to validate (conforms to `DateUtil` date format and is parsable) and parse the string to a `LocalDate` object. `DateUtil` is also used to ensure that the date is in the past. +* Refer to the `DateUtil` class for more information on the date format and parsing. + +More on priority class +* Priority is immutable and stores the priority value as a `PriorityValue` object, which is an enumerated type, to ensure that priority value is a valid type. +* The message constraints for priority utilise the `PriorityValue` enum class which should be responsible for the `toString()` logic for display. +* `PriorityValue` enum class is used to validate the priority value, which is responsible for the possible valid priority values. +* Refer to the `PriorityValue` enum class for more information on the priority values. + +More on priority value enum class +* `PriorityValue` is an enumerated type that contains the possible valid priority values: LOW, MEDIUM, HIGH, VIP. +* When parsing from a string and displaying as a string, the `PriorityValue` allows full form values (`low`, `medium`, `high`, `vip`) and short form values (`l`, `m`, `h`, `v`) to be used interchangeably. +* Parsing from a string to a `PriorityValue` object is case-insensitive, and is handled by `getPriority`. +* Obtaining the all available full form and short form of the `PriorityValue` object is handled by `getFullPriorities()` and `getShortPriorities()` respectively. +* The mapping of the full form strings and short form strings to the enum values is handled through `HashMap FULL_PRIORITY_MAP` and `HashMap SHORT_PRIORITY_MAP`, which has a constant time complexity. + ### \[Proposed\] Undo/redo feature #### Proposed Implementation diff --git a/docs/diagrams/AddPersonObjectDiagram.puml b/docs/diagrams/AddPersonObjectDiagram.puml new file mode 100644 index 00000000000..3c3eb8402c0 --- /dev/null +++ b/docs/diagrams/AddPersonObjectDiagram.puml @@ -0,0 +1,23 @@ +@startuml +!include style.puml +skinparam objectFontColor white + +object ":AddCommand" as AddCommand LOGIC_COLOR +object ":AddCommandParser" as AddCommandParser LOGIC_COLOR +object ":AddressBookParser" as AddressBookParser LOGIC_COLOR +object ":Model" as Model MODEL_COLOR +object ":CommandResult" as CommandResult LOGIC_COLOR +object "toAdd:Person" as Person LOGIC_COLOR +object ":ArgumentMultimap" as ArgumentMultimap LOGIC_COLOR +object ":ParserUtil" as ParserUtil LOGIC_COLOR + +AddressBookParser --> AddCommandParser : calls +AddressBookParser --> AddCommand +AddCommandParser -> AddCommand +AddCommandParser --> ArgumentMultimap : instantiates +ParserUtil --> ArgumentMultimap : parses +AddCommand --> Person +AddCommand --> Model +AddCommand -right-> CommandResult : outputs +Model --> Person : Adds +@enduml diff --git a/docs/diagrams/AddPersonSequenceDiagram.puml b/docs/diagrams/AddPersonSequenceDiagram.puml new file mode 100644 index 00000000000..66d50ca8db2 --- /dev/null +++ b/docs/diagrams/AddPersonSequenceDiagram.puml @@ -0,0 +1,60 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant "a:AddCommand" as AddCommand LOGIC_COLOR +participant ":CommandResult" as CommandResult LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +end box +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand(...) +activate AddressBookParser + +create AddCommand +AddressBookParser -> AddCommand : AddCommand(...) +activate AddCommand + +AddCommand --> AddressBookParser +deactivate AddCommand + +AddressBookParser --> LogicManager : a +deactivate AddressBookParser + +LogicManager -> AddCommand : execute() +activate AddCommand + +AddCommand -> Model : addPerson(toAdd) +activate Model + +Model --> AddCommand +deactivate Model + +AddCommand -> Model : setDisplayClient(toAdd) +activate Model + +Model --> AddCommand +deactivate Model + +create CommandResult +AddCommand --> CommandResult +activate CommandResult + +CommandResult --> AddCommand +deactivate CommandResult + +AddCommand --> LogicManager : result +deactivate AddCommand +AddCommand -[hidden]-> LogicManager : result +destroy AddCommand + +[<--LogicManager +deactivate LogicManager +@enduml