Frage von DennisHere, 61

Sinn - Objektorientierte Programmierung?

Hallöchen, könnte mir jemand ein paar Beispiele nennen, wieso Objektorientierte Programmierung vorteilhaft sein mag?

Ich meine.. z.B In C gab es keine OOP, und es ist trotz dem eine mächtige Sprache...

Ich möchte ja gerne mit C# anfangen, habe auch schon die Basics gelernt, aber das OOP kommt mir nicht in den Kopf... Ich weiss einfach nicht wozu...

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TeeTier, Community-Experte für programmieren, 40

Die Antworten von den üblichen Verdächtigen (Roderic, PWolff, grtgrt, PerfectMuffin) sollten dir genug anhaltspunkte geben, aber eine Kleinigkeit ist mir beim Überfliegen nicht aufgefallen, die jedoch erwähnenswert ist:

Nur weil ein Programm in C geschrieben ist, heißt das noch lange nicht, dass es nicht auch objektorientiert ist!

OOP ist in erster Linie keine Spracheigenschaft, sondern ein Konzept, welches sich mit (nahezu) jeder Sprache umsetzen lässt. Selbst mit Assembler!

Syntaktischen Zucker, wie bei einer "richtigen" OOP-Sprache, und vor allem erweiterte Features gibt es dann zwar nicht, bzw. diese sind u. U. überaus kompliziert zu implementieren, und oftmals geht dadurch der eigentliche Sinn der OOP verloren, aber gerade C ist für die Objektorientierung prädestiniert! (auch wenn das jetzt komisch klingen mag)

Wenn es einem z. B. nur auf Kapselung in Klassen ankommt, und man ausgereifte Vererbung außen vor lässt, so lässt sich ein Programm sehr schnell und sauber, ohne zusätzlichen Ballast, OOP-fähig machen.

Gerade im embedded Bereich greift man oft auf diesen Trick zurück, wenn die Plattform entweder sehr schwach ist, oder einfach kein C++ Compiler vorhanden ist.

Und viele (gerade größere) Programme, sind zwar in C geschrieben, benutzen unter der Haube aber oft eine Makrobibliothek, oder sogar eine Art eigenen Präprozessor (so ähnlich wie Qt auch), um die Programmiersprache mit Features anzureichern.

Wenn du dich dafür interessierst, such mal bei Google nach "ooc.pdf". Das ist eine Art Schritt-für-Schritt Anleitung, wie man seine ANSI-C-Programme mit C++ Features versehen kann.

Allerdings habe noch niemals wirklich alle Tricks benötigt, die dort vorgestellt werden. In den meisten Fällen reichen die ersten paar Seiten aus. Aber das hängt wohl auch immer von der Komplexität ab.

Darüber hinaus benutze ich einen völlig anderen OOP Ansatz für C Programme, als in dem vorgestellten PDF-Buch, da mir dort vieles kontraproduktiv und überladen erscheint. Zum Beispiel vermeide ich es tunlichst, Dritttools für diesen Zweck einzusetzen. Ein einfaches sed ist mir da schon viel zu viel Abhängigkeit. Im Zweifelsfall verzichte ich lieber auf ausgefeilte OOP-Features, anstatt mich in Tool-Abhängigkeiten zu verwickeln.

Reines ANSI-C und die völlige Unabhängigkeit von Drittsoftware ist für mich persönlich ein absolutes Muss, zumindest im Bezug auf die OOPisierung. (auf Drittbibliotheken habe ich logischerweise keinen Einfluss)

Da C aber im Gegensatz zu C++ keinen bereits erwähnten Syntaktischen OOP-Zucker bietet, muss man tierisch aufpassen, es nicht zu übertreiben. Sonst landet man in der Makro-Hölle, aus der man nie wieder heraus findet. :)

Und noch ein anderer kleiner Hinweis: Außer OOP gibt es noch andere sehr mächtige Techniken, um in C sauber programmieren zu können. Zum Beispiel einige Tricks, die man sich aus dem Linux-Kernel abschauen kann. Aber das würde den Rahmen jetzt sprengen, deshalb nur die Randbemerkung.

Auf jeden Fall kann man sehr elegant auch mit reinem C programmierern, allerdings sollte man das nur tun, wenn man wirklich keine andere Wahl hat, da ordentlicher C++-Code in jedem Falle sauberer, kürzer, effizienter und einfach schöner sein wird. (die Wartbarkeit ist unglaublich wichtig)

Zum Beispiel bietet C++ ja Exception-Handling, aber ein eigenes Exception-Handling in reinem ANSI-C sind einfach nur Makros um setjmp und longjmp, die im einfachsten Falle wirklich nur DREI kurze Einzeiler erfordern, um in seinen C-Programmen try, throw und catch verwenden zu können. Will man jetzt noch finally und verschiedene Exception-Typen unterstützen, sind es fünf bis sechs Zeilen Makrocode. (Es gibt auch Makrobibliotheken für ANSI-C, die noch viel mehr Exception-Features bieten, als C++14 zu bieten hat, und sich teilweise sogar Features von Python & Co klauen! Muss jeder selbst wissen, ob er so etwas braucht, oder eben nicht.)

Fazit: Wenn man kann, und wenn es sowohl die Plattform als auch die Anforderungen erlauben, sollte man ruhig die "höchstsprachige Hochsprache" wählen, die man finden kann. Das ist aber oft nicht möglich. Aber in so einem Falle kann man immer noch C mit Features anreichern, sei es durch Makros, eigene Tools zum Meta-Interpreter (Stichwort DSL) oder einfach nur Paradigmen und Konventionen. An die muss man sich dann natürlich auch strikt halten können!

Man darf bei alle dem aber nie den Sinn und Zweck aus den Augen verlieren: nämlich eine gesteigerte Übersichtlichkeit und Ordnung. Besonders Einsteiger neigen bei C sehr stark dazu, es - vor allem mit Makros - zu übertreiben.

Also dann viel Spaß mit C# oder C++ oder was auch immer du als nächstes lernen willst, aber vergiss nicht, dass OOP nur ein Konzept ist, keine Spracheigenschaft. (auch wenn viele Sprachen dieses Konzept durch besondere Syntax unterstützen)

Schönen Abend noch! :)

Kommentar von Omnivore08 ,

Sehr poetisch :-) Däumchen :)

Kommentar von Roderic ,

...da schließ ich mich an ;-)

Kommentar von DennisHere ,

Vielen Lieben Dank! :-)

Antwort
von PWolff, 53

Jede Sprache, die Turing-Vollständig ist, kann dieselben Probleme lösen.

Also auch Assembler oder eine Turing-Maschine mit ihrem ewig langen Papierstreifen.

Bestimmte Dinge lassen sich aber mit bestimmten Methoden einfacher, schneller, übersichtlicher, und/oder ... erledigen.

-----

Zum einen hat man bei einem Objekt alles, was damit zusammenhängt, weitgehend gebündelt.

Zum anderen passiert es nicht so leicht, dass jemand versehentlich eine Variable des Objekts überschreibt.

Ein Gedanke, der dahinter steht, ist, "soll sich doch jeder um seinen eigenen Mist kümmern - objektorientiertes Programmieren ist modulares Programmieren zum Quadrat.

Kommentar von PWolff ,

Als ich in der Schule programmieren gelernt habe, gab es gerade mal Unterprogramme, aber alle Variablen waren global.

Deshalb musste man bei jedem Unterprogramm tierisch aufpassen, dass man nicht versehentlich eine Variable des Hauptprogramms überschrieb.

Mit dem Konzept der Modularität konnte dann jedes Unterprogramm seine eigenen Variablen haben und eine der häufigsten Fehlerquellen war beseitigt.

Nach der Modularität kamen "Strukturen", das sind Zusammenfassungen mehrerer Variablen. Das ist sozusagen die Vorstufe der Objekte.

Davor hatte man persönliche Daten so gespeichert (ich nehme mal BASIC, weil das damals im wesentlichen die einzige Programmiersprache war, die Heimanwendern zur Verfügung stand):

Dim Vorname$(20)
Dim Nachname$(20)
Dim StrasseHausnr$(20)
Dim Geburtsdatum(20)

Wenn man jetzt eine Adresse in eine andere kopieren wollte, musste man jedes Element einzeln übertragen:

Vorname$(i) = Vorname$(j)
Nachname$(i) = Nachname$(j)
usw.

Wenn man dann z. B. StrasseHausnr aufspalten wollte in Strasse und Hausnr, musste man den kompletten Code durchgehen und überall aus einer Zeile zwei machen.

Mit Strukturen ging vieles einfacher (die hatten verschiedene Namen, ich nehme die Bezeichnung "Type" von Visual Basic):

Type PersonTyp
Vorname$
Nachname$
StrasseHausnr$
Geburtsdatum
End Type
Dim Person(20) As PersonTyp
...
Person(i) = Person(j)

Mit der Objektorientierung kam zum einen dazu, dass Prozeduren, die dieselben Variablen verwendeten, an einer Stelle zusammengefasst wurden, zum anderen - und das ist m. E. wichtiger - gab es jetzt Variablen, die nicht global (also von überall her versehentlich überschreibbar) waren und trotzdem länger "leben" konnten als eine Prozedur lief.

Später kam noch Vererbung dazu, d. h. ein Objekt gehörte nicht nur einer bestimmten "Klasse" (Objektvorlage mit Variablen und "Methoden" (Unterprogrammen)) an, sondern eine Klasse konnte auch von einer anderen "Klasse" erben. Hierzu verweise ich auf https://www.gutefrage.net/frage/kurze-erklaerung-fuer-objekte-klassen-und-vererb...

Diese Konzepte werden ständig weiterentwickelt; dazu liest du am besten einschlägige Literatur und/oder arbeitest an größeren Projekten mit.

Kommentar von DennisHere ,

Vielen lieben Dank!:)


Könntest du mir C als Anfänger empfehlen? Ich mein, ich bin noch Schüler, und mache keine riesen Projekte... :)

Oder ist VB Besser?  Wenn es keine OOP hat..?

Weil, dies ist mir wirklich schwer damit^^  

Ich verstehe da kaum etwas, trotz allen Tutorials:)

Kommentar von PWolff ,

VB kennt sehr wohl Klassen und seit VB.NET auch selbstdefinierte Klassen mit Vererbung.

Aber man kann in fast allen Sprachen programmieren, ohne zu wissen, was eine Klasse und ein Objekt ist.

VB hat m. E. gegenüber C den Vorteil, dass die ganze Speicherzuordnung etc. vor dem Programmierer verborgen ist, so dass man sich nicht auch noch damit herumschlagen muss.

Mit welcher Programmiersprache man am besten anfängt, kann ich nicht mehr sagen, dazu habe ich zu viel Erfahrung mit Programmieren im Allgemeinen. Vielleicht schaust du dir aber auch mal SimpleBasic an, das soll speziell für Anfänger entwickelt worden sein - es hat nur die wichtigsten Möglichkeiten und ist damit wesentlich übersichtlicher als die sehr umfangreichen professionellen Entwicklungsumgebungen.

Kommentar von DennisHere ,

Dankeschön:)

Antwort
von nintendoluk, 22

Kurz und knapp: Objektorientierung erleichtert das Programmieren für den Entwickler. Dadurch dass es Realitätsnaher ist, kamm man, v.a. bei großen Projekten, sich das Programm besser vorstellen. Zudem spart man sich durch Vererbung und ähnliches viele Redundante Codeschnipsel, was die spätere Wartung stark vereinfacht.

Warum C immer noch so mächtig ist? Ganz einfach: Bei der OOP muss der PC "umdenken", was für ihn etwas mehr Rechenleistung benötigt.

Prozedurale Programme dagegen sind schon so, wie sich der Computer am besten "vorstellen" kann, dafür muss der Entwickler umdenken.

Deshalb ist v.a. für Programme, wo jedes bisschen Leistung zählt (z.B. Micro-Controller), C die Sinnvollste Sprache.

Antwort
von Roderic, 41

Der Nutzen von OOP erschließt sich erst dann richtig, wenn man eine umfangreiche Objektbibliothek entwickelt oder nutzt.

Je umfangreicher umso nützlicher.

Ab einem gewissen Grad an Komplexität geht es einfach nicht mehr ohne OOP.

Beispiele: Die Bibliotheken aller modernen grafischen Oberflächen - oder mathematische Bibliotheken, die Strukuren aus der Algebra modellieren.

Kommentar von DennisHere ,

Dankeschön!:)

Hat Visual Basic denn OOP?^^

Kommentar von xXFaiLeRXx ,

Ja

Antwort
von grtgrt, 61

OOP wird wichtig, wenn man sehr umfangreiche Programme zu erstellen hat, denn:

  • In C gibt es nur den globalen Namensraum und die lokalen Namensräume, zur Implementierung jeweils einer Funktion. Dies hat sich als viel zu wenig erwiesen.
  • OOP kann Code dramatisch reduzieren (genauer: von Redundanz befreien) über seinen Vererbungsmechanismus.
  • Unter OOP ist jede Methode einem Datentyp zugeordnet, so dass schon von daher sehr weitgehend klar ist, welchem Zweck sie dient. In C wäre sie eine Funktion, deren Zweck zu erfahren, man entsprechenden Kommentar lesen müsste. Der aber fehlt meist oder sagt zu wenig, da viele Programmierer zu wenig Code-Dokumentation schreiben.
Kommentar von grtgrt ,

Kurz: Für kleine Programme, wie sie typischer Weise Schüler schreiben, brächte man tatsächlich kein OOP. 

Zum Erstellen und Verstehen großer Programmsysteme aber, an denen meist ganze Teams von Software-Architekten, Programmierern und Testern arbeiten, sind OOP, OOD, ja oft sogar OOA heute wirklich unentbehrlich geworden.

Kommentar von mrhashpipeotto ,

naja, definieren kleine programme. der linux kernel, git, doom und tausend andere programme / spiele sind in reinem c geschrieben und sind alles andere klein, auch ohne OOP lassen sich wunderbar komplexe programme mit teams schreiben, genauso lässt sich mit einer OO sprache unwartbarer spaghetticode programmieren, alles vielmehr eine frage des programmierers als des eingesetzten paradigmas....

Linus Torvals: "C++ is a horrible language..."

article.gmane.org/gma%3Cne.comp.version-control.git/57918

Kommentar von grtgrt ,

Natürlich kann man jedes Programm auch einfach in C implementieren. Nur ist das halt meist mühsamer.

Linus Torvalds übrigens hat mit C++ begonnen. Erst als ihm bewusst wurde, dass der GNU C++ Compiler gcc damals noch sehr viele Fehler enthielt, stieg er um auf C (das hat er selbst so gesagt).

Dass er auf C umstieg, war gut, denn ein Betriebssystem sollte man wirklich in einer Sprache schreiben, die so performanten Code wie nur irgend möglich liefert.

Kommentar von grtgrt ,

Nebenbei noch: Viel von dem, was Linus über C++ sagt, sehe ich ebenso. Genau aus dem Grund benutze ich selbst nur ein kleines Subset von C++, welches kaum mehr als C erweitert um das Klassenkonzept ist.

Insbesondere halte auch ich die STL für "crap" und teile Linus Meinung, dass viel von dem, was eingefleischte C++ Programmierer so produzieren, zu schwer verständlichen Code darstellt: Sie übertreiben die Verwendung des Vererbungsprinzips.

Wirklich schön und perfekt abgerundet findet sich der objekt-orientierte Programmieransatz erst in Java.

Kommentar von DennisHere ,

Danke für diese Antworten!:)   

Ich bin selbst noch Schüler, und Anfänger, komme frisch aus Batch ^^

Meint ihr, C lohnt sich als Anfängersprache?:-)

Kommentar von grtgrt ,

Mit Sicherheit - aber nutze dazu dennoch einen C++ Compiler, was dann dem Ansatz meinC entspricht, der sich erläutert findet in den Kommentaren zur Antwort https://www.gutefrage.net/frage/programmiersprache-c-richtig-lernen-aber-wie#ans... .

Antwort
von wolfgang1956, 10

Sinn - Objektorientierte Programmierung?

Alleine die Fragenstellung ist grundsätzlich falsch! Man sollte niemals nach dem „Sinn“ fragen. Dann kann man immer – wie in diesem Fall – sagen: OOP ist sinnlos und es erübrigen sich alle weiteren Fragen! Genau das ist wohl hoffentlich nicht der „Sinn“ deiner Frage!!

OOP ist eines von vielen Konzepten, die in der Programmierung angewandt werden. Es soll wie viele dieser Ansätze das Programmieren „vereinfachen“.

Ein Rückgriff auf die „Geschichte der Programmierung“ kann in diesen Fragen allerlei Hinweise geben:

Wenn man sich die ersten einfacheren Mikroprozessoren betrachtet, so wurden sie zunächst in „ihrer“ Assemblersprache programmiert. Auf diese Assemblersprache werden alle „höheren“ Programmiersprachen wie Basic, C, Modula, C++, Swift, Java … zurückgeführt, wenn ein in diesen Sprachen geschriebenes Programm compiliert wird.

Leider hat man bei den Lehrbüchern zu den genannten imperativen wie oo Programmiersprachen immer wieder das Gefühl, die Bücher würden im didaktischen Konzept voneinander abgeschrieben und dass nicht jeder Autor unbedingt auch ein guter Lehrer ist (fehlerhafte Beispiele).

Vielleicht liegt dies auch daran, dass man das Programmieren zwar mit Beispielen erläutern kann, aber man kann es nicht „lehren“. Die Schüler können es nur „lernen“. Entweder der Programmierer kapiert in seiner Praxis, worauf es ankommt oder er lernt es nie!

Antwort
von sssssss, 12

Alle schreiben hier einen elendslangen Text kurz und bündig: Alles in C# ist ein Objekt, beim objektorientierten Programmieren hast du Klassen abgekapselte Programmteile, so kannst du leichter hinzufügen oder entfernen (Code) und für andere Programmierer is es übersichtlicher und für dich auch

Antwort
von PerfectMuffin, 58

Die meisten fortschrittlichen Programme basieren sehr auf verketteten Datenstrukturen, deren Bearbeitung mit OOP sehr viel intuitiver möglich ist.

Außerdem lässt sich damit sehr gut modular programmieren.

Kommentar von grtgrt ,

Mit verketteten Datenstrukturen haben OOP -- oder Objektorientiertheit insgesamt -- eher wenig zu tun.

Was du wahrscheinlich meinst, ist die Tatsache, dass sich bei schwierig zu implementierender Datenstruktur viel von der rein implementierungstechnisch vorhandenen Komplexität hinter abstrakten Zugriffsmethoden verstecken lässt. Hierzu allerdings ist nur Datenabstraktion notwendig - die eher kleinere Wurzel von OO.

Der weitaus wichtigere Aspekt von OO kommt erst mit dem Vererbungsprinzip, mit der Tatsache also, dass jede Klasse K, die von einer anderen Klasse K1 erbt, nur zu implementieren braucht, was nicht schon in K1 -- oder in einer der Klassen, von denen K1 erbt -- implementiert ist.

Kommentar von PerfectMuffin ,

Alle Vorteile von OOP lassen sich problemlos in Sprachen wie C umsetzen, OOP Sprachen haben lediglich von Anfang an Unterstützung dafür.

Kommentar von DennisHere ,

Dankeschön!:)

Meint ihr, C ist dann eine Gute Sprache zum Anfangen?  Ich mein, ich bin noch Schüler, und mache keine Riesen Projekte^^

Komme frisch aus Batch ^^

Kommentar von PerfectMuffin ,

C hat seine Vorteile. Die Arbeitsweise eines Computers versteht man bei kaum einer Sprache so gut wie bei C.

Aber als "Hochsprachenassembler" gilt C als ziemlich schwer.

Antwort
von Omnivore08, 14

Na du kannst nicht nur Werte, Eigenschaften in eine Klasse speichern, sondern auch noch Ereignisse und Methoden. Das ist doch super, weil man dann Methoden speziell an eine Klasse binden kann.

Und außerdem macht man sich mit dem Vererben noch das Leben ein wenig leichter :)

Keine passende Antwort gefunden?

Fragen Sie die Community