Wozu Objektorientierung?

Hallo www-ler,

ich hoffe, daß hier jemand Licht in mein Dunkel bringen kann:

Alle Welt redet zur Zeit von objektorientierter Programmierung nur kann mir keiner in meinem Umfeld erklären, wozu das ganze gut sein soll.
Wozu brauche ich Klassen, Objekte und so weiter?

Ich programmiere zur Zeit in PHP und hab mal TurboPascal gelernt, da kann ich doch auch „alles“ programmieren?

Vielen Dank
Harry

Alle Welt redet zur Zeit von objektorientierter Programmierung
nur kann mir keiner in meinem Umfeld erklären, wozu das ganze
gut sein soll.
Wozu brauche ich Klassen, Objekte und so weiter?

Ich programmiere zur Zeit in PHP und hab mal TurboPascal
gelernt, da kann ich doch auch „alles“ programmieren?

Hallo Harry!

Die Idee der Objektorientierung besteht darin, definierte Schnittstellen zwischen den Klassen zu schaffen Implementierungsdetails lassen sich (z.B. gegenüber Kunden) verbergen. Auch lässt sich die Implementierung problemlos ändern, solange die Schnittstelle der Klasse erhalten bleibt.

Dieses Konzept ermöglicht auch eine weitgehende Wiederverwendbarkeit ganzer Klassen, sowie eine Spezialisierung durch Vererbung von Eigenschaften und Methoden.

Es geht also nicht darum, etwas programmieren zu können, dass ohne Objektorierung nicht möglich wäre. Die objektorientierte Implementierung ist für meinen Geschmack jedoch sauberer und einfacher verständlich. Die Vorteile werden allerdings erst dann richtig Sichtbar, wenn die Projekte nennenswerte Umfang annehmen - sowohl was den Quellcode angeht als auch die Anzahl der Entwickler.

Für mehr Informationen solltest Du mal nach einem Tutorial oder Literatur zum Thema „Einführung in die objektorientierte Programmierung mit Java“ o.ä. Ausschau halten.

Falls Du tiefer einsteigen möchtest:
Design Patterns, ISBN: 0201633612 Buch anschauen

Für obiges Buch sind Kenntnisse einer OO-Sprache (z.B. Java) jedoch erforderlich.

CU
Markus

Hallo Harry,

die genaue Definition von Objektorientierung konnte ich leider nicht mehr finden, aber im Groben und Ganzen sagt diese folgendes aus: Mit der Objektorientierung versucht man die Dinge und Vorgänge der realen Welt nachzubilden.

Das beste Beispiel dafür ist die Natur:
Es gibt verschiedene Klassen, aus denen wiederum andere Klassen abgeleitet sind, z.B. ist die Klasse der Säugetiere von der Klasse Lebewesen abgeleitet. Auch die Klasse Vogel ist von dieser Klasse Lebewesen abgeleitet.

Die Klasse Lebewesen stellt dabei verschiedene Methoden und Attribute bereit, z.B. die Methoden leben() und sterben() und das Attribut lebensdauer.

Abgeleitete Klassen implementieren jedoch diese Methoden anders und setzen auch die Attribute anders.
Eine von der Klasse Säugetier abgeleitete Klasse Mensch implementiert z.B. die Methode leben() anders, als die Klasse Vogel. Auch die lebensdauer ist bei Objekten dieser Klasse anders.

Die abgeleiteten Klassen können wiederum eigene Attribute und Methoden besitzen, die die Superklasse, also die Vaterklasse, nicht besitzt.
So wird z.B. bei der Klasse Mensch eine Methode sprechen() implementiert sein, die bei der Vaterklasse Säugetier keinen Sinn macht, da z.B. ein Objekt der Klasse Tiger, welche ja auch von Säugetier abgeleitet ist, diese Methode nicht implementiert bzw. benötigt.

Das Ganze kann man jetzt natürlich noch viel weiter verfeinern.
Es bildet sich also eine riesige Hierarchie.

Die Kommunikation unter den einzelnen Klassen, wenn sie denn stattfinden soll, findet dann über wohldefinierte Schnittstellen statt.

Dabei kann man solch eine Überlegung auf eigentlich alles anwenden, z.B. auch auf einen PC. Dieser ist aus verschiedenen Objekten aufgebaut, einem Netzteil, einer Festplatte, einer CPU, …

Da die Kommunikations-Schnittstellen in einem PC genormt sind, kann man z.B. die Objekte austauschen und trotzdem funktioniert das Ganze in sich (zumindest bei PCs _sollte_ es so sein *g).
Man kann also ein CD-ROM-Laufwerk durch einen CD-Brenner ersetzen, hat im Prinzip keinen großartigen Aufwand betrieben und plötzlich viel mehr Funktionalität.

Ähnlich bei einem Auto, bei dem man einen stärkeren Motor einbaut.

Bei strukturiertem Programmieren wird im Prinzip für jedes Problem eine eigene Lösung gefunden und der Code ist danach nur bedingt wiederverwendbar.

Bei der Objektorientierung kann der Code, solange er wohldefinierte Schnittstellen und gutüberlegte Klassenstrukturierung aufweist, immer wieder verwendet werden.
So kann z.B. der Code einer Klasse Kunde in einer Bank, in einem Supermarkt oder auch in einem Reisebüro verwendet werden.
Kunde hat immer bestimmte Eigenschaften (Attribute) und Funktionen (Methoden). Wenn man zusätzlich welche benötigt, dann kann man z.B. eine Klasse BankKunde ableiten, die die zusätzlichen Attribute kontonummer und kreditWürdigkeit hat.
Die Attribute vorname, nachname, geburtsdatum und anschrift erbt sie jedoch von der Vaterklasse.

Wenn man die Objektorientierung einmal verstanden hat, so sieht man bei genauerem Hinsehen an jedem Tag unzählige Objekte, Methoden, Attribute, …

Ich hoffe, meine Erklärung war einigermaßen verständlich.
Ciao, Bill

Ein Lehrer eines Seminars hatte mir mal gesagt das man von Natur aus objektorientiert denkt…

Nur mal als Anmerkung :smile:

Wozu brauche ich Klassen, Objekte und so weiter?

wenn du es nicht vermißt, brauchst du es auch nicht :smile:

Ich programmiere zur Zeit in PHP und hab mal TurboPascal
gelernt, da kann ich doch auch „alles“ programmieren?

sicher, wenn du unendlich viel zeit hast weil du ohne termindruck arbeitst ist das ok.

stell dir folgendes vor.
zu einem datenbankserver gibts ein API vom hersteller mit dem man dessen objekte (datenbanken, dokumente, felder etc.) manipulieren kann.

du schreibst also einfach ein programm das dieses API einbindet und benutzt die objekte so, wie sie lt. dokumentation benutzbar sind.
z.b.
Database Db = new database(string Srv)…

Db.open(optionen…

usw. das ist doch einfacher als wenn du die prozeduren einer DLL einzeln aufrufen müßtest und jedesmal prüfen mußt, ob ein errorcode zurückgeliefert wurde oder nicht - bei C++ könntest du einfach einen try-catch block benutzten … dadrin die aufrufe um die datenbankobjekte zu manipulieren und fertig.
wie lange willst du an so einem trivialen problem prozedural programmieren ??

objekt orientiert hat noch den vorteil, dass der compiler sofort fehler anzeigt, wenn du mit einem objekt etwas tust, das dieses objekt garnicht „kann“ … z.b. Db.selfdestruct()
(obwohl es die funktion selfdestruct() vielleicht global geben würde)

war das einleuchtend genug ?

wenn nicht, schau dir mal die Windows BeispielProgramme im WindowsSDK an … main() … haufenweise Funktionen um irgendwelche Standardinge zu registrieren, die du in jedem Programm immer und immer wieder hinschreiben müßtest …
wenn jemand anderes das für Dich macht und z.b. eine Klasse erstellt TApplication (Borland C++) dann erstellst du davon ein Objekt und benutzt es - fertig. ist übersichtlicher und fehlerunanfälliger.

STK

Hallo,

erstmal vielen vielen Dank für Eure ausführlichen Antworten!

Jetzt stellt sich mir die nächste Frage:
Wenn ich mir z.B. in PHP ein Funktion schreibe und die in mehrere Dokumente „include“, ist das dann auch objektorientierte Programmierung?
Wenn nein, dann wären die ganzen Vorteile von z.B. Java für die Katz, denn ich kann ja mit PHP dasselbe machen?

Danke und Grüße
Harry

Wenn ich mir z.B. in PHP ein Funktion schreibe und die in
mehrere Dokumente „include“, ist das dann auch
objektorientierte Programmierung?

nein