Sinn - Objektorientierte Programmierung?

...komplette Frage anzeigen

9 Antworten

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! :)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Omnivore08
03.12.2015, 22:42

Sehr poetisch :-) Däumchen :)

3
Kommentar von DennisHere
05.12.2015, 07:47

Vielen Lieben Dank! :-)

1

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.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von PWolff
03.12.2015, 17:07

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-vererbung-in-java

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

3
Kommentar von DennisHere
03.12.2015, 18:43

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:)

0

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.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von DennisHere
03.12.2015, 18:40

Dankeschön!:)

Hat Visual Basic denn OOP?^^

0

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 bewerten Vielen Dank für Deine Bewertung

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.
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von grtgrt
03.12.2015, 16:54

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.

1

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 bewerten Vielen Dank für Deine Bewertung

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 bewerten Vielen Dank für Deine Bewertung

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 :)

Antwort bewerten Vielen Dank für Deine Bewertung

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.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von grtgrt
03.12.2015, 17:16

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.

0
Kommentar von DennisHere
03.12.2015, 18:41

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 ^^

0

Was möchtest Du wissen?