Objektorientiertes Design und Programmierung

Marcel Lüthi
Departement Mathematik und Informatik

Objektorientierte Programmiersprachen

Objektorientierte Design

“Pertaining to a technique or a programming language that supports objects, classes, and inheritance.”

ISO/IEC 2382-15

“OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.”

A. Kay

Design und Programmiersprache

Wichtig beim OO Design sind Prinzipien (Information Hiding, Modularisierung, late binding), nicht die Programmiersprache.
  • OO Sprachen helfen Design direkt abzubilden
  • Nicht OO Sprachen verlangen Mehraufwand / Disziplin
By יוסף אור - Own work, LGPL, Link
  • Gutes Beispiel für OO Design in C: GTK+

Terminologie

  • Klasse implementiert Abstrakten Datentyp
  • Daten heissen Attribute
  • Konstruktor kreiert neue Instanzen
  • Operationen heissen Methoden
  • Instanzvariablen sind Referenzen auf Objekte
  • Laufzeitstruktur die Menge der Objekte zur Laufzeit
    • Jedes Objekt ist zur Laufzeit eindeutig identifiziert

Schnittstellen

Nutzung der Funktionalität eines Objekts nur über wohldefinierte Schnittstellen.
  • Mehrere Objekte können gleiche Schnittstelle anbieten
  • Ein Objekt kann mehrere Schnittstellen anbieten
Beispiel aus Java:
 
                    public class ArrayList<E> extends AbstractList<E>
                            implements List<E>, 
                            RandomAccess
                    

Dynamische Bindung und Polymorphismus

  • Polymorphismus: Variablen können zur Laufzeit an verschiedene (verwandte) Typen gebunden werden
  • Dynamische Bindung (late binding): Zur Laufzeit wird Methode entsprechend dem Objekttyp verwendet.

Beispiel: Polymorphismus

 
                        interface Foo {
                            public void bar();
                        }
                        class FooImpl1 implements Foo { 
                            public void bar() { System.out.println("in FooImpl1"); }
                        }
                        class FooImpl2 implements Foo { 
                            public void bar() { System.out.println("in FooImpl2"); }
                        }
                        void doSomethingWithFoo(Foo foo) {
                            foo.bar();
                        }
                                                 
                        if (condition) 
                            doSomethingWithFoo(new FooImpl1()) 
                        else 
                            doSomethingWithFoo(new FooImpl2())
                    
  • Unterschiedliche Ausgabe je nachdem ob foo an FooImpl1 oder FooImpl2 gebunden wird.

Objektorientierung als "Messaging"

  • Objekte verwalten Zustand der Daten (Attribute)
  • Nehmen Nachrichten/Requests entgegen (Methoden)
  • Senden Antwort zurück und/oder verändern Zustand
Gabriel VanHelsing, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=7560534
Methodenaufruf = senden einer Nachricht

Beispiel: Methodenaufruf als Nachricht


                    class BankAccount { 
                      private FxConverter fx = new FxConverter();
                      private double balanceCHF;

                      void depositEur(double amount) { 
                        double asCHF = b.convertEurToCHF(amount))
                          this.updateBalance(balanceCHF + asCHF)
                      }
                      void updateBalance(double newBalance) {
                        balanceInCHF = newBalance;
                      }
                    }
                        
                    // somewhere in currentObject                         
                    someAccount.depositEUR(500);                        
                    

OO Design - Zusammenfassung

  • Aufteilen eines Systems in Module
    • Objekte verwalten Daten
    • Zugriff nur via Methoden
  • Interpretation: Kommunikation via messaging
  • Late binding: Es wird erst zur Laufzeit entschieden welches Objekt Nachricht erhält/bearbeitet