Designing Object-Oriented Software