This is a course for 2nd year engineering students @ Ecole CentraleSupélec
Synopsis.
The course aims at providing engineering students with an overview to problem of software design by means of the object oriented programming (OOP) paradigm. Apart from introducing the basic elements of OOP (i.e. notion of class/object, computation by message passing, inheritance, composition, polymorphism, etc), a particular emphasis is given to aspects such as code flexibility/extensibility. On completing the course the student is expected to have developed sufficient skills to develop standard OOP solutions starting from a set of specifications/requirements. The student is also expected to be able to consider software quality aspects while designing a software solution, thus, for example, being capable of distinguishing between design choices that result in more flexible solutions from those that result in a code whose extension is very costly (i.e. violation of the open-close principle). The course is carefully structured so that each notion introduced during a lecture is followed by a practical work (i.e. coding) which requires its application. In terms of code development the students will learn the Java language and will learn the Java development process under the Eclipse IDE. Furthermore students will learn some basic notions of UML modelling and in particular will develop UML class diagrams under Eclipse by means of the Papyrus modelling framework. Similarly students will apprehend the notions of code testing and its systematic application as an integral part of the software development process (Test Driven Development).
Content.
Basic notions of Software engineering and software quality: software development models, quality factors (external vs internal), modularity criteria, modularity principles.
Object Oriented Programming paradigm: programming languages as abstractions. Evolution of abstraction. Notion of Object/ Object-type. Computation as message exchange between objects. Expressing problems in terms of objects. Structure of OOP programs. OOP as the natural paradigm to achieve software quality.
JAVA language basics: Basic syntax. Defining classes, instance/class attributes/methods. Constructors. Instantiating objects. Primitive-types/Wrapper-types. Down/Up-casting. Generics. Anonymous classes. Collections. I/O streams. Error handling: exceptions. Properly defining equality relationship in Java. Access-modifiers. Getters/Setters. Object serialization in Java.
Software quality practices in JAVA: Code re-use. Information hiding. Encapsulation. Classes composition vs. inheritance. Inheritance related notions: shadowing, overriding/hiding, polymorphism. Abstract classes. Interfaces.
Code testing and test driven development. what is code testing about and why it is useful. Writing unit tests through Junit. Introduction to the test driven development methodology (TDD, part of Agile Extreme Programming method): from failing test units to passing test units. Example and applications.
UML Class diagrams. role of modelling in OOP development. Class diagrams. Relationships, relationship annotations. Generic association, aggregation, composition. Class relationship: generalisation, implementation. Using the Papyruse Eclipse framework for modelling with UML class diagrams.
Design Patterns. Introduction and motivation. The open-close principle. Families of patterns: creational, behavioral and structural design patterns. Factory pattern and variants. Strategy pattern. Observer pattern. Visitor pattern. MVC pattern. Singleton pattern. Examples and applications.
Multi-threading programming. Basic concepts of concurrency. Concurrency at OS level: processes, scheduler, threads. Java support to concurrent programming, Java threads. Synchronized methods, synchronized blocks. Intrinsic lock. Issues with concurrency: deadlock, starvation, fairness. Guarded blocks. Custom locks, reentrant locks. Applications and examples: the dining philosophers.
GUI programming in JAVA. Basic elements of Java AWT and Swing. Basic elements for development of graphical user interface: components, containers, buttons, menus, dialog boxes, file choosers, etc. Controlling the interactions with a GUI: listeners.
Organisation.
The course consists of 11 lectures of 1h30, each followed by a tutorial class also of 1h30.
Evaluation modalities.
The evaluation consists of two mandatory parts: an individual online exam taken in the computer labs of CentraleSupélec and which require solving programming problem through the CodeRunner plugin of Moodle plus a group project work to be handed in by each group (2 persons per group) within 5-6 weeks (strict deadline) from the date the project is handed out to the students. The final mark of a student is computed as the weighted sum of the Written Exam and Project mark.
Material and bibliography.
Students can find treatments of the subjects faced throughout in either of the following resources (some of which are available in PDF format on Claroline)
Paolo Ballarini, "IS1220_LectureNotes", 2014.
Joshua Bloch, "Effective Java (second edition)", Prentice Hall, 2008.
Bruce Eckel, "Thinking in Java", Prentice Hall, 2002.
Eric Gamma, et al., "Design Patterns: elements of reusable object-oriented software", Addison Wesley, 1995.
Tony Bavis, "Java Design Pattern Essentials (second edition)", Ability First, 2012.
A detailed description of the course content is available IS1220_descriptor