The course provides an intensive tour of programming and design. The main objective of the course is expose students to different ways of thinking of a problem and designing robust solutions using a mix of program design paradigms. We will discuss and compare object-oriented and functional design paradigms. We will concentrate on object-oriented program design and the design of abstractions that support the design of reusable software and libraries.
The course reviews typical object-oriented concepts such as information hiding, encapsulation and various forms of polymorphism. It contrasts the use of inheritance and composition as dual techniques for software reuse. It provides a deeper understanding of object-oriented design using the use of graphical design notations such as UML and object-oriented design patterns. Finally it emphasizes on testing, specifically unit testing of components.
An important aspect of this course is to write clean, well-structured, well-documented code. Students will be expected to design and program to facilitate reuse, minimize code duplication and make it “future-proof”. Students will also be expected to explain and defend their design and programming decisions to code panels. In this sense this course trains students to see programming as a “people’s discipline”.
The course is suitable for all graduate students in the MSCS program. It assumes that students have prior experience in programming and design.
“Think first, experiment later.”
The curiosity to ask questions, try out new things and the motivation to go above and beyond is essential to extract maximum benefit from this course. This is a programming-intensive course, but also emphasizes careful design and thorough testing.
At the end of this course, students will be able to:
Compare and contrast functional and object-oriented designs, and choose design suitable for a given problem, including mixing paradigms within the same solution
Design object-oriented solutions to small and moderately-sized problems
Choose, include and implement design patterns appropriately to design solutions to problems
Implement a given design with clean, understandable and well-documented code in the Java programming language
Defend choices made in design and implementation to a group of peers
Generate appropriate documentation for developed solutions
Design unit tests for a given component and implement them using the JUnit testing framework for Java programs
Create, refine and express a design in graphical notation such as UML diagrams
Explore existing documentation to describe and use existing libraries and frameworks