| S | Single Responsibility | A class should have only one reason to change. | High cohesion; easier testing and debugging. |
| O | Open/Closed | Software entities should be open for extension, but closed for modification. | Prevents breaking existing code when adding new features. |
| L | Liskov Substitution | Subtypes must be substitutable for their base types. | Ensures inheritance doesn’t break logic or introduce unexpected behavior. |
| I | Interface Segregation | Clients should not be forced to depend on methods they do not use. | Reduces “fat” interfaces and unnecessary dependencies. |
| D | Dependency Inversion | Depend on abstractions, not concretions. | Decouples high-level logic from low-level implementation details. |