CompSci 308
Spring 2023
Advanced Software Design and Implementation

Team Project: SLogo

Logo is the name for a philosophy of education and a continually evolving family of programming languages that aid in its realization. — Harold Abelson

Submitting Your Work

Use GIT to push your team's implementation to the master branch of the provided, sharedslogo_teamNN repository hosted in the course's Gitlab group.

As your submission for this project, use GIT to addcommit, and push the following

Your code is expected to follow the course coding conventions and follow Javadoc conventions.

Your team's project GIT repository must show many, purposeful, commits from all team members rather than just one or two large "kitchen sink" commits and marathon merging or redesign sessions. Specifically, we will be looking for deliberate attempts to regularly:

We strongly suggest using the course's suggested GIT workflow for teams to manage this process.

Specifications

In teams, write a Java program from scratch using straight OpenJFX (without FXML), that provides an integrated development environment, IDE, for users to command a turtle to create drawings.

Implement a much simplified version of the original Logo programming language. "Simple Logo", or SLogo, differs slightly to make it easier to parse but retains the features most commonly used by novice programmers. Your program must be able to properly run these example programs that use this simplified syntax. Builtin SLogo commands will be written in Java code but all of its other information will be read from an eXtensible Markup Language, XML, formatted file (the exact tags of this configuration file should be decided by your team), such as:

While the exact User Interface for a SLogo IDE is up to your team to decide, it should help users experiment with and manage commands, building up complex programs from previously entered commands, and keep the turtle's visual representation appropriately updated. Specifically, it should also allow a user to:

Your program must be tested using JUnit (with assertions both for typical situations and possible thrown Exceptions) to verify it works as intended. Additionally, use TestFX to simulate common user "actions" and verify the UI responds appropriately (including changing languages and styles) using JUnit assertions. Generally, aim to create a test class for each of your concrete classes with at least two well-named tests for each non-trivial public method (more than two are expected for complex methods) and try to achieve at least 70% Line test coverage overall.

Deliverables

This project will be submitted in stages:

Design Specifications

The functionality features emphasize design goals, so your focus should be implementing them in such a way as to promote creating abstractions that generalize your core code, not simply as special cases added without a clear plan. Ideally, a well-designed program will make implementing new features easier so, when choosing a new feature to implement, look for something that fits into your design or refactor your code first to accommodate it. Specifically, your design should be thoughtful and intentional: clearly avoiding duplicate code structures and making it easy to add more simulations without changing the existing code.

Adding functionality not related to an abstraction or resulting in poor code that diminishes your overall design efforts will not be rewarded. Specifically, the credit you receive for a functionality feature will be in proportion to how clearly it shows that your core classes are closed to modification while open to extension using abstractions to remove dependencies on concrete classes. Thus, a program with fewer features, but plenty of clear paths to easy expansion, is worth more than a program with many features but lacking clean code and good abstractions.

In addition to following the course Code Design Habits Checklist, your project design should clearly show the your progress learning the topics we have discussed so far in the course:

Additionally, the overall program should still be clearly divided into several packages: some that are "public", consisting primarily of abstractions that are used by other packages, and the rest "private", consisting primarily of concrete subclasses that are not imported or known about directly by other packages.

CompSci Context

This project highlights the following interesting and foundational Computer Science concepts. You are not expected to write a general or complete version of any of these concepts, but learning about them may help provide a context to begin thinking about some design issues or connect your work in this course to the broader computing community.

As a dialect of Lisp, Logo is a powerful language for expressing programs. Although most of its complexity (and power) come from other elements than those that control the turtle, it is still amazing how expressive and compact it can be.

Individual Responsibilities when Working as a Team

This project requires steady, consistent, work — only by putting in consistent time each week will you see measurable progress and not have to pull "heroic" all-nighters.

Although this is a team project, everyone has individual responsibilities to the team that can be summed up as follows:

Unfortunately conflicts are likely to occur, so please let the Teaching Team know as soon as possible — even if it has happened just once or twice since it is better to deal with the situation early rather than having a disaster at the end when little can be done to get back on track.

Resources

Here is an in browser Logo environment (used to power this interactive programming workshop).

For background and more complete information about logo consult these links:

Videos