Prozedurale Programmierung vs. OOP?

5 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Kann mich den bisherigen Statements weitgehend NICHT anschließen.

Am besten ist es, Du untermauerst Aussagen immer durch eigene Handarbeit, sprich kleine Programmschnipsel.

Da wäre als erstes mal die Aussage, daß es in der prozeduralen Programmierung keine Strukturierung von Daten alias Objekten gäbe.

Das ist Nonsense. Schon in den ersten Hochsprachen vor 50 Jahren gab es Datenstrukturen. Da wir heutzutage eine ganze Palette aktueller prozedural verwendbarer Sprachen haben, wäre es glatt möglich, daß die Sprachpfleger sowas als Affront auffassen. Die haben das schon vor 50 Jahren gekonnt und dann kommen heutzutage so ein paar jungsche Spunde daher und behaupten einfach, das sei alles nicht existent! Echt man! Tsss!

Mach einfach ein Beispiel in C oder irgendeiner anderen Sprache, wo Du mal Deine Grundkenntnisse von der Datenorganisation auffrischst, die Ihr doch garantiert schon im Unterricht hattet, oder?

Im übrigen geht es in den meisten Sprachen nicht darum, ob die so-oder-so SIND, sondern ob ein Programmierer die so-oder-so VERWENDET!

Man kann in C++ programmieren wie in "besserem C". Eine durchaus beliebte Art und Weise. Von gewissen religiösen OOP--Fanatikern herablassend belächelt oder beschimpft, aber nichtsdestotrotz erstens möglich und zweitens auch noch effektiv anwendbar. (Wenn etwas auch nur MÖGLICH ist, ist schon allein dadurch eine Aussage, daß es das nicht gäbe, falsch, gelle?!)

Ein Sprache wie C kann man objektorientiert benutzen. Eventuell zum Staunen für das Jungvolk: C++ IST TATSÄCHLICH ursprünglich als purer Preprocessor-Aufsatz für C entstanden. Um bestimmte Ausdrucksvarianten ein wenig leichter formulierbar zu machen und einheitliche Methodik reinzubringen. Was mitnichten heißt, daß das, was da ausgedrückt werden sollte, nicht auch bereits in purem C auszudrücken möglich gewesen wäre. Ganz im Gegenteil. In purem C ist nur nicht ganz so viel in komplexen Bausteinen fertig zusammengesetzt. Ein Programmierer hat dort deutlich MEHR (!) Freiheiten (!), aber auch logischerweise EBEN WEGEN diesen Freiheiten deutlich mehr zu organisieren.

PHP kann man ohne jeden Bezug zu dem, was typischerweise vom Jungvolk als "Objektorientierung" begriffen (alias von deren Lehrern vorgebetet und vollkommen bar jeder Hinterfragung geschluckt) wird, BENUTZEN.

Man KANN es aber auch so BENUTZEN, daß man keine einzige Zeile anders als mit extrem gestelzter objektorientierter Ausdrucksweise schreibt.

Womit wir bei noch einem anderen Aspekt wären: Manche Programmiersprachen sind dafür geschaffen worden, daß Programmierer sich so effektiv wie möglich ausdrücken können - in jeder beliebigen Art. Und manche sind dafür geschaffen worden, daß Programmierer so weit wie möglich behindert werden, damit ihnen eine so große wie mögliche Menge von typischen Flüchtigkeitsfehlern gleich von vornherein unmöglich gemacht wird. Wieder dritte Programmiersprachen sind allmählich aufgebohrt worden, um Dinge wie objektorientierte Ausdrucksweisen nachträglich aufzusetzen bz. dranzupappen. Ohne daß ein Programmierer tatsächlich seine Arbeit damit effektiver über die Bühne kriegen könnte.

PHP zum Beispiel gehört in die letztere Kategorie. Wie in jeder Programmiersprache kann man JEDES PHP-Programm 1:1 nebeneinander in einer OOP- und einer Nicht-OOP-Variante schreiben. Die OOP-Variante wird IMMER schwerer lesbar und aufwendiger zu schreiben und zu lesen sein. Wir können das an beliebigen Beispielen durchziehen, wenn Bedarf bestehen sollte. OOP ist bei PHP reiner Aufsatz zur Selbstbefriedigung der OOP-Fanatiker.

Java gehört in die mittlere Kategorie: Auf C++ aufsetzend wurden zu Beginn vor 20 Jahren etliche Ausdrucksmöglichkeiten von C++ einfach gestrichen, während eine Reihe von Formalismen aufgezwungen wurden, die Freiheiten der Programmierer gegenüber C++ also deutlich eingeschränkt wurden. Dennoch ist es möglich, in Java exakt so prozedural zu programmieren wie in jeder anderen Sprache. Oder exakt genauso viele Flüchtigkeitsfehler zu machen. Der Mensch macht die beim Abstrahieren zwingend. Da man sich in Java an etlichen Stellen viel komplexer ausdrücken muß, um dasselbe zu erreichen wie ein Einzeiler in C++, wurde schon allein dadurch für massiven Raum für Fehler vorgesorgt.

Zur Anregung sollte das erstmal reichen...


Gegengift  25.06.2013, 17:50

Fazit:

Das Jungvolk denkt sich vermutlich gerade, dass der Gandalf wohl nicht kapiert hat, dass es bei der Frage nicht darum geht welche Sprache was kann, wann was schon bekannt war, und auch nicht darum was und zu welcher Zeit möglich war oder warum OOP böse ist, sondern welche Unterschiede es zwischen den Programmierparadigmen gibt - sprich wie ihre prinzipielle Ausrichtung ist. Da gibt es eine Menge Schnittmengen, weil das eine aus dem anderen kommt. Und doch kann man sie charakterisieren - oh welch ein Wunder es ist erstaunlich.
Der Gandalf selbst erfreut sich währenddessen an seinem Rieeesenhammer (..zur Anregung sollte das erstmal reichen...) und der Fragesteller sitzt vermutlich jetzt mit 3 gaaaaanz großen Fragezeichen da und hat keinen blassen Schimmer, was er mit diesem Vortrag anfangen soll.

Also ein Erfolg auf ganzer Linie

^^

Mit freundlichen Grüßen - das von den ebenfalls bösen Lehrern indoktrinierte Jungvolk ;-)

WhiteGandalf  25.06.2013, 17:57
@Gegengift

Ja nun... Laß ihn doch ein wenig selbst drüber grübeln!

Eine Meinung muß er sich eh selbst bilden, weil's ja nun eine Hausaufgabe ist.

Übrigens kommt ein Vortrag viel besser, wenn man den Kollegen (Klassenkameraden) auch noch etwas Raum zum selber Urteilen / Mitdenken läßt. Die Paradigmen völlig trocken darlegen könnte man sicher auch - aber das wird die Leute langweilen. So ein paar Sticheleien, wo jeder sich geradezu aufgefordert fühlt, seinen Senf dazuzugeben, machen das ganze interessant.

Gegengift  25.06.2013, 17:58
@Gegengift

PS: Eventuell sind die Lehrer doch nicht so böse, weil sie PHP und OOP auch für in vielen Fällen widersinnig halten. Im Übrigen programmieren wir OOP überwiegend nur in C# bzw. Java.

Edit: Ja sicher. Ist ja auch interessant zu lesen. Aber dennoch leicht übertrieben..

Wutklumpen  25.06.2013, 11:47

Ich muss mich mal wieder anschließen. GZ zum RatgeberHeld im übrigen! ;)

Defaetist  25.06.2013, 07:58

Das ist ein engagiertes Stement eines überzeugten Programmierers - dem ist nichts hinzufügen. DH!!!

Imperative Programmierung: Der Quellcode wird in einer festgelegten Reihenfolge abgearbeitet.

Prozedurale Programmierung: Hier gibt es Unterprogramme. Sprich die Auslagerung von Codesegmenten die im Hauptprogramm aufgerufen werden können. Das erhöht die Strukturierung, Übersicht und Wartbarkeit.

Objektorientierte Programmierung: Die Strukturierung geht noch deutlich weiter. Unterprogramme werden wieder zusammengefasst - zu Klassen. Diese können nicht nur zahllose solcher Methoden enthalten, sondern enthalten auch die Daten - sprich Variablen - in der OOP Attribute/Eigenschaften.

Das ist natürlich nur der wichtigste Unterschied.

Beispiel: Klassen können z.B. Namen tragen wie Kunde, Auftrag, Gebäude usw. In der Klasse Kunde könnten zahlreiche Methoden geschrieben werden, die alles behandeln, was sich logisch auf alle, einen oder einige Kunden bezieht. Objektorientiert, weil diese Klasse in der Regel also den Bauplan eines Objekts darstellt. Wobei ein Objekt der Kundenklasse in diesem Fall einen Kunden darstellen würde.

Hi!

Eine kleine Geschichte der Programmierparadigmen:

Zuerst gab es ausschließlich die imperative Programmierung. Also die Programmierung mit nacheinander ausgeführten Befehlen und einfachen, bedingten Sprunganweisungen. (Beispiel: Maschinensprache)

Einige Zeit später kamen andere schlaue Köpfe auf die Idee, dass es doch besser wäre, wenn man die Programme in Form von Unterprogrammen strukturieren könnte.
Dies wurde dann prozedurale Programmierung genannt.
Für ihre ketzerische Einstellung gegenüber imperativer Programmierung wurden die Anhänger dieses neuen Paradigmas dann von den "wahren (imperativen) Programmierern" verteufelt.

Kurz darauf (bzw. parallel dazu) haben sich wiederum einige schlaue Köpfe überlegt, dass es doch noch schöner wäre, wenn man zusätzliche Kontroll- und komplexe Datenstrukturen verwenden könnte.
Dies wurde dann strukturierte Programmierung genannt.
Für ihre ketzerische Einstellung gegenüber prozeduraler Programmierung wurden die Anhänger dieses neuen Paradigmas dann von den "wahren (prozeduralen) Programmierern" verteufelt.

Noch später kamen dann nochmals andere schlaue Köpfe auf den Trichter, dass man noch strukturierter Arbeiten könnte, wenn man Datenstrukturen und deren Operationen zusammenfassen würde.
Dies wurde dann objektorientierte Programmierung genannt.
Für ihre ketzerische Einstellung gegenüber strukturierter Programmierung wurden die Anhänger dieses neuen Paradigmas dann von den "wahren (strukturierten) Programmierern" verteufelt.

Oder anders:

Es sind alles nur Erweiterungen des imperativen Konzepts. Du kannst in fast jeder OOP fähigen Sprache auch strukturiert programmieren. (rein imperativ geht nicht immer, da z.B. in Java gar keine Sprungbefehle mehr vorhanden sind)
Strukturierte oder objektorientierte Programmierung ist dabei eben optional möglich.
Die Gründe für diese stetige Weiterentwicklung der Programmierparadigmen liegen in der immer weiter steigenden Komplexität von Computerprogrammen und dem Bedarf diese Komplexität beherrschbar zu machen.


Heutzutage wird für alle nicht objektorientiert aufgebauten Programme - also für Programme bei denen Datenstrukturen und Programmlogik voneinander getrennt sind - der Begriff "prozedurale Programmierung" gebraucht, obwohl damit eigentlich "strukturierte Programmierung" gemeint ist.

OOP hat gegenüber der prozeduralen Programmierung den Vorteil, dass man Softwarearchitekturen auf einem hohen Abstraktionsniveau beschreiben und auch vermitteln kann.
Das ist besonders für die Kommunikation in Programmier-Teams wichtig.
Auch wird mittels OOP eine lose Kopplung verschiedener Programmteile ermöglicht und somit kann die Wartbarkeit/Änderbarkeit von Software erhöht werden.
Das ist aber eben nicht immer automatisch der Fall wenn man objektorientiert programmiert, sondern meist nur dann, wenn man auch entsprechenden Aufwand in eine vernünftige Softwarearchitektur steckt.
Der Nachteil ist eben der erhöhte Anfangsaufwand und das vergleichsweise hohe Ausbildungsniveau, dass benötigt wird.
Beides treibt aber auch wieder die Kosten der Programmierung in die Höhe- einen wirklichen Vorteil hat OOP hier also bestenfalls bei sehr sehr großen Projekten.
Diese sind aber nur sehr rar gesäht.
Aus diesem Grund spielt die objektorientierte Programmierung (anders als z.B. die objektorientierten Programmiersprachen) in Deutschland auch nur eine untergeordnete Rolle.
Wir haben in Deutschland schlichtweg zu wenig Programmierer, die überhaupt in der Lage wären objektorientiert zu programmieren.
Außerdem fehlt häufig schlichtweg der Bedarf nach dauerhaft wartbarer Software.
Von daher schätze ich, dass nach wie vor weit mehr als 95% der neu entwickelten Software primär prozedural bzw. strukturiert entwickelt wird.
Trotzdem ist die Welt in Deutschland noch nicht untergegangen.

in etwa so:

Imperative Programmierung beinhaltet das Festlegen von nacheinander zu befolgenden Instruktionen und das verwenden von globalem Speicher.

Prozeduren kapseln Instruktionen und temporären,lokal zugänglichen, während ihrer Laufzeit genutzten Speicher.

Objekte kapseln Prozeduren und, meist ebenfalls lokal zugänglichen, während ihrer Lebensdauer genutzten Speicher.

Naja, in einer Prozeduralen Prog. Sprache gibt es keine Objekte, sondern nur variablen einfacher Datentypen und funktionen.