CS5004: Object-Oriented Design Course Charter
Introduction
CS5004 provides an intensive tour of class-based program design, building on ideas introduced in CS5001. It includes object-oriented concepts such as information hiding, encapsulation, and polymorphism. It contrasts the use of inheritance and composition as techniques for software reuse. It provides an understanding of object-oriented design using graphical design notation such as UML (Unified Modeling Language), as well as object design patterns.
This course introduces abstract data types (ADTs) and implementations. It also examines the relationship between algorithms and data structures, as well as basic techniques for analyzing algorithm complexity.
CS5004 introduces the above in the context of the Java programming language. Students gain significant experience writing programs in Java.
The aim of this document is to lay out the objectives, outcomes and assessments for CS5004.
Goals
CS5004 serves as the second programming course in the Align bridge curriculum. The main objective is to familiarize students with the concepts and practice of object-oriented design. In this context it introduces students to new data structures and algorithms. The course enables students to discuss and evaluate programs in terms of their design, correctness, and efficiency (space and time).
Although the course uses Java as the programming language, most of the concepts transcend a particular programming language.
Specifically:
- Experience with medium sized code bases. Get comfortable with medium sized code bases (1000 LOC).
- Establish good design, development, testing, and documentation practices.
- Use existing libraries and frameworks.
- Evaluate alternative designs and implementations.
High-Level Learning Objectives
The course’s outcomes are captured in the following list of high-level learning objectives. Some of these build on the objectives for CS5001.
- Write correct and clearly documented small- to medium-sized programs that others can read, understand, and modify.
- Represent information as data. Beyond documenting their data, students must be able to document and discuss alternative representations with pros and cons in terms of design (e.g., coupling, abstraction barriers) and complexity (space and time).
- Testing as an integral part of development. Students use similar build tools as the open source community to test, analyze, and document their code.
- Organize programs with clear, distinct packages and interfaces. Minimize dependencies by providing clear interfaces and using appropriate abstractions.
- Use method signatures, purpose statements, pre- and post-conditions, and invariants to specify a method’s assumptions, guarantees and behavior. Document methods using pre- and post-conditions explaining what each method does, not how it does it. Purpose statements must be clear English explanations of what each method does.
- Use generalization for data, classes, and methods to limit code duplication.
- Use and implement abstract data types and analyze their performance. Design and implementation must consider time and space complexity.
- Use common OO Design Patterns.
Implementation Details
The course evaluates students through
- Weekly programming assignments.
- Weekly lab sessions.
- Exams. There are typically 2 exams – midterm and final.
- Codewalks, when possible. Ideally, some lab sessions are used to perform codewalks. Students present their designs and code to the course staff and their classmates. Students who are not presenting their code provide feedback that the course staff reviews. Note that with large numbers of students, it may be difficult or even impossible to implement this.
The following provides one example of a week-by-week schedule:
- Week 1: Data Definitions, Classes, and Testing in Java
- Week 2: Methods for simple classes, Exceptions
- Week 3: Representing more complex forms of data
- Note: It is possible to condense the material above to two weeks, given CS5001’s coverage of object, methods, and classes.
- Week 4: Lists
- Week 5: Lists continued
- Note: This course is typically taken by students who are also taking CS5007 & 06, where they also implement linked lists in C. Faculty should, whenever possible, coordinate across courses so they are complementing presentations of linked lists, rather than duplicating them.
- Week 6: Equality and comparison
- Week 7: Applications of Equality
- Week 8: Design of programs, Model-View-Controller (MVC) architecture
- Week 9: Encapsulation and invariants
- Week 10: Inheritance vs composition
- Week 11: Design patterns for object creation
- Week 12: Strategies, decorators, visitors
- Week 13: Designing for alternatives; measuring algorithmic efficiency
Topics and Learning Outcomes
Note that the topics and learning outcomes (some of which repeat those for CS5001 and 5002) are the minimum to be achieved in CS5004. Faculty may choose to present additional material or cover a topic in greater depth. The order of topics here does not imply an ordering for the course itself. Faculty are encouraged to develop syllabi that complement their teaching style. Faculty are also encouraged to share syllabi and other materials with each other.
A note on levels of mastery, which are taken from CS2013 (see cs2013.org): For levels of mastery, CS2013 takes inspiration from (but does not directly follow) Bloom’s Taxonomy. CS2013 defines three levels:
- Familiarity: The student understands what a concept is or what it means. This level of mastery concerns a basic awareness of a concept as opposed to expecting real facility with its application. It provides an answer to the question “What do you know about this?”
- Usage: The student is able to use or apply a concept in a concrete way. Using a concept may include, for example, appropriately using a specific concept in a program, using a particular proof technique, or performing a particular analysis. It provides an answer to the question “What do you know how to do?”
- Assessment: The student is able to consider a concept from multiple viewpoints and/or justify the selection of a particular approach to solve a problem. This level of mastery implies more than using a concept; it involves the ability to select an appropriate approach from understood alternatives. It provides an answer to the question “Why would you do that?”
Note that course topics appear in regular font. Learning outcomes appear in italics.
Also note that some learning outcomes apply to many course topics. More specific learning outcomes appear with their respective topics.
| Course Topics | Learning Outcomes |
|---|---|
Design concepts and principles:
|
|
| Object-oriented analysis and design |
|
| Object-Oriented Programming
Design
Definition of classes: fields, methods, and constructors Subclasses, inheritance, and method overriding Dynamic dispatch: definition of method-call |
|
Development Methods
Program correctness
Simple refactoring Modern programming environments
Debugging strategies Documentation and program style |
|
Basic Type Systems (Note that some of these are also covered in other courses.)A type as a set of values together with a set of operations
Association of types to variables, arguments, results, and fields Type safety and errors caused by using values inconsistently given their intended types |
|
| Abstract data types: Usage and Implementation |
|
| Data Structures: Use and Implementation |
|
| Algorithms and Design
The concept and properties of algorithms
The role of algorithms in the problem-solving process Problem-solving strategies
|
|