Welcome to Object-Oriented Design. This is the first course in Software Design and Architecture, a specialization with four courses provided by University of Alberta in partnership with Coursera. Whether you are here for only this course or for the whole specialization, welcome! You are joining thousands of other intrepid learners who love to push the boundaries of their knowledge and better themselves. This course takes Java beginners to the next level by covering object-oriented analysis and design. You will discover how to create modular, flexible, and reusable software, by applying object-oriented design principles and guidelines. And you will be able to communicate these designs in a visual notation known as Unified Modelling Language (UML). You will be challenged in the capstone project to apply your knowledge of object-oriented design by evolving and documenting a Java codebase with corresponding UML documentation. After completing this course, a learner will be able to: • Apply the CRC (Class Responsibility Collaborator) technique to analyze and design the object-oriented model for a problem. • Construct an object-oriented model to represent the information structure of a real world problem. • Explain object-oriented modeling constructs and their purpose (e.g., abstraction, encapsulation, decomposition, generalization). • Explain the difference between association, aggregation, and composition dependencies. • Distinguish different types of inheritance • Express object-oriented models as UML (Unified Modeling Language) class diagrams. • Translate UML class diagrams to equivalent Java code. • Translate Java code to UML class diagrams. • Apply design guidelines for modularity, separation of concerns, information hiding, and conceptual integrity to create a flexible, reusable, maintainable design. • Explain the tradeoff between cohesion and coupling. • Apply inheritance appropriately.