| CompSci 308 Spring 2026 |
Advanced Software Design and Implementation |
First make the change easy (warning: this might be hard), then make the easy change. — Kent Beck
This part is intended to emphasize the project Design Specification by introducing new features that challenge assumptions you may have made to expand:
While you are welcome to use GIT tags anytime during your project to annotate an important commit, you must tag the commit your team feels is the finished version for this deliverable as Change.
This is your last chance to demonstrate that you have learned to write thoughtful code that clearly shows your design intentions in this project, following:
This is your last chance to demonstrate you are developing software using a professional process by
main branch (i.e., code that has gone through multiple drafts)Everyone should help get the team's priorities done — even if it means sacrificing your own part's extra features.
Build on your General version to add these variations in a thoughtful manner that clearly shows the intentions of your design goals and avoids duplicate code structures. The best strategy is to make your APIs closed to modification while open to extension by depending mostly on abstractions that hide the implementation details. Simply adding extra functionality by substantially changing your APIs, not related to an abstraction or adding poor code that exposes implementation details, adds special case conditionals, hardcodes values, or otherwise diminishes the rest of your design efforts will not be rewarded.
Refactor and implement as much variety as you can to clearly demonstrate your design supports further such extensions. If you are not able to implement a variation, you must still be able to justify that your overall design handles adding it in an intentionally well designed manner in your DESIGN document.
The full list of new functional requirements is given here. There are also additional design requirements.
Develop intentional APIs, the public classes and their public methods, for the backend (Simulation and Configuration packages) as a service to the View client and support for future changes. While an external API for the View is not required, you can certainly create an "internal" API that goes beyond basic implement ion and looks for places to create abstractions to support "internal" extension points for flexibility.
All public API classes and methods should have complete Javadoc comments, especially interfaces and abstract classes to show their intended use. You should be able to justify every public method's value to the API's Design Goals and Contracts.
Describe the design goal of each package's API in a file named package-info.java.
All programming languages have some kind of logging library, that make it just as easy, because logging is preferable to printing, letting you:
It is fine for debugging messages to continue to go to the console (standard out), but ERROR and FATAL level messages must be saved to a file in the log folder.
Use Log4j2 to output different levels of information rather than println() statements, including any time an Exception is thrown.
Continue to test your View using TestFX to simulate common user "actions" and common JUnit assertions to verify the UI responds appropriately (including changing languages, styles, and appropriate response to thrown Exceptions). Still look for ways to test your View classes or otherwise group your tests around similar actions. These tests take longer to run, so run them individually as much as possible.
Aim for about 50% Line test coverage of the class it is testing.
To demonstrate that you are following good testing process, aim to include new or updated tests with each Merge Request to main that adds new features or fixes bugs.
In addition to organizing your code according to the Submission Guidelines and documenting your code, complete your README file — especially documenting your assumptions about the functional requirements and attributions for any images or resources you used.
The DESIGN document will be completed as part of the after project Analysis.
As a reminder, describe each potential error checked for to prevent your program from crashing and how they are handled.