C# Design Strategies Pluralsight class by Jon Skeet SOLID Single Responsibility Open/Closed Liskov Substitution Interface Segregation Dependency Inversion