This course covers advanced concepts of object-oriented programming, with emphasis on principles and practices for the design and implementation of large and complex programs. The course covers the following topics: design and implementation principles to support software reuse, basic design patterns, exception handling, event-driven programming, development of programs with graphical user interface, multithread programming, and the use of tools to assist debugging and testing programs. Students are encouraged to learn to utilize classes from standard or third-party libraries by studying from the documentations of those libraries.