Objektorientierte Programmierung (OOP) mitMatlab - Ein Crashkurs
Sebastian Sahli
31. Mai 2016
Sebastian Sahli Ein OOP-Crashkurs mit Matlab
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
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
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
Klassen in Matlab
In Matlabclassdef Name
properties
// Attribute kommen hierhin
end
methods
// Methoden kommen hierhin
end
end
Sebastian Sahli Ein OOP-Crashkurs mit Matlab
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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