The Problems
The Objectives
Forms of Software Rot
Attributes of a Good Design
Clean Code Qualities
Professional Responsibilities
Automated testing, TDD and Refactoring Practices Review
Refactoring
Exercise
Problem addressed by SRP
Example design violating SRP
Example design conforming to SRP
Patterns built on SRP
Exercise
Problems with Procedural Programming
Object-Oriented Programming
Problem addressed by DIP
The Dependency Inversion Principle
Dependency Inversion Heuristics
When is DIP appropriate/inappropriate
Example design violating DIP
Example designs conforming to DIP
Exercise
Problem addressed by OCP
The Open/Closed Principle
When is OCP appropriate/inappropriate
Several Example designs violating OCP
Several example designs conforming to OCP
Exercise
Problem addressed by LSP
The Liskov Substitution Principle
Example designs violating LSP
Example designs conforming to LSP
Relationship OCP/LSP
When is “instance of is” not an LSP problem
Exercise
Problem addressed by ISP
The Interface Segregation Principle
Example designs violating ISP
Example designs conforming to ISP
When is ISP appropriate/inappropriate
Exercise
Problem addressed by LoD
Example design violating LoD
Example designs conforming to LoD
When is LoD appropriate/inappropriate
Pro/Con discussion
Exercise
Simple Design
Automated Testing
Test-Driven Development
Refactoring
Teamwork
Pair Programming
Collective Ownership
Quick Design Sessions
Continuous Integration
Code/Design Reviews
Clean code
Professional Responsibilities
SOLID Principles
Packaging Principles