SOLID, GRASP, and Other Basic Principles of Object-Oriented Design