Principles of Object-Oriented Software Development