Essential Object-Oriented Programming Josh Ko 2007.03.11 object-oriented programming C++ Java OO class object OOP Ruby duck typing complexity abstraction paradigm objects objects model object-oriented decomposition algorithmic decomposition Booch 1 1 [Booch94] sec. 1.3, Algorithmic versus Object-Oriented Decomposition, p. 17. 1
Booch Data Abstraction public instance methods 2 interface 3 public instance methods signatures implementation abstract design by contract Andrew Koenig 4 Abstraction is selective ignorance. data abstraction C Stroustrup 5 supports enables 2 C++ public non-static member functions 3 interface Java interface Java 4 [Koenig97]. 5 [Stroustrup91] sec. 2 Programming Paradigms, par. 2. 2
Fortran C Modula-2 data abstraction data abstraction encapsulation data abstraction access control public members private members decoupling Interface Object Object Interface User User Implementation Implementation Design by Contract Bertrand Meyer design by contract DBC DBC Meyer 3
signature Arnold Gosling Holmes 6 class class print object print() process interval prioritize nonterminals signature Java documentation comments class class invariant state instance variables C++ class Stack template <typename T> class Stack { public: // interface // copy-control members omitted void push(const T&); void pop(); T& top() const; size_t size() const; bool empty() const; private: // implementation T* buf; size_t buf_size; size_t cur_size; void grow(); }; Stack objects class invariants 1. cur_size buf_size 6 [Arnold05], chap. 2 Classes and Objects, par. 3, p. 41. 4
2. buf[0] buf[cur_size 1] stack class invariants Stack objects valid state member functions precondition postcondition Class invariants class invariants class invariants private grow Stack class invariants grow class invariants class invariants class invariants class invariants class invariants class invariants member variables C++ std::pair std::pair member variables first second invariants class invariants class invariants class invariants constructor design by contract class invariants class invariants C++ Friend C++ friend functions friend functions member functions 7 class namespace friend functions class Sutter C++ Argument-Dependent Lookup ADL Koenig Lookup 8 ADL overload resolution name lookup namespace(s) 7 [Meyers00] 8 [Sutter00], Name Lookup, Namespaces, and the Interface Principle. 5
friend functions member functions namespace namespace friend functions abuse Abstract vs. Concrete data abstraction data abstraction data abstraction object-orientation C++ STL C++ data abstraction generic programming C++ OOP Data abstraction abstract data types ADT Doug McIlroy Those types are not abstract, they are as real as int and float. real concrete abstract concrete data abstraction Concrete types Stroustrup ADT 9 concrete types abstract classes class hierarchies int char object-oriented programming C++ data abstraction operator overloading concrete types concrete type int concrete types concrete objects int representation Data abstraction OOP runtime polymorphism 9 [Stroustrup00], sec. 10.1, p. 224, par. 2; sec. 10.3.4 The Significance of Concrete Class, p. 241. 6
ADT abstract data abstraction ADT Koenig inheritance program by difference data abstraction ADT ADT ADT superclass ADT subclass C++ base class derived class name hiding derived class base class derived class A subclass object = a superclass (sub)object + subclass extension. subclass superclass subclass object superclass object derived object base object base class private derived object superclass superclass C++/Java protected derived class base class derived class derived class base class base class derived class entities 10 C++ by value derived object base class variable slicing derived object base object base pointer/reference derived object base (sub)object pointer/reference base class 10 C++ friend functions friend functions object 7
declared type object actual type declared type actual type data abstraction OOP ADT GoF OO 11 Program to an interface, not an implementation. data abstraction ADT subclass ADT superclass superclass superclass superclass subclass objects subclass superclass IsA class Rectangle class Shape Liskov Substitution Principle LSP 12 superclass objects subclass objects substitutable Liskov S o 1 T o 2 T P o 1 o 2 P S T subtype data abstraction class class superclass superclass object subclass object 11 [Gamma95], sec. 1.6, Programming to an Interface, not an Implementation, p. 17. 12 [Martin02], chap. 10, LSP: The Liskov Substitution Principle. 8
LSP Actual Type Superclass Interface (substitutable) Subclass Object User Message Reference Type static binding superclass superclass object dynamic binding late binding virtual binding Java instance methods C++ virtual actual type reference type class class superclass superclass subclass subclass overrides superclass OOP polymorphism 13 Bertrand Meyer Open-Closed Principle OCP 14 Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification. superclass subclass GoF OCP 13 OOP 14 [Meyer97]; [Martin02], chap. 9, OCP: The Open-Closed Principle. 9
ADT ADT ADT program to an implementation 15 OCP LSP subclass object superclass object subclass object superclass subclass object application framework subclasses reuse reinvent the wheel DBC LSP Design by Contract LSP DBC subclass LSP subclass superclass Subclass superclass subclass superclass 16 subclass Java overriding method overridden method overridden method public overriding method protected subclasses Java/C++ covariant return types overriding method overridden method subtype supertype subtype LSP Abstract Classes & Java Interfaces Abstract class abstract class instantiated subclass 15 ADT 16 subclass subclass subclass 10
Java interface Java interface Java class C++ class 17 Java class Java interface members public static non-blank final Arnold Gosling Holmes class abstract interface class Java interface Java class interface C++ multiple inheritance C++ class base class Java class extension single inheritance interfaces class superclasses interfaces actual type 1. 2. 3. data abstraction 4. ADT ADT 5. OOP 17 Java interface C++ pure virtual functions abstract class 11
Thirddawn [Arnold05] Arnold, K., Gosling, J., Holmes, D. The Java Programming Language. Fourth edition, Addison-Wesley, 2005. [Booch94] Booch, G. Object-Oriented Analysis and Design with Applications. Second edition, Addison-Wesley, 1994. [Gamma95] Gamma, E., Helm, R., Johnson, R., Vlissides, J. Design Patterns. Addison-Wesley, 1995. [Koenig97] Koenig, A., Moo, B. E. Ruminations on C++. Addison-Wesley, 1997. [Martin02] Martin, R. C. Agile Software Development: Principles, Patterns, and Practices. Prentice Hall, 2002. [Meyer97] Meyer, B. Object-Oriented Software Construction. Second edition, Prentice Hall, 1997. [Meyers00] Meyers, S. How Non-Member Functions Improve Encapsulation. C/C++ Users Journal, February 2000. [Stroustrup91] Stroustrup, B. What is Object-Oriented Programming? (1991 revised version). Proc. 1st European Software Festival. February, 1991. [Stroustrup00] Stroustrup, B. The C++ Programming Language. Special third edition, Addison-Wesley, 2000. [Sutter00] Sutter, H. Exceptional C++. Addison-Wesley, 2000. 12