Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II)...

35
Objektorientierte Programmierung (OOP) mit Matlab - Ein Crashkurs Sebastian Sahli 31. Mai 2016 Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Transcript of Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II)...

Page 1: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Objektorientierte Programmierung (OOP) mitMatlab - Ein Crashkurs

Sebastian Sahli

31. Mai 2016

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 2: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Grundbegriffe (I)

Objektorientierung: ”Sichtweise auf komplexe Systeme,bei der ein System durch das Zusammenspielkooperierender Objekte beschrieben wird“ 1

Objekte: Unscharf gefasster Begriff. Objekte werdencharakterisiert durch:

Die Dinge, die sie haben (ihre Eigenschaften/ Attribute)Die Dinge, die sie konnen (ihre Methoden)

Objekte mussen nicht materiell sein

1https://de.wikipedia.org/wiki/Objektorientierung

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 3: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Grundbegriffe (II)

Objektorientierte Programmierung (OOP):Programmierstil, der die Objektorientierung umsetztGrundidee: Modellierung des Programms mithilfe vonObjekten, deren Zusammenspiel das zu losende ProblembeschreibtVorstellung, dass alles aus Objekten aufgebaut ist bzw. sichalles als Objekt darstellen lasstInsbesondere ist ein objektorientiertes Programm keinelineare Abfolge von Anweisungen

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 4: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Klassen

Wichtigstes Konzept der OOP: die KlasseBeschreibt abstrakt eine Menge von Objekten mit gleichenEigenschaften und FahigkeitenSozusagen ein Bauplan fur eine bestimmte Sorte/ einenbestimmten Typ von ObjektenIn der Klasse werden die Attribute und Methoden des zubeschreibenden Typs angegeben

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 5: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Klassen in Matlab

In Matlabclassdef Name

properties

// Attribute kommen hierhin

end

methods

// Methoden kommen hierhin

end

end

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 6: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Beispiel

Beispiel Polynome (in R):Ein Polynom besitzt Koeffizienten (Eingenschaft)Ein Polynom kann an einer Stelle x ∈ R ausgewertetwerden (Methode)

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 7: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Beispiel (in Matlab)

classdef Name

properties

coefficients

end

methods

function y = evaluate(obj , x)

y = ... ;

end

end

end

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 8: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Klassen in Matlab (II)

Attribute werden einfach aufgelistestMethoden konnen immer nur auf konkrete Objekte derKlasse angewendet werden (was soll die Auswertungeines abstrakten Polynoms an der Stelle 5 sein?)Aus diesem Grund ist der erste Parameter (hier obj in derevaluate-Methode) einer Klasenmethode immer einkonkretes Objekt der entsprechenden KlasseEs ergibt sich eine Frage: Wie erzeugt man ein konkretesObjekt einer Klasse?

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 9: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Konstruktoren

Antwort: KonstruktorSpezielle Methode, die den gleichen Namen wie die KlassehatRuckgabewert ist ein Objekt der KlasseIm Konstruktor werden die Attribute des Klassenobjekts aufkonkrete Werte gesetztHat als ersten Parameter kein Objekt der Klasse (einsolches soll ja erst erzeugt werden)Eine Klasse kann durchaus mehrere Konstruktoren habenMatlab says No

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 10: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Konstruktoren in Matlab (I)

classdef Polynom

properties

//...

end

methods

// Konstruktor

function obj = Polynom(coeff)

obj.coefficients = coeff;

end

end

end

Attribute werden wie bei struct-Variablen gesetzt

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 11: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Konstruktoren in Matlab (II)

Wird kein Konstruktor angegeben, so wird implizit immerein parameterloser Konstruktor erzeugt, der gar nichts tutAufruf des Konstruktors:

f = Polynom ([1 0 3]);

Das Objekt f ist dann vom Typ Polynom bzw. eine Instanz derKlasse Polynom

Fur das konkrete Objekt f kann dann die evaluate-Methodeaufgerufen werdenZwei syntaktische Moglichkeiten:

evaluate(f, 5) oderf.evaluate(5)

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 12: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Typabfrage

Man kann mittels der Methode isa abfragen, ob ein ObjektInstanz einer gegebenen Klasse istSyntax:

b = isa(f, ’Polynom ’);

Achtung: Matlab kennt kein Typsystem, d.h.:Prinzipiell kann einer Funktion immer ein Objekt einerbeliebigen Klasse ubergeben werdenErst wenn versucht wird, auf ein nicht-existentes Attribut/Methode zuzugreifen, wirft die Laufzeitumgebung einenFehlerUberprufung, ob das Argument vom richtigen Typ ist, mussmanuell geschehen

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 13: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Sichtbarkeiten (I)

Oft sollen Daten nachtraglich von außen nicht mehrgeandert werden konnenEbenso sollen interne Hilfsfunktionen dem Benutzerverborgen bleibenDazu dienen Sichtbarkeitsmodifizierer

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 14: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Sichtbarkeiten (II)

Zu Beginn eines properties- oder methods-Blocks kanngeregelt werden, wer darauf zugreifen darf. MoglicheWerte sind

public: Jeder darf auf die Methoden/ die Atrribute in diesemBlock zugreifenprotected: Siehe spaterprivate: Auf die Methoden/ Attribute in diesem Block kannnur innerhalb der Klasse zugeggriffen werden

Jede Klasse kann mehrere solcher Blocke mitunterschiedlichen Sichtbarkeiten enthalten

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 15: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Sichtbarkeiten (III)

Syntaktisches Beispiel:classdef bla

properties(Access = private)

x

y

end

methods(Access = public)

function y = doSomething(obj)

y = 42;

end

end

methods(Access = private)

function helper(obj)

//Hier passiert nix.

end

end

end

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 16: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Sichtbarkeiten (IV)

Im Beispiel ist dannT = bla;

T.x

nicht mehr erlaubtBei Attributen konnen der Lese- und der Schreibzugriffmittels GetAccess und SetAccess getrennt eingestellt werdenBeispiel:

properties(GetAccess = public , SetAccess = private)

x

y

end

Wird eine Sichtbarkeit nicht explizit angegeben, so wird sieimmer als public angenommen

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 17: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Vererbung (I)

Zweites wichtiges Konzept der OOP: VererbungErlaubt es

bestehende Klassen zu erweiterndie Implementierung einzelne Methoden einer Klasse zuandern (sog. Uberschreiben von Methoden)

Vorteil: Keine Anderungen an bestehendem CodeWird eingesetzt, um Situationen zu modellieren, in deneneine Klasse von Objekten spezieller ist als eine andere

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 18: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Vererbung (II)

Mathematisch angehauchtes Beispiel:Eine Klasse Function beschreibt ganz allgemein dasKonzept einer Funktion (auf R) dar und stellt eine Methodeevaluate zur Auswertung an einer konkreten Stelle zurVerfugungDie Klasse Polynom spezialisiert Function (da jedes Polynominsbesondere eine Funktion ist) und erweitert diese um dasAttribut coefficients (die Koeffizienten sindPolynom-spezifisch), und andert die Implementierung derevaluate-Methode

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 19: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Vererbung in Matlab (I)

Vererbung geschieht durch Angabe der Oberklasse (d.h.der Klasse, von der geerbt werden soll) bei derKlassendefinition:

classdef Klasse < Oberklasse

//...

end

Die Unterklasse hat dann sofort alle Methoden undAttribute der Oberklasse zur Verfugung

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 20: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Vererbung in Matlab (II)

Achtung: Besitzt eine Klasse keinen parameterlosenKonstruktor, so muss als erster Befehl im Konstruktor einerUnterklasse ein Konstruktor der Oberklasse aufgerufenwerden:

classdef Klasse < Oberklasse

methods

// Konstruktor

function obj = Klasse(args)

obj@Oberklasse(Argumente , des ,

Oberklassenkonstruktors);

//...

end

end

end

Stellt sicher, dass alle Atrribute, die von der Oberklassebereitgestellt werden, korrekt initialisiert werden

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 21: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Vererbung in Matlab (Erganzung zu II)

Stimmt nicht ganz!Nur die obj-Variable darf vor dem Aufruf desSuperklassen-Konstruktors nicht verwendet werden!Lokale Variablendefinitionen sind moglichBeispiel

function obj = Klasse(args)

x = 42;

y = 5;

obj@Superklasse(x,y);

end

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 22: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Vererbung in Matlab (III)

Neue Attribute/ Methoden werden durch Definition neuerproperties- und methods-Blocke hinzugefugtBereits vorhandene Methoden werden durch einfacheNeudefinition uberschrieben

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 23: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Vererbung (III)

Spannende Frage: Was bringt’s?Erweiterung von Code moglich, ohne bisherigen Codeandern zu mussenAn Stellen, an denen ein Objekt einer Klasse erwartet wird,ist immer auch ein Objekt einer Unterklasse moglichErbt Klasse von Oberklasse und ist X vom Typ Klasse, so istisa(X, ’Oberklasse’) wahr!Ermoglicht es, eine Unterklasse zu erstellen, die gewisseDinge anders implementiert und diese anstatt derOberklasse zu verwendenDer umliegende Code, der die Klasse verwendet, mussdafur nicht geandert werden

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 24: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Abstrakte Klassen (I)

Manchmal ist die Implementierung einer Methode nichtvon vornherein klar, nur, dass es eine solche geben mussBeispiel Function-Klasse von oben: Die evaluate-Methodemuss vorhanden sein, ihre konkrete Implementierung istaber von der konkreten Art der Funktion abhangigEin Polynom, das uber seine Koeefizienten definiert ist,muss anders ausgewertet werden als eine Funktion, dieuber ein function handle gegeben ist

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 25: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Abstrakte Klassen (II)

Losung: Abstrakte MethodenMethoden ohne ImplementierungStehen in einem speziellen Block

methods(Abstract)

//...

end

Werden ohne das Schlusselwort function, ohneRuckgabewert und ohne Rumpf definiert:

evaluate(obj , x)

Von Klassen mit abstrakten Methoden konnen keineObjekte erzeugt werden, erst von einer Unterklasse, die dieabstrakten Methoden uberschreibt

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 26: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Abstrakte Klassen (III)

Und der Sinn?Abstrakte Klassen stellen eine Art Vertrag, was gewisseObjekte konnen mussenVerschiebt die Implementierung auf spaterErlaubt es, Objekte mit prinzipiell gleichen Fahigkeitenaber unterschiedlicher Implementierung unter einerOberklasse zusammenzufassenIn Funktionen kann ein Objekt der abstrakten Klasse alsArgument erwartet werden, ubergeben werden spaterObjekte konkret implementierter KindklassenErmoglicht abstraktere bzw. allgemeinere Formulierungenvon Methoden

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 27: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Handle-Klassen (I)

Standarmaßiges Verhalten Verhalten von Klassenobjekten:Wird ein solches an eine Funktion ubergeben, so wird eineKopie angelegtWird innerhalb der Funktion ein Attribut geandert, sobetrifft diese Anderung nur die Kopie – das ursprunglicheObjekt wird nicht geandertBeispiel:

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 28: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Handle-Klassen (II)

classdef bla

properties

x

end

methods

function obj = bla(val)

obj.x = val;

end

end

end

function blubb(obj)

obj.x = 42;

end

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 29: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Handle-Klassen (III)

Def AufrufX = bla (5);

blubb(X);

z = X.x

liefert z = 5!Abhilfe: Ableiten von der Klasse handle:

Handle-Klassen werden nur einmal im Speicher angelegtDie Objektvariable ist lediglich ein Zeiger auf das Objekt imSpeicherArbeitet eine Funktion auf einem Handle-Objekt, so arbeitetsie immer auf den Originaldaten – Anderungen nach außenwerden also sichtbar!

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 30: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Handle-Klassen (IV)

Schreibt man also im Beispiel classdef bla < handle, so liefertder Aufruf

X = bla (5);

blubb(X);

z = X.x

hier tatsachlich z = 42.

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 31: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Operatoruberladung (I)

Betrachte wieder die Polynom-Klasse von obenSind f = Polynom([1 0 3]) und g = Polynom([2 3 0 1])

Polynomobjekte, so ware es wunschenswert, wenn auchh = f + g;

ein Polynomobjekt liefert mit passenden KoeffizientenIn Matlab ist das moglich

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 32: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Operatoruberladung (II)

Dazu implementiere in einer Klasse eine Methode miteinem Parameter

function y = mplus(obj , other)

y = ... ;

end

Der Aufruf f.plus(g) bzw. plus(f, g) lasst sich dann ersetzendurch f+g

Analog ermoglicht eine Implementierung von mtimes einenAufrif der Form f * g

Analog fur ” / “, etc.

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 33: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Operatoruberladung (III)

Erlaubt prinzipiell auch das Anwenden von Operatoren aufObjekte unterschiedlicher Typen (z.B. λ · f fur einen Skalarλ und eine Funktion f )Aber Achtung: Problematisch wird’s, wenn f + g fur Objektevon unterschiedlichen Klassen aufgerufen wird, die beidemplus implementieren – welches wird das verwendet??

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 34: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Strukturierung des Quellcodes

Klassen lassen sich in speziellen Ordnern (zum Beispielinhaltlich) gruppierenDer Name eines solchen Ordners ist durch einvorangestelltes + gekennzeichnetIst Klasse eine Klasse im Ordner +Ordner, so lasst siefolgendermaßen ansprechen (wenn der Ordner imaktuellen Matlab-Ordner enthalten ist):

Ordner.Klasse

Beispiel: obj = Ordner.Klasse

Ein solcher Ordner bildet mit den in ihm enthaltenenKlassen ein Package bzw. einen Namensraum

Sebastian Sahli Ein OOP-Crashkurs mit Matlab

Page 35: Objektorientierte Programmierung (OOP) mit Matlab - Ein ... · PDF fileGrundbegriffe (II) Objektorientierte Programmierung (OOP): Programmierstil, der die Objektorientierung umsetzt

Weiterfuhrende Informationen

Gute Anlaufstelle:http://de.mathworks.com/help/matlab/object-oriented-programming.htmlWer wirklich alles wissen will:http://de.mathworks.com/help/pdf doc/matlab/matlab oop.pdf

Sebastian Sahli Ein OOP-Crashkurs mit Matlab