This document discusses SOLID principles of object-oriented design. It begins with an overview of basic OOP concepts like polymorphism, encapsulation, inheritance, cohesion and coupling. It then explains code and design smells like duplicate code and rigidity that violate principles. The main body explains the five SOLID principles - Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation and Dependency Inversion. It provides descriptions, examples and explanations of each principle. It concludes with mentioning some additional design principles like KISS, YAGNI and DRY.