Syllabus and synopsis (OOP2015)
Honour School of Computer Science (Part A core); Honour School of Mathematics and Computer Science (Part A core); Honour School of Computer Science and Philosophy (Part A option); Master of Science in Computer Science (Schedule A).
Michaelmas Term, 2015.
This course aims to prepare undergraduates for the programming work they will undertake during their time in Oxford and subsequently, including subsequent programming-heavy courses such as Compilers and Database Systems Implementation, in addition to the group project and later individual project work. The course contains few topics that have not been mentioned in previous courses, but the defining aim in this course is to illustrate those programming techniques put to work in a sequence of case studies of carefully chosen size, each of them big enough to have significant internal interfaces, but not so large as to be overwhelming.
The course will introduce standard tools and techniques for software development: use of a version control system, an automated build process, an approriate framework for automated unit and integration tests, and profiling tools for studying performance. Participants will be able to choose between an IDE and a traditional editor/compiler setup.
After taking the course, participants will be able to
- Specify simple abstract data types and design implementations, using abstraction functions to document them.
- Recognise features of object-oriented design such as encapsulation, polymorphism, inheritance, and composition of systems based on object identity.
- Name and apply some common object-oriented design patterns and give examples of their use.
- Design applications with an event-driven graphical user interface.
This is not a first programming course; neither is it a course about Scala. Most undergraduates taking the course will have had a previous introduction to Scala in the course Imperative Programming 2 that they took in the first year. Since we will be using mostly those features of Scala that are also present (in slightly more clunky form) in Java, it should not be too difficult for those already familiar with Java to pick up the language they need to follow the course. Familiarity with elementary notions of program correctness will be assumed, such as pointer-linked data structures and the use of invariants to reason about programs containing loops.
Software architecture. Object-oriented design principles. Design by contract and proof of correctness of data representations. Event-driven programming. Common design patterns. Case studies.
(see the detailed outline of the course.)