Mastering Object-Oriented Programming Principles and Design Patterns