COMP 305: Object-Oriented Software Design

University of San Diego, Fall 2025

Course Overview

This course introduces students to the principles of software design and programming paradigms using JavaScript as the unifying language, given its ubiquity and usefulness. While traditional object-oriented programming (OOP) is traditionally the overriding theme of this course, a complete understanding of software design should explore procedural, functional, and declarative approaches as well.

Upon completion of the course, students will gain insight into the trade-offs and strengths of each paradigm. The practical application of these ideas will take the form of examples and a small project, demonstrating how good design and engineering practices can contribute to the development of robust, maintainable, and user-focused software applications.

Programming Paradigms

Explore different approaches to solving problems through code and realizing that there are many ways to do the same thing.

Procedural

Step-by-step instructions using functions and control flow.

Object-Oriented

Encapsulation, inheritance, and polymorphism with classes.

Functional

Pure functions, immutability, and function composition.

Declarative

Describe what you want, not how to get it.

Architectural Patterns

Large-scale structural patterns for organizing entire applications and systems.

MVC

Model-View-Controller separation for web applications.

MVP

Model-View-Presenter for testable UI logic.

MVVM

Model-View-ViewModel with data binding.

Event-Driven

Loosely coupled event-based communication.

Layered/N-Tier

Horizontal layers with clear responsibilities.

Component-Based

Composable, reusable UI components.

Client-Server

Separation of concerns between frontend and backend.

REST

Representational State Transfer for APIs.

Design Patterns

Classic Gang of Four and modern patterns for solving common code-level problems.

Creational Patterns

Singleton

Single instance with global access point.

Factory Method

Delegate object creation to subclasses.

Abstract Factory

Create families of related objects.

Builder

Construct complex objects step by step.

Prototype

Clone existing objects for new instances.

Structural Patterns

Adapter

Make incompatible interfaces work together.

Decorator

Add features without changing structure.

Facade

Simplified interface to complex subsystem.

Proxy

Placeholder or surrogate for another object.

Composite

Tree structure of objects treated uniformly.

Behavioral Patterns

Observer

One-to-many dependency notifications.

Strategy

Interchangeable algorithm families.

Command

Encapsulate requests as objects.

Iterator

Sequential access without exposing structure.

Template Method

Algorithm skeleton with subclass steps.

Chain of Responsibility

Pass requests along a handler chain.

Technologies

Introduction to technologies used in the course including Markdown, HTML, CSS, and JavaScript.

Markdown

Learn the broadly used, but unstandardized way we document things in development.

HTML

Learn semantic HTML and how it structures content.

CSS

Explore declarative style coding with CSS and note its reliance on HTML.

JavaScript

Discover the power and sharp edges of JavaScript before exploring frameworks.

Development Tools

Essential tools for modern software development.

Git

Version control fundamentals and workflow.

GitHub

Collaboration, issues, and pull requests.

VS Code

Editor setup, extensions, and shortcuts.

Browser DevTools

Debugging, profiling, and network analysis.

npm/Node.js

Package management and build tools.

Terminal/CLI

Command line basics and productivity.

Design Principles

Fundamental principles for writing clean, maintainable, and scalable code.

SOLID

Five principles for object-oriented design.

DRY

Don't Repeat Yourself - avoiding duplication.

KISS

Keep It Simple, Stupid - favoring simplicity.

YAGNI

You Aren't Gonna Need It - avoid premature optimization.

Clean Code

Writing readable, understandable code.

Separation of Concerns

Organizing code into distinct sections.

Composition over Inheritance

Favoring object composition over class inheritance.

Law of Demeter

Principle of least knowledge between objects.

Single Source of Truth

Each piece of data has one authoritative source.

Fail Fast

Report errors as soon as possible.

Engineering Practices

Professional software development practices and methodologies.

TDD

Test-Driven Development - write tests first.

Testing Strategies

Unit, integration, and end-to-end testing.

Debugging

Systematic approaches to finding and fixing bugs.

Documentation

Code comments, README files, and API docs.

Code Review

Peer review process and best practices.

Refactoring

Improving code without changing behavior.

Pair Programming

Two developers working on one computer.

CI/CD

Continuous integration and deployment pipelines.

Agile

Iterative development and team collaboration.

Version Control

Branching strategies and commit best practices.

Logistics