Object-Oriented Analysis and Design
Object-Oriented Analysis and Design covers an introduction to requirements analysis and systems design. Topics include:
The course is roughly split into halves, in the first half we cover the software development process, domain analysis and modeling, and design principles and heuristics using readings and in-class activities. In the second half, we work through multiple iterations of a project, extending and refactoring a "large" existing code base while focusing on team-based iterative development and applying design principles and patterns. You may find the project significantly different than what you have experienced in other project-based courses, you will be writing very little code, we are intentionally not building something new, we are focused on design improvements. Lectures are motivated by the progress of project iterations and cover topics including: applying design patterns, how to draw meaningful UML diagrams, how to navigate and work on a large code base with multiple levels of indirection, how to refactor and how to design for testability. The course concludes with a look at alternative software paradigms and the future of software development.
What will you get from this course? The goal of this course is to give you the knowledge and skills to:
The prerequsites for this course are COM S 228, MATH 165 and ENGL 250. The project is in Java, we will cover any advanced concepts as they are needed to implement design patterns, for example, dynamic dispatch, however, we assume you are already proficient with the basics of Java. This is a class about design, not about code style or practices. We expect the code you produce to conform to good coding practices, and we assume you have already learned how to do this in prerequisite courses. A good resource is Clean Code by Robert Martin [MartinCleanCode08].
There is no single textbook for this course, instead we will have selected readings from several well know books in the field, all of the books are free to students in a digital format.
Grady Booch, Robert A. Maksimchuk, Michael W. Engle, Bobbi J. Young, Jim Conallen and Kelli A. Houston. Object-Oriented Analysis and Design with Applications, 3rd Edition, 2007.
Martin Fowler. Refactoring: Improving the Design of Existing Code, Second Edition, 2018.
Martin Fowler. UML Distilled: A Brief Guide to the Standard Object Modeling Language, Third Edition, 2003.
Craig Larman. Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development, Third Edition, 2004.
Robert C. Martin. Clean Architecture: A Craftsman's Guide to Software Structure and Design, First Edition, 2017.
Mark Richards. Fundamentals of Software Architecture: An Engineering Approach, 2020.
Alexander Shvets. Dive Into Design Patterns, 2020.
Rebecca Wirfs-Brock and Alan McKean. Object Design: Roles, Responsibilities, and Collaborations, 2003.
Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software, 1995.
Mark Grand. Patterns in Java Volume 1: A Catalog of Reusable Design Patterns Illustrated with UML, Second Edition, 2002.
Robert C. Martin. Clean Code: A Handbook of Agile Software Craftsmanship, 2008.
Robert Ward is responsible for much of the structure of this course in its current form. I had the privilege of co-teaching with him and learning an incredible amount about software engineering and teaching, during my first semester as a university lecturer.