CS330 Outline

Fall 2023

1 Course Overview 08/26/2023 - 08/29/2023

Overview

This module introduces you to the course organization, policies, and mechanics. We will review the structure of the course website.

We will take a brief look at the major themes and areas of emphasis that we will cover this semester. We will discuss (briefly) the basics of Python 3 with particular emphasis on how PEP 8 and PEP 20 apply to Object Oriented Programming Languages (e.g., C++, Python, Java, and Rust.

Objectives

At the conclusion of this Orientation Module students will be able to:

  1. Explain the Syllabus.
  2. Explain the importance of Office Hours.
  3. Discuss why C++, Java, Python, and Rust will be covered.
  4. Discuss the S.O. in S.O.L.I.D.
  5. Connect to the CS VPN.
  6. Log in to the CS Linux servers.
  7. Use buildfiles (make and/or Gradle).
  8. Checkout the course example set GitHub Repository
  9. Create a project in their preferred IDE: Eclipse, VSCode, or Vim (with appropriate plugins).
  10. Compile code with a provided buildfile.

  1. Read the syllabus.
  2. Read the communications policy
  3. Watch the orientation session
  4. “Meet and Greet” Forum (optional, in Canvas)
  5. Read over The Beginning

Office Hours

  1. Review the office hours overview
  2. Complete the office hours survey

Selected CS 252 Review Readings

  1. Connecting to the CS VPN & Using SSH
  2. Basic Linux Commands & Navigation
  3. File Permissions (chmod)
  4. File Transfer
  5. SSH Keys
  6. Git

Looking Forward a Few Weeks…

  1. Language Resources
  2. Conceptual Questions - Simple Classes & ADTs
  3. Using the C++ Class Checklist
  4. Code Documentation & Comments

Getting Started

  1. Review - Head to Head Testing
  2. Review - Makefiles & Command Line Arguments
  3. Prepare (for the next module) Clone the CS 330 GitHub Repo

2 ADTs in C++ 08/30/2023 - 09/10/2023

Overview

This module covers the notion of ADTs from a design perspective. We motivate the notion of ADTs as a design principle, and move towards ADTs as a contract.

The latter part of this module discusses the implementation of ADTs using C++ classes. This includes mechanics (e.g., Constructors and Destructors) and best practices (in the form of a checklist).

Objectives

At the end of this module students will be able to:

  1. Create a project in their preferred IDE (not Dev-C++).
  2. Compile code with a provided makefile.
  3. Discuss what belongs in a header (.h) file.
  4. Discuss what belongs in an implementation (.cpp, .cxx, or .cc) file.
  5. Describe the purpose of inline functions/methods.
  6. Explain Resource Allocation is Initialization (RAII).
  7. Describe the use of an inner class in the context of abstraction and encapsulation.
  8. Summarize the justification for a formal class checklist.
  9. Describe the emergent property of a class checklist regardless of selected OOP Language.
  10. Summarize the justification for a formal class checklist.
  11. Describe the emergent nature of a class checklist.

Review of the Fundamentals

  1. Implementing ADTs in C++ Classes
  2. Designing for ADTs
  3. Booch, chapter 1 & chapter 2, up to “The Meaning of Hierarchy”
  4. ADTs
  5. Review - Operator Overloading
  6. Examine Review 01 - Linked Lists Examples 1 & 2 (Part 1)

The Fun Part!

  1. Examine Review 01 - Linked Lists Example 3 (Part 2)
  2. Constructors and the Rule of the Big 3
  3. A C++ Class Designer's Checklist
  4. Examine Review 01 - Linked Lists Example 4 (Part 3)

Putting the Fun to Use!

  1. Using the C++ Class Checklist
  2. C++ ADTs Due: 09/15/2023

Future Work

  1. Briefly Examine Review 01 - Linked Lists Examples 5 & 6 (Part 4)

3 Working With Iterators: ADT Case Study 09/12/2023 - 09/26/2023

Overview

This module covers the use of C++ iterators including using pointers, vector::iterators, and custom iterators. This includes definition of custom ADTs that provide iterators and analysis of the required interfaces.

Objectives

At the end of this module students will be able to:

  1. Replace data structure specific code (e.g., arrays and linked lists) with iterator and container abstractions.
  2. Describe how to leverage C++ templates to reduce repeated code, when implementing read-only (const) and read-and-write (non-const) iterators.
  3. Describe the motivation behind Move Constructors, Move Assignment, and move semantics.
  4. Analyze the parallels between C++ iterators and Rust iterators.
  5. Explain (and justify) the motivation for UML Class diagrams.

  1. Examine Review 02 - Well Defined Interfaces - Part 1 (Examples 1 & 2)
  2. Examine Review 02 - Well Defined Interfaces - Part 2 (Examples 3 to 5)
  3. Examine Review 02 - Well Defined Interfaces (Examples 7 & 8)
  4. Review Assignment 1
  5. Loops & Iterators
  6. C++ Iterators Due: 09/29/2023

The Fun Examples!

  1. Examine Review 03 - Part 1 - Examples 1 to 2
  2. Examine Review 03 - Part 2 - Examples 3 to 5
  3. Examine Review 03 - Part 3 - Example 6

The Fun Examples… in Other Languages!

  1. Examine Review 03 - Java
  2. Examine Review 03 - Python
  3. Examine Review 03 - Rust

4 (Pseudo-Module) Quarter Semester (Term) Review 09/27/2023 - 10/01/2023

Overview

This module serves as an opportunity to review all materials, topics, and concepts covered thus, before design and testing.

Objectives

This module’s objectives are the set union of all previously listed module objectives.


  1. Conceptual Questions - Simple Classes & ADTs
  2. Using the C++ Class Checklist
  3. Where Are We Now? - Quarter Semester
  4. Iterators - The Journey So Far

5 Design Discussions (OOA&D) & Case Studies 10/02/2023 - 10/04/2023

Overview

This module starts with the C++ class checklist and an analysis of its analogues in Java and Python 3. Review 03 (specifically, Example 6) is revisited in the context of UML Class Diagrams.

This module revisits and formalizes the initial and intermediary stages of designing an Object Oriented System. This process starts with Class Discovery and Documentation, then concludes with UML class diagrams.

Three partial Tic-Tac-Toe implementations are used as case studies: one in C++, one in Java, and one in Python 3. Unit Testing is discussed, briefly, in the context of interface design and completeness.

Objectives

After completing this module students will be able to:

  1. Dissect the class checklist in the context of interface completeness.
  2. Formulate class checklists for Java and Python 3–in general any language.
  3. Construct UML Class Diagrams to analyze existing code.
  4. Leverage UML Class Diagrams to investigate and model a problem domain.
  5. Explain and track data lifetimes.
  6. Explain ownership.

Design So Far…

  1. Iterators - The Journey So Far
  2. Language Specific Class Checklists

PlantUML

  1. Whirlwind Introduction to UML Class Diagrams
  2. Language Checklists & UML Class Diagrams

Formalizing UML Class Diagram Syntax

  1. UML Class Relationship Diagrams
  2. PlantUML Class Diagrams

Non-scaling Design

  1. Watch Review 4.2: Design the CS 250 Way

A Better Way (Classification & Relationships)

  1. Watch Proper Object-Oriented Design
  2. Tic-tac-toe… Designed Properly
  3. Discovering and Documenting Classes
  4. Example: Starting a Domain Model
  5. Example: Class Relationship Diagrams (Domain Model)

Unit Testing & Process (And Workflows)

  1. Watch Testing Part 1 - C++ & Java
  2. Watch Testing Part 2 - Python
  3. Workflows
  4. Software Development Processes

6 OOA&D: Use Cases 10/05/2023 - 10/06/2023

Overview

This module continues the discussion of design and UML. This includes modeling scenarios (partially and fully) through use cases, interaction diagrams, and sequence diagrams.

We will revisit and refine our Tic-Tac-Toe design.

Objectives

After completing this module students will be able to:

  1. Utilize UML Sequence Diagrams to model the logic of existing object-oriented code.
  2. Construct UML Class Diagrams.
  3. Validate UML Class Diagrams through use of UML Sequence Diagrams.
  4. Leverage UML Class Diagrams to investigate and model a problem domain.
  5. Leverage UML Sequence Diagrams to investigate and model a problem domain.

  1. Watch Continuing Our Tic-Tac-Toe Design
  2. Continuing Our Tic-Tac-Toe Design
  3. Use Cases
  4. Interaction Diagrams
  5. Example: Further Elaboration on Automated Assessments

7 (Pseudo-Module) Midterm (i.e., Midsemester) Review 10/07/2023 - 10/12/2023

Overview

Note: the use of Midterm in this module refers to the point in the semester, not the Midterm Exam.

This module serves as an opportunity to review all materials, topics, and concepts covered thus, before moving on to inheritance, Java and Python.

Objectives

This module’s objectives are the set union of all previously listed module objectives.


  1. Review - Head to Head Testing
  2. Review - Types of Tests
  3. Review - Makefiles & Command Line Arguments
  4. Review Assignment 2
  5. Conceptual Questions - Simple Classes & ADTs
  6. Using the C++ Class Checklist
  7. Midsemester Review
  8. A Quick Sequence Diagram Review

8 Pointers & Sharing & Memory Management 10/13/2023 - 10/17/2023

Overview

This module covers pointers and common memory management misteps, concerns and considerations.

This module covers garbage collection and the associated challenges that must be considered when working with dynamic memory.

Objectives

After completing this module students will be able to:

  1. Explain what a pointer stores.
  2. Explain the difference between a pointer and a reference variable.
  3. Analyze memory deallocation pitfulls.
  4. Explain and track data lifetimes.
  5. Explain why memory management can be a non-trivial problem.
  6. Summarize the motivation behind smart pointers.
  7. Explain ownership.
  8. Summarize garbage collection.

Relevance

All programmers must be familiar with the issues surrounding memory management. This includes lanagues that allow low-level memory allocation (e.g., C/C++), garbage collected languages (e.g., Java and Python).

The Rust language is a bit of a special case. Time permitting Rust may be used as a brief case study.


  1. Watch Pointer Mechanics Review
  2. Pointers & Smart Pointers
  3. Sharing Pointers and Garbage Collection
  4. OOP in C++: (Part 1) Due: 10/18/2023

9 Object Oriented Programming (OOP) 10/18/2023 - 10/30/2023

Overview

This module discusses the notion of Inheritance in OOP. This includes an exploration subtyping as it relates to inheritance. We introduce the mechanic of function overriding, an mechanic analogous to function overloading.

The application of dynamic binding and the associated mechanics (e.g., virtual functions and pure virtual functions) are a focal point. Once we discuss these mechanics in C++, the transition to other languages (e.g., Java, Python or Rust) are purely mechanical.

This module includes two case studies: the Spreadsheet Example and the Shapes Example.

Objectives

After completing this module students will be able to:

  1. Explain the necessity of pointers for dynamic binding.
  2. Explain the necessity of references for dynamic binding.
  3. Implement the Big-3 (or Big-5) alongside an inheritance hierarchy.
  4. Summarize the difference between overloading and overriding.
  5. Summarize the difference between inheritance and subtyping.
  6. Use raw pointers to allow dynamic binding.
  7. Use C++14/C++17/C++20 smart pointers pointers to allow dynamic binding.
  8. Use reference variables to allow dynamic binding.
  9. Explain when = default and = delete can be used.
  10. Discuss the Observer-Observable Pattern.
  11. Discuss the Factory Model.
  12. (Time permitting) Discuss the Builder Pattern.

Inheritance

  1. Watch C++ Shapes: Part 1 (Example 1)
  2. Inheritance: The is-a relation

Dynamic Binding

  1. Dynamic Binding: Class-Appropriate behavior
  2. Watch C++ Shapes: Part 2 (Example 2)
  3. Watch C++ Shapes: Part 3 (Example 3)
  4. Watch C++ Shapes: Part 4 (Example 4)
  5. Watch C++ Shapes: Part 5 (Example 5)
  6. Making Inheritance Work: C++ Issues
  7. Inheritance and Dynamic Binding: idioms and common patterns

Modern Syntax & Practices

  1. Watch C++ Shapes: Part 6 (Example 6)
  2. Watch C++ Shapes: Part 7 (Example 7)
  3. Watch C++ Shapes: Part 8 (Example 8)
  4. Watch C++ Shapes: Part 9 (Example 9)
  5. Visualizing the Shape Examples with a UML Sequence Diagram

Assignments

  1. OOP in C++: (Part 2) Due: 10/25/2023
  2. OOP in C++: (Part 3) Due: 11/03/2023
  3. End of material covered on the Midterm Exam

10 Preparing for Java & Python & (Maybe) a Little Rust 10/31/2023 - 11/05/2023

Overview

This module continues our language comparison discussions, with a focus on Java. This brief module covers three brief examples. This module serves as preparation for our OOP in Java discussions.

Objectives

After completing this module students will be able to:

  1. Discuss the C++ and Java entries in the Cross Language Class Checklist.
  2. Explain the Java Iterator Interface.
  3. Explain the mechanical differences between C++ and Java iterators.
  4. Discuss how to approach an unfamiliar language (e.g., Java, Python or Rust).
  5. Map existing knowledge of object oriented C++ onto Java.

OOP Languages in General

  1. Cross-Language Class Checklist
  2. Loops & Iterators... in Java!
  3. Language Resources

Java & Python

  1. Watch Switching to Java Part 1
  2. Watch Switching to Java Part 2

Tools, Tricks & Tips

  1. Eclipse Tricks (for Java) & VSCode

Python (For Fun and Reference)

  1. Switching to Python

11 OOP in Java 11/06/2023 - 11/17/2023

Overview

This module discusses the implementation of ADTs using Java classes. This Module complements (i.e., it is a companion to) the earlier OOP in C++ Module.

Objectives

After completing this module students will be able to:

  1. Explain how Java object variables are conceptually pointers (albeit by a different name).
  2. Implement the Java Big-not-quite-3 (i.e., clone) alongside an inheritance hierarchy.
  3. Use Java Reference variables to allow dynamic binding.
  4. Summarize the difference between inheritance and subtyping.
  5. Discuss the Observer-Observable Pattern.
  6. Discuss the Factory Pattern.
  7. Explain how to implement equals, hashCode, toString, and (sometimes) iterator.
  8. Define the concept of a Java package and compare it to a C++ namespace.
  9. Apply the principles defined by S.O.L.I.D in Java.
  10. Apply the D.R.Y principle in Java.
  11. (Time permitting) Discuss the Builder Pattern.

  1. Inheritance in Java
  2. A Class Designer's Checklist for Java
  3. Writing a Unit Test - Identifying Mutators & Accessors
  4. Watch Java Shapes Discussion - Example 1 (Basics of Polymorphism)
  5. Watch Java Shapes Discussion - Example 2 (Factory Pattern)
  6. Watch Java Shapes Discussion - Example 3 (Subtyping & Iterators)
  7. Watch Java Shapes Discussion - Example 4 (Input)
  8. Asst: OOP in Java (Part 1) Due: 12/01/2023
  9. Asst: OOP in Java (Part 2) Due: 12/08/2023

Refactoring & Design

  1. Watch Java Shapes Discussion - Example 5 (A Better Shapefactory)
  2. Watch Java Shapes Discussion - Example 6 (Replacing Shape.read)
  3. Watch Java Shapes Discussion - Example 7 (Separation of Concerns)
  4. Extra Credit Asst: OOP in Java (Part 3) Due: 12/11/2023

C++ vs Java

  1. Which Language is It?

12 Applying OOP: GUIs and Threads 11/18/2023 - 12/01/2023

Overview

In this module we discuss Graphical User Interfaces (GUIs) and threads in Java. We briefly cover the principles of multi-threading (parallelism) throught the Runnable interface..

Objectives

After completing this module students will be able to:

  1. Discuss the Java Swing classes required to build a GUI.
  2. Identify the Java Swing classes that represent familiar elements (e.g., buttons, text fields, and text areas).
  3. Write Java Listeners to handle user interaction.
  4. Write Java Listeners as Immediate Classes.
  5. Write Lambda functions to to replace Java Listeners.
  6. Explain the differences between sequential and multi-threaded programs.
  7. Explain the different ways to utilize multiple threads (e.g., ThreadPools).
  8. Define syncronization and identify the mechanics involved.
  9. Refactor code to follow either the MVC or M-VC patterns.

Graphic User Interfaces (GUIs)

  1. Watch Java GUI & Thread Discussion
  2. Functors - Objects That Act Like Functions
  3. Java Tutorial: Creating a GUI with JFC/Swing
  4. Example: Building a Java GUI

GUI Listeners & Lambdas

  1. Java GUIs - ActionListeners & Lambdas

Multi-Threading

  1. Watch Java Thread & ThreadPool Discussion
  2. Threading: Motivation
  3. Multi-Threading : Doing Things in Parallel
  4. Java Tutorial: Concurrency
  5. Case Study: threads in the spreadsheet

13 Additional Design Patterns 12/02/2023 - 12/07/2023

Overview

In this Module we will revisit concepts discussed through the semester, but in Python (and maybe Rust)!

Objectives

After completing this module students will be able to:

  1. Analyze lazy evaluation in the context of Generators and Generator Expressions.
  2. Refactor code to make use of context managers.
  3. Discuss the Decorator Pattern.
  4. Discuss Protocols vs. ABCs
  5. Utilize properties and setters
  6. Discuss Dependency Injection. Recomendation from Vanguard Dev
  7. Discuss how to approach an somewhat unfamiliar language (e.g., Java, Python or Rust).
  8. Map existing knowledge of object oriented Java onto Python.

Python

  1. Switching to Python
  2. Structure of a Basic Python Program
  3. Comprehensions - An Overview
  4. The Python Class Checklist
  5. Context Managers
  6. Python Shapes
  7. More Python! - Threads (technically processes)
  8. More Python! - Generator Expressions & Modules
  9. More Python! - Linked List

Rust

  1. Rust Shapes Example

14 Semester Review & Things To Explore 12/08/2023 - 12/10/2023

Overview

This is a pseudo-module. There is no new material (e.g., languages, paradigms ore patterns) covered. This Module is an end-of-semester wrap up. We will revisit selected topics from throughout the semester.

We will introduce a few quick topics to explore with your new skills and knowledge.


Readings to Revisit

  1. Cross-Language Class Checklist
  2. Loops & Iterators... in Java!
  3. Java GUIs - ActionListeners & Lambdas

Previous Review Materials

  1. Quarter Semester Review
  2. Watch C++ Shapes Discussions
  3. Watch Java Shapes Discussions
  4. A Quick Sequence Diagram Review
  5. Midsemester Review

End of Semester Review

  1. Reviewing S.O.L.I.D
  2. Which Language is It?
  3. Using the Java Class Checklist
  4. Final (Last) Review

Future Work

  1. Language Resources
  2. Code Documentation & Comments
  3. Where Are We Now? - Future Work

15 Exams and Special Events

  1. Refer to the ODU Academic Calendar.
  2. Classes Start 08/26/2023
  3. Midterm Exam 10/27/2023 - 10/28/2023
  4. Final Exam 12/11/2023 - 12/13/2023

16 Postscript

All times in this schedule are given in Eastern Time.

Symbol Key
lecture Lecture:
slides Slides :
event Event or important date
text Read
lab Do lab:
asst Assignment:
exam Take the
activity Do:
recitation In your recitation section:
construct Under construction:

17 Presentation

Topics Lectures Readings Assignments & Other Activities
topics lecture slides event exam video project construct text exam asst selfassess exam activity lab
Document Kind Prefix
lecture Read lecture notes:
event
exam Take the exam:
lab Do:
asst Do assignment:
reading Read (optional):
cs382