At least two classes: A data object class and a class with a selection of reusable utility methods for your application to use. They should be named appropriately for the application.
One of the above-mentioned classes should be a Data Object class (i.e. a class in charge of storing data for transport between classes). DO NOT use arrays and/or dictionaries to do this.
The other class(es) is the "library" or "reusable class"
Should have at least 3 utility functions (even if only two are used by the project). These functions could perform calculations or otherwise organize the data inputted.
One utility function needs to use more than one data object instance's data.
This library class should be FULLY encapsulated. This means using access modifiers (the underscores in front of variable names) to make and getters and setters in all the right places. NO attributes should be public and directly accessible by the MainHandler.
Here's an example:
A grade average calculator: The user enters in the names, grades and id numbers for a set of 5 students. After the user submits the information, the information is displayed including an average grade for the class, median grade for the class and it highlights the highest achieving student using CSS.