CompSci 308
Spring 2023
Advanced Software Design and Implementation

OOGASalad : Design Plan

You can scarcely compress the time it takes to do good design. The best you can do is arrange the process so that progress is conspicuous and the partially-completed result has its own intrinsic value. — Dorian Taylor

This part is intended for your team to agree on the project's organization, priorities, and the primary APIs and frameworks that will drive your design. Develop your ideas in enough detail to convincingly describe your APIs (primary public classes and their public/protected methods) that will work together to provide the project's functionality, without committing to actual implementation details.

It also helps to help make sure everyone on the team starts with a similar understanding.

If you are having trouble thinking of how to design games flexibly, try playing either the card game Fluxx or the video game Baba is You, both of which allow the player to dynamically change the rules and goals during the game.

Submitting your Work

Individually, each student must acknowledge their intent to participate in this team project by "signing" their team's specific Team Contract.

Use GIT to push your team's plan to the master branch of the provided, shared, oogasalad_TEAM repository hosted in the course's Gitlab group as your team's submission of this part of the project, using the

No running code is required for this submission (just examples).

Specification

Create a folder within the doc folder, called plan, that contains the following files associated with your initial design plan:

This plan is not intended to be completely binding, but significant changes will be penalized. This is not meant to over-stress this process or squash your later creativity, just to note that if you end up throwing out the plan completely, then it is not clear you thought about the project in enough detail to make basic critical choices. Any changes to this plan should be addressed in your final DESIGN document (adding descriptive comments while you write the code for it can be helpful for remembering your thought process and other details about the change so you can explain it later).

Frameworks

In everything, focus on how to build a variety of games in your genre. Explain the key features in your game genre, how you will support those features, and how you expect new games to be written (i.e., what needs to be sub-classed, what accepts Lambdas, what is configured by files, and how communication will occur between the Authoring Environment, Engine, Data, and Player).

Some of your APIs will likely be organized as frameworks, i.e., code that provides the control flow into which future developers (teammates) must fit their code based on provided extension, or plugin, points (i.e., compare the OpenJFX framework to Java's Collection classes). Thus it is vital that you describe these extension points in English with examples beyond simply listing classes and methods you expect to implement. For example, there are many ways to think about a game (such as a series of events, different states, all possible collisions, levels of rules, smart actors, plans, etc) and your choices could impact everything, up to and including the GUI presented to a game designer.

Ultimately, you goal should be to explain how to use your APIs (and frameworks) to actually construct specific games.

API Design Overview

An Application Programming Interface, API, is simply all of the program's public classes and methods. Thinking about the public methods together as an interface to your program or service to other innovative programmers has the power to change how you perceive those methods from just something necessary to make the program functional to providing a service to other programmers (even those on your own team!). An API, then, essentially becomes a contract and developers, now clients, are enticed to use the API because they know they can rely on that contract (even if the underlying implementation changes). Thus, many see API design as the most critical part of designing a program, because it affects the design of other components dependent on them.

Although the concept is inherently subjective, most developers seem to agree that APIs should have the following characteristics and need to be revised before getting them right:

Writing both English and Java descriptions of how to solve a concrete task using your API can be very helpful to validate the desirable characteristics above from different perspectives:

Describe and justify your reasoning for the design of each in the following sections:

Note, because your code examples should compile, you will likely want to write them in the src folder, then copy (or move) them into the doc/plan/api or doc/plan/usecases folder when you are satisfied they are complete.

Resources