Part I: Designing Object-Oriented Systems