About the course
Understanding the fundamental principles of Object-Oriented Programming (OOP) is crucial for designing and building robust, maintainable, and scalable software in almost any modern programming language. This course provides a deep dive into the core concepts that underpin object orientation, focusing on the timeless principles and design considerations rather than getting tied down to the specific syntax of one language initially.
It is designed to be highly flexible and tailored to your specific programming language(s), domain, and learning goals. We encourage you to get in touch to discuss how this course can be customised with relevant examples and practical exercises that meet your exact needs and context - whether your code base focuses on a language such as C++, C#, Java, Python or something more esoteric.
The course explores the definition of objects, clarifying the distinction between class and type, and addressing common myths and misconceptions surrounding object identity and behaviour. A significant focus is placed on understanding the fundamental relationships between objects – 'Has A' (Association/Composition), 'Uses A' (Dependency), and 'Is A' (Inheritance) – which are the building blocks of complex systems. You will delve into the essential concept of Abstraction and the craft involved in creating proper levels of abstraction in your designs, aiming for clarity and reusability.
Key OOP concepts like Encapsulation (understanding scope and information hiding) and Polymorphism (achieving run-time substitutability) are covered in detail, alongside practical discussions on the implementation considerations for different object relationships and how they map to language constructs (Abstract classes, Interfaces, Virtual functions). Crucially, the course examines common misuse and abuse patterns related to these relationships (including well-known examples like the Circle-Ellipse problem and Inappropriate Taxonomy), providing insights into avoiding pitfalls and designing for invariance and symmetry. By focusing on these core principles and their practical implications, the tailored course equips you with the foundational knowledge to apply robust object-oriented design effectively in your specific development context.
Instructor-led online and in-house face-to-face options are available - as part of a wider customised training programme, or as a standalone workshop, on-site at your offices or at one of many flexible meeting spaces in the UK and around the World.
- 
		
		- Clearly define what constitutes an object and distinguish between 'class' and 'type'.
- Understand and apply the fundamental object relationships: 'Has A' (Association/Composition), 'Uses A' (Dependency), and 'Is A' (Inheritance).
- Understand the concept and importance of Abstraction in object-oriented design.
- Explain Encapsulation and its relationship to object composition ('Has A').
- Understand Inheritance ('Is A') and Polymorphism (run-time substitutability).
- Recognise common misuse and abuse patterns associated with object relationships (Association/Composition, Dependency, Inheritance).
- Understand the role of abstract classes and interfaces in designing flexible systems.
- Identify how design patterns relate to underlying object principles and language constructs.
- Apply core object-oriented principles to model design decisions effectively within a specified programming context.
 
- 
		
		This course is designed for software developers, software architects, and technical leads who wish to gain a strong, foundational understanding of Object-Oriented Programming (OOP) principles that can be applied across various programming languages and domains. It is ideal for: - Developers seeking to deepen their understanding of OOP concepts beyond basic language syntax. 
- Developers transitioning between OOP languages who need a solid grasp of the underlying principles. 
- Architects and designers needing a solid theoretical basis for object-oriented design decisions. 
- Teams looking for tailored training on OOP principles relevant to their specific projects, technologies, or design challenges. 
 
- 
		
		Participants should have: - A solid understanding of programming fundamentals and experience developing applications in at least one software development language. While the course focuses on principles, practical application and examples will relate to programming concepts and can be tailored to the participants' background. 
 No prior specific experience with Object-Oriented Programming concepts is strictly required, though some exposure may be beneficial. 
- 
		
		This OOP course is available for private / custom delivery for your team - as an in-house face-to-face workshop at your location of choice, or as online instructor-led training via MS Teams (or your own preferred platform). Get in touch to find out how we can deliver tailored training which focuses on your project requirements and learning goals. 
- 
		
		Please note: The detailed syllabus outline below represents the comprehensive scope of topics that can be covered in a training course focused on Object-Oriented principles. This course is designed to be highly flexible and tailored to the specific programming language(s) you use, your domain, and your team's particular learning goals related to OOP. We encourage you to get in touch to discuss how the modules and depth of coverage can be customised to meet your exact needs. The outline provides a menu of potential content to draw from. Objects- Objects Defined: What is and is not considered an object in software design. 
- Objects and their Lifecycles: Understanding object existence and state across time and space within a system. 
- The Difference between 'Class' and 'Type': Clarifying these fundamental concepts in object-oriented systems. 
- Common Myths about Objects: Addressing misunderstandings regarding object identity and behaviour. 
- Clarifying Key Misconceptions: Resolving frequent misunderstandings in object-oriented thinking. 
- Designing for Consistency and Balance: Striving for symmetrical and balanced designs in object interactions and relationships. 
- Achieving Invariance: Designing objects that maintain consistent properties or behaviour despite changes in their environment or related objects. 
- Identifying and Leveraging Design Patterns: Recognising recurring design problems and applying established patterns for solutions using objects. 
- Relationship between Design Patterns and Language Constructs: Understanding how programming language features support or influence design patterns. 
- Exploring the Object Design Space: Understanding the choices, trade-offs, and considerations involved when modelling a system with objects. 
 Object Relationships- 'Has A' Association: Understanding relationships where one object contains or is composed of other objects (Composition/Aggregation). 
- 'Uses A' Association: Understanding relationships where one object depends on or uses another object (Dependency). 
- 'Is A' Association: Understanding relationships where one object is a type of another object (Inheritance). 
 Abstraction- Understanding Abstraction: The core concept of hiding complexity and focusing on essential characteristics. 
- Designing Pure Abstractions: Striving for abstractions that are clear, focused, and free from unnecessary detail or side effects. 
- Creating Effective Models: Techniques for modelling real-world concepts or system components as objects and classes. 
- Reflecting on the Modelling Process: Understanding the perspective, choices, and iterations involved when creating object models. 
- Crafting Proper Abstractions: The practice and skill of turning abstract concepts into concrete object representations (reification). 
 Coincident Association ('Has A' / Composition and Aggregation)- Encapsulation – the Concept of 'Scope': Understanding how encapsulation relates to controlling access to an object's internal state and behaviour. 
- Misuse of 'Has A' (Composition/Aggregation): Using composition when Dependency ('Uses A') or Inheritance ('Is A') might be more appropriate. 
- Abuse of 'Has A' Granularity: Designing objects with inappropriate levels of detail or scope (too fine-grained or too coarse-grained composition). 
- Implementation Concerns: Practical considerations when implementing 'Has A' relationships in code. 
 Non-Coincident Association ('Uses A' / Dependency)- The Nature of 'Uses A' (Dependency) Relationships: Understanding relationships where one object relies on another object to perform a task. 
- Uses-A Misuse ('Uses A' in place of 'Has A' or 'Is A'): Using dependency when Composition/Aggregation ('Has A') or Inheritance ('Is A') might be more appropriate. 
- Implementation Concerns: Practical considerations when implementing 'Uses A' relationships in code. 
 Extension ('Inheritance' or 'Is A' relationships)- The Nature and Implementation of Extension: Understanding how objects can inherit properties and behaviours from parent objects. 
- Polymorphism (Run-Time Substitutability): Understanding how objects of different classes can be treated as objects of a common superclass. 
- Abstract Base Classes and Interfaces: Designing contracts and shared behaviour using abstract classes and interfaces. 
- Multiple Inheritance: Exploring scenarios and implications where a class can inherit from more than one parent class (relevant for languages that support it). 
- Virtual Functions: Understanding how method calls are resolved at runtime in polymorphic scenarios. 
- Extension Misuse (the Circle-Ellipse problem): Examining a classic example of where inheritance can lead to design difficulties. 
- Extension Abuse (the Inappropriate Taxonomy problem): Understanding the pitfalls of using inheritance to model concepts that do not form a true 'Is A' hierarchy. 
- Implementation Concerns: Practical considerations when implementing inheritance and polymorphism in code. 
 
Trusted by
 
				
				 
				
				 
				
				 
				
			