Bharath's Project Portfolio Page
Project: DonnaFin.io
DonnaFin.io is a desktop address book application used by financial advisors to keep track of their client information and related tasks. This is a Java program with about 10 kloc with a JavaFX GUI. The ‘.io’ in our name is a reflection of our belief that you deserve a faster workflow for input and output. If you can type fast, you can use our CLI-like commands to manage and view your notes, upcoming meetings and todo lists much faster than your typical customer relationship manager apps.
Given below are my contributions to the project.
- Support passing instructions to
Ui
fromCommands
- Uses functional programming to hand a callback from the result of command execution (
CommandResult.uiAction : Consumer<Ui>
) that can perform the necessary side effect inUi
- Our application’s front end is getting steadily more complex and our commands need to be able to execute actual functions on
Ui
. However, other solutions would require global variables or drilling down a reference toUi
intoCommand
. A simpler and cleaner workaround was to use functions as a first class object to instructUi
on the appropriate actions (show help / exit / show client view, etc) - Created when it was necessary to implement the
ClientView
mode in UI (Showing a single client’s information in a dedicated view for the user to edit and interact with). #67
- Uses functional programming to hand a callback from the result of command execution (
- Allow user to edit information directly in the Client View
- The user must be able to cycle through the different attributes (presented in a row format), and edit as necessary.
- As this is a critical part of our functionality, we need this to be intuitive and easy to use.
- Using
EventHandler
s to great effect within text fields to support highlighting outer parent elements.
- Add
SwitchTabCommand
that allows for CLI navigation through the different tabs. #148- User must easily be able to cycle through contact information, policy table, asset table etc
- Needs to be a simple and easy to use command in the command bar.
- Create a generic class to create tables for Client View tabs on Polices, Assets, Liabilities to support future extension. #125, #154, #156, #195, #250, #268, #361, #190
- Create a JavaFX component that can create a fully functional and rich table for any data class.
- Made the entire front end for the yet-to-be-completed
Policy
,Asset
andLiability
classes as they all share a similar format of being represented in a table. - Makes good use of software engineering principles:
- Open-Closed Principle: Open for configuring and extension but closed to modification. All instances of
AttributeTable
is configured byTableConfig
andColumnConfig
andAggregator
to accept any manner of data classes. - Encapsulate and support creation of configuration data class in a manner similar to many open source modules (e.g. JavaScript modules like axios);
- Open-Closed Principle: Open for configuring and extension but closed to modification. All instances of
- Add a bare bones automated GUI testing with TestFX to ensure the class can be loaded, with a proper
Attribute
stub that can be used to populate values
- Re-organise application architecture by separating
Storage
andLogic
#18, #17- Improves overall architecture by decoupling
Storage
andLogic
ensuring allStorage
calls go throughModel
layer to follow the layered architecture style. (See: O’ Reilly Chapter 1. Layered Architecture) - The layered architecture design pattern was chosen over the current Model-View-Controller architecture in a previous team meeting to reduce complexity, simplify working on components and improve testability.
- Improves overall architecture by decoupling
- Support
Policy
,Asset
, andLiability
with monetary values with aMoney
class. #182, #141- Create a class that keeps track of monetary values, support arithmetic and can be converted to a valid ‘$’ formatted string.
- Update the attributes that require it to support these fields
- Highlights
- Add automated GUI tests for DonnaFin
- Automated checks can be run on Gradle builds Github CI/CD to confirm validity of
.fxml
files and GUI logic. - Prevents unusable GUI changes from being added to the codebase.
- Required spending a significant amount of time learning and understanding Java GUI testing with TestFx, adapting boilerplate and common functions from SE-EDU AB4. At all steps, this needed to support the new file structure and dependencies. #132, #134, #352, #353
- Adapted from the SE-EDU: Address Book 4 codebase
- Automated checks can be run on Gradle builds Github CI/CD to confirm validity of
- Code contributed: RepoSense link
- Project management:
-
Enhancements to existing features:
- Improve UI for user.
- Enable responsive resizing of
AttributePanel
when window size changes inClientView
#99 - Show the user a focus indicator when the tabs are being selected in
ClientView
#101 - Have the ‘button-like’ tab buttons trigger the ‘switch tab’ command (e.g. clicking ‘Policies’ tab should be same as typing
tab p
) #148 - Fix weird and obscure JavaFX lab with use of asynchronous programming #166
- Enable responsive resizing of
- Add additional tests
- Additional changes that help developers
- Squash numerous bugs (e.g #250, #293)
- Improve UI for user.
- Documentation:
- User Guide:
- Developer Guide:
- Storage - Logic link updates: Sequence diagrams, Class Diagrams, #21
PersonAdapter
,Person
, Architecture Sequence Diagram, cleanup #103- Update UML class for v1.2b - v1.3 #165
- New sequence diagrams for
SwitchTabCommand
#170 - Minor changes #191, #192
- Explain
commons
package and uses for such classes (wrt to good SE practices) #360, - Update matters of CI & Testing #351
- Community:
- Explaining why I think Java’s Stream implementation makes using multiple Scanners very bug-prone (#78)
- Clarifying the difference between
Platform.exit()
andSystem.exit
in JavaFX (#174) - Optimising CI tasks to run only on Linux where helpful (#200)
- Reminding people of checkstyle gaps (#169)
- Offering a tip for people who like to make many commits (#139)
- Provided constructive feedback to PRs in my team repo:
- Tools:
- Used Figma to wireframe the user pathway to ‘single client view’.
- Automatically trim trailing spaces with a Github action #111