solid principles of object oriented design c#