Objektbasierte Entwicklung

Ähnliche Dokumente
Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Einführung in die Java- Programmierung

Vorkurs C++ Programmierung

Java: Vererbung. Teil 3: super()

Programmieren in Java

Java Kurs für Anfänger Einheit 5 Methoden

Objektorientierte Programmierung

2. Semester, 2. Prüfung, Lösung

1 Vom Problem zum Programm

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Einführung in die Programmierung

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

Objektorientierte Programmierung OOP

Software Engineering Interaktionsdiagramme

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Test-Driven Design: Ein einfaches Beispiel

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Aufruf der Buchungssystems über die Homepage des TC-Bamberg

DLLs (dynamic loaded libraries) mit MingW erstellen

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

SJ OFFICE - Update 3.0

Bauteilattribute als Sachdaten anzeigen

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Informatik für Schüler, Foliensatz 21 Objektorientierte Programmierung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Wie kann ein Fondssparplan verwaltet werden? Version / Datum V 1.0 /

ASA Schnittstelle zu Endian Firewall Hotspot aktivieren. Konfiguration ASA jhotel

Primzahlen und RSA-Verschlüsselung

Dr. Monika Meiler. Inhalt

Bedienungsanleitung zum Anlageinventar in der Buchhaltung Gültig ab Version 3.9, November 2009

SEP 114. Design by Contract

Zählen von Objekten einer bestimmten Klasse

Sollsaldo und Habensaldo

Internet Explorer Version 6

EINFACHES HAUSHALT- KASSABUCH

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Updatehinweise für die Version forma 5.5.5

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Zwischenablage (Bilder, Texte,...)

Educase. Release Notes 1.7: Neue Funktionen und Verbesserungen. Base-Net Informatik AG Wassergrabe 14 CH-6210 Sursee

5. Abstrakte Klassen

Arbeiten in der FIBU mit Zahlungsmittelkonten

SEQUENZDIAGRAMM. Christoph Süsens

Online Newsletter III

Installation OMNIKEY 3121 USB

Eine Einführung in C-Funktionen

OLXFil er Anleitung

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Satzhilfen Publisher Seite Einrichten

Suchmaschinen. Universität Augsburg, Institut für Informatik SS 2014 Prof. Dr. W. Kießling 23. Mai 2014 Dr. M. Endres, F. Wenzel Lösungsblatt 6

Datenanalyse - Schnittstellendesign

ecaros2 - Accountmanager

1.2 Buchungen in Fibu Buch.-Blättern

ACDSee Pro 2. ACDSee Pro 2 Tutorials: Übertragung von Fotos (+ Datenbank) auf einen anderen Computer. Über Metadaten und die Datenbank

Saldo-Konto eines Mitarbeiters korrigieren

Zahlenwinkel: Forscherkarte 1. alleine. Zahlenwinkel: Forschertipp 1

ONLINE-AKADEMIE. "Diplomierter NLP Anwender für Schule und Unterricht" Ziele

ZAHLUNGSAVIS. Im Zahlungsprogrammteil automatisch erstellen

Grundlagen von Python

Adobe Photoshop. Lightroom 5 für Einsteiger Bilder verwalten und entwickeln. Sam Jost

Kapitel 6. Vererbung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Klicksparen. Einrichtung und Nutzung von Klicksparen am Beispiel vom iphone Hamburg,

COPPPS Software und Services seit 1972 Software und Services aus einer Hand

SANDBOXIE konfigurieren

Alltagsnotizen eines Softwareentwicklers

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

PVL 3 - Roulette. (5 Punkte) Abgabe bis

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Anmeldung als Affiliate bei Affilinet

Sichere Anleitung Zertifikate / Schlüssel für Kunden der Sparkasse Germersheim-Kandel. Sichere . der

Programmierkurs Java

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Einführung in die C-Programmierung

Dokumentation für das Spiel Pong

Teaser-Bilder erstellen mit GIMP. Bildbearbeitung mit GIMP 1

SEPA-Anleitung zum Release 3.09

Der lokale und verteilte Fall

Ohne Fehler geht es nicht Doch wie viele Fehler sind erlaubt?

Abituraufgabe zur Stochastik, Hessen 2009, Grundkurs (TR)

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

SWE5 Übungen zu Software-Engineering

Objektorientierte Programmierung

Archiv - Berechtigungen

Anleitung zum Einspielen der Demodaten

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Einführung in die Programmierung

Vorgehensweise bei Lastschriftverfahren

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Robot Karol für Delphi

Transkript:

Embedded Software Objektbasierte Entwicklung Objektorientierung in C? Prof. Dr. Nikolaus Wulff

Objektbasiert entwickeln Ohne C++ wird meist C im alten Stil programmiert. => Ein endlose while-schleife mit C Funktionen. Eine Software Architektur in C erlaubt dennoch Module mit einem Geheimnisprinzip, private und öffentliche Methoden und die Abstraktion einer Klasse mit instanziierten Objekten. Bei C handelt es sich nicht um echte Klassen, statt dessen werden diese mit C-structs emuliert. Dieses Vorgehen ermöglicht es eine objektbasierte Anwendung mit entsprechenden Design Mustern und Abstraktionen zu entwickeln. Prof. Dr. Nikolaus Wulff Embedded Software 2

ADT in C Objekte mit gemeinsamen Attributen und Verhalten werden als Instanzen einer Klasse modelliert. Beispiele: Konto, Kunde, Buchung etc. C kennt zwar keine Klassen, es lassen sich jedoch mit Strukturen entsprechende Abstrakte Datentypen definieren. Prof. Dr. Nikolaus Wulff Embedded Software 3

Klassen in C Gemeinsame Attribute lassen sich in C mit Hilfe einer Struktur in einer *.h Datei definieren: struct konto_struct { char* waehrung; char* kontonr; double saldo; }; Das gemeinsame Verhalten aller Konto Instanzen wird durch entsprechende Methoden abgebildet: extern double getsaldo(struct konto_struct* konto); Prof. Dr. Nikolaus Wulff Embedded Software 4

C Strukturen Die im Header deklarierten Strukturen und Methoden stellen die öffentliche Schnittstelle der modellierten Klasse da: Zwei Attribute kontonr, saldo sowie die Methode getsaldo. Damit die Methode auf dem jeweiligen Konto operieren kann wird eine Referenz auf die Struktur des Kontos übergeben. Die Implementierung in Konto.c ist trivial: #include "Konto.h" double getsaldo(struct konto_struct* konto) { return konto->saldo; } Prof. Dr. Nikolaus Wulff Embedded Software 5

Verwendung der C Klasse Die Verwendung dieses ADT könnte so aussehen: #include <stdio.h> #include "Konto.h" int main(int argc, char* argv[]) { struct konto_struct konto = {"Euro","08-a",10000}; printf("konto %s hat ein Saldo von %f %s\n", getkontonr(&konto), getsaldo(&konto), getwaehrung(&konto) ); } return 0; Prof. Dr. Nikolaus Wulff Embedded Software 6

Eigene Typen definieren Lästig ist die Pointer Arithmetik und das Offenlegen der Struktur. Hier erweist sich die Definition eines eigenen Typen per typedef als nützlich: typedef struct konto_struct* Konto; Die Methode double getsaldo(struct konto_struct* konto); kann dann prägnanter geschrieben werden als: double getsaldo(konto konto); Prof. Dr. Nikolaus Wulff Embedded Software 7

Verwendung des ADTs #include <stdio.h> #include <stdlib.h> #include "Konto.h" int main(int argc, char* argv[]) { Konto konto = newkonto(euro, "0815-567", 10000); printf("konto %s hat ein Saldo von %f %s\n", getkontonr(konto), getsaldo(konto), getwaehrung(konto) ); } free(konto); return 0; Konten sind jetzt Pointer und erfordern malloc und free! Prof. Dr. Nikolaus Wulff Embedded Software 8

Klassen erweitern Die Methode getsaldo erscheint auf dem ersten Blick überflüssig, das Attribut saldo kann auch direkt der Struktur entnommen werden... Was ist jedoch bei unterschiedlichen Ausprägungen von Konto, z.b. einem Fremdwährungskonto bei dem der aktuelle Wert berechnet werden muss? Hierzu muss die Kontostruktur entsprechen erweitert werden. Prof. Dr. Nikolaus Wulff Embedded Software 9

Vererbung in C Das Fremdwährungskonto ist eine Spezialisierung eines Kontos mit zusätzlichen Attributen und nach außen gleichem Verhalten: typedef struct fremdwaehrungs_konto_struct { char* waehrung; char* kontonr; double saldo; double konvertierung; } *FremdKonto; Ein solches Fremdkonto kann wie ein Konto verwendet werden. Es muß jedoch die getsaldo Methode anders darauf reagieren. Prof. Dr. Nikolaus Wulff Embedded Software 10

Methoden erweitern Die Methode getsaldo reagiert je nach Kontoausprägung unterschiedlich: double getsaldo(konto konto) { double saldo = konto->saldo; if (!strcmp(euro, konto->waehrung)) { } saldo *= ((FremdKonto)konto)->konvertierung; } return saldo; Handelt es sich um ein Fremdwährungskonto wird gecasted und entsprechend umgerechnet. Prof. Dr. Nikolaus Wulff Embedded Software 11

Weitere Verbesserungen Es ist sicherlich ungeschickt die Verzweigung ob es ein Fremdwaehrungskonto ist oder nicht an einem Stringvergleich fest zu machen. Besser ist hier z.b. ein Enum Type: typedef enum {euro, foreign} Currency; Prof. Dr. Nikolaus Wulff Embedded Software 12

Das Methoden Problem Es stört, das die Methode getsaldo für jede mögliche Kontoart anders reagieren muss. Die Alternative zwei unterschiedliche Methoden getsaldo und getsaldofremdwaehrung zu implementieren klingt auch nicht gut, denn der aufrufende Client sieht dann nicht mehr eine einheitliche Konto Schnittstelle. Hierzu bietet es sich an die Methoden zu überladen und an den jeweiligen Kontostrukturen zu verankern. C kennt hierzu das Konstrukt eines Pointers auf eine Methode. Prof. Dr. Nikolaus Wulff Embedded Software 13

Function Pointer Die aufzurufende Methode wird direkt an der Struktur notiert: struct konto_struct { char* waehrung; char* kontonr; double saldo; double (*getsaldo)(konto konto); }; Beim Erzeugen der unterschiedlichen Konto Typen muß im newkonto Konstruktor der Pointer auf eine entsprechende Methode gesetzt werden. Prof. Dr. Nikolaus Wulff Embedded Software 14

Überladene Methoden Die Methoden werden mit dem static Attribute auf private gesetzt und sind von außen nicht aufrufbar: static double geteurosaldo(konto konto) { double saldo = konto->saldo; return saldo; } static double getforeignsaldo(konto konto) { double saldo = konto->saldo; saldo *= ((FremdKonto)konto)->konvertierung; return saldo; } Prof. Dr. Nikolaus Wulff Embedded Software 15

Ein C Konstruktor Konto newkonto(char* waehrung, char* kontonr, double saldo) Konto konto; if (!strcmp(euro, waehrung) ) { konto = (Konto) malloc(sizeof(struct konto_struct)); konto->getsaldo = geteurosaldo; } else { konto = (Konto) malloc(sizeof(struct fremdwaehrungs_konto_struct)); konto->getsaldo = getforeignsaldo; } konto->waehrung = waehrung; konto->kontonr = kontonr; konto->saldo = saldo; return konto; } Prof. Dr. Nikolaus Wulff Embedded Software 16

Transparenter Methodenaufruf Der Aufruf der unterschiedlichen Konten ist jetzt bis auf den Konstruktor identisch: Konto konto = newkonto(euro, "0815-567",10000); Konto fremd = newkonto(usd, "0845-56", 500); printf(" EuroKonto %f \n", konto->getsaldo(konto) ); printf(" FremdKonto %f \n",fremd->getsaldo(fremd) ); Beim Fremdkonto wird jedoch automatisch eine andere Implementierung der getsaldo Methode aufgerufen, ohne das der Aufrufer diese bemerkt! Prof. Dr. Nikolaus Wulff Embedded Software 17

Doppelte Verkettung Was stört, ist die doppelte Verwendung der Konto Struktur: konto->getsaldo(konto); Zum einen enthält die Kontostruktur den Pointer auf die zu verwendende Methode, zum anderen benötigt diese Methode genau die Attribute der Struktur zum Berechnen des Saldos... Hier kann der Präprozessor kosmetisch helfen: #define actualsaldo(k) (k)->getsaldo((k)) printf(" Saldo von %f \n", actualsaldo(konto) ); Prof. Dr. Nikolaus Wulff Embedded Software 18