Strukturierte Programmierung versus OO-Programmierung


11

Ich mache eine Präsentation, die die Unterschiede zwischen struktureller und objektorientierter Programmierung zeigt, und ich möchte veranschaulichen, warum Menschen OOP benötigen , anhand eines Beispiels, in dem die Anwendung von OOP-Konzepten das Codieren erheblich vereinfacht, sodass das Publikum wirklich das Gefühl hat, OOP zu benötigen.

Irgendwelche Ideen ??


2
Wenn Sie diese Frage auf programmers.stackexchange.com stellen, erhalten Sie weitere Antworten.
Reggie

2
Was ist dein Publikum? Erfahrene Nicht-OO-Programmierer (Cobol usw.)? wenig erfahrene Programmierer (Studenten usw.)? Führungskräfte (überhaupt keine Programmierer)?

Ich habe vorher noch nichts davon gehört, aber ich habe die FAQ gelesen und ich denke, es ist besser, dort zu fragen.
Ahmed

wenig erfahren.
Ahmed

4
Ich wünschte, einige OO-Programme wären besser strukturiert.
Scott Whitlock

Antworten:


17

Vielleicht möchten Sie sich diesen kurzen Videoblog ansehen . Das Ergebnis ist, dass der Unterschied zwischen strukturierter Programmierung und OO-Programmierung davon abhängt, was sie der Programmierung wegnehmen, und nicht davon, was sie hinzufügen. Softwaredisziplinen wie Strukturierte Programmierung und Objektorientierte Programmierung sind einschränkend und nicht aktivierbar. Hier sind einige Definitionen. Warnung: Sie werden sie nicht mögen.

  • Strukturierte Programmierung ist Disziplin, die goto auferlegt wird (direkte Übertragung der Kontrolle).

  • OO-Programmierung ist Disziplin, die Zeigern auf Funktionen auferlegt wird (indirekte Übertragung der Kontrolle)

  • Funktionale Programmierung ist Disziplin, die der Zuweisung auferlegt wird.

    Das erste ist nicht zu schwer zu verstehen. Dijkstra stellte fest, dass es unmöglich war, allgemeine Korrektheitsnachweise zu erstellen, wenn in Algorithmen goto erlaubt war. Wenn die Kontrollstrukturen jedoch auf Sequenz, Auswahl und Iteration beschränkt waren, waren Korrektheitsnachweise möglich. Natürlich versuchen wir heutzutage nicht einmal, die Richtigkeit zu beweisen, aber wir mögen die Einfachheit und Eleganz der strukturierten Programmierung.

Es ist etwas schwieriger, OO zu verstehen. Wir definieren OO oft als Einkapselung, Vererbung und Polymorphismus. Was weniger ist weiß , ist , dass alle drei dieser Eigenschaften erreichbar sind, und häufig wurden in C erreicht Tatsächlich C ++ begann als nur ein Präprozessor , dass C. zusammengestellt nach unten Es ist nicht wirklich schwer zu kapseln in C. Auch ist es schwer zu bauen Datenstrukturen, die Teilmengen voneinander sind und die Vererbung simulieren. Polymorphismus ist jedoch etwas schwieriger. Es erfordert Zeiger auf Funktionen, die in C schwer gut zu verwalten sind. Was uns Sprachen wie C ++ gaben, war Disziplin, die diesen Zeigern auf Funktionen auferlegt wurde. Der C ++ - Compiler hat die vtables für uns erstellt und die darin enthaltenen Zeiger nach einem strengen Formalismus initialisiert. In einem sehr realen Sinne ist OO einfach Disziplin, die auferlegt wirdindirekte Übertragung der Kontrolle dh Zeiger auf Funktionen.

Bei der strukturierten Programmierung geht es darum, wie man goto nicht verwendet. Bei OO geht es darum, keine Zeiger auf Funktionen zu verwenden. Auch bei der funktionalen Programmierung geht es darum, was nicht zu tun ist. In der funktionalen Programmierung weisen wir nur in den am strengsten kontrollierten Fällen Variablen zu.

Letztendlich beschränken all diese "Programmiertechnologien" die Disziplinen, anstatt Technologien zu ermöglichen. Sie sagen uns , was nicht mehr zu tun , als sie uns sagen , was zu tun. Und das bedeutet, dass die Softwareentwicklung in den letzten 40 Jahren nicht gewachsen ist. Vielmehr ist es geschrumpft. Es wird immer enger, da wir alle Dinge gelernt haben, die wir nicht tun sollten.

Zu lernen, was nicht zu tun ist, ist gut; Aber hier ist die beunruhigende Frage: Welche neuen Dinge haben wir gelernt zu tun?


@ Ahmed: +1 für "TL; DR, danke für Video" - verdächtiger Kommentar (Scherz)
n611x007

link rot ... dead link
slashdottir

7

Es gibt drei grundlegende Möglichkeiten, einen Computer zu programmieren:

  1. Unstrukturierte Programmierung - mit gotos, wie in alten BASIC-Interpreten oder in Assemblersprache. Nur noch wenige Leute programmieren so.
  2. Strukturierte imperative Programmierung - wie in C oder PASCAL.
  3. Strukturierte funktionale Programmierung - wie in Haskell, ML oder Lisp.

Objektorientierte Programmierung ist aus meiner Sicht etwas anderes. Es geht darum, wie Sie Ihr Programm in größerem Maßstab organisieren können. Es ersetzt oder veraltet keines der drei oben erwähnten Paradigmen - innerhalb eines Methodenkörpers müssen Sie immer noch eines der drei Paradigmen aus der Liste auswählen, um es zu schreiben.


Ich verstehe dich nicht gut! Du meinst, wir müssen eines der 3 Paradigmen verwenden, aber WIR wissen es nicht. Und bei OOP geht es nur um mehr Organisation?
Ahmed

Sie können nicht programmieren, ohne entweder strukturierte imperative Programmierung oder strukturierte funktionale Programmierung zu lernen. Bei diesen beiden Paradigmen geht es darum, Dinge zu erledigen. Bei OOP hingegen geht es um Programmmodularisierung, die erst dann zum Tragen kommt, wenn Ihr Programm eine bestimmte Größe erreicht hat. Obwohl es definitiv in den Bibliotheken erscheint, die Sie beim Programmieren ständig verwenden, kann man eine perfekt gute Klassenbibliothek ohne OO-Funktionen wie Vererbung haben, zum Beispiel die Klassenbibliotheken von Haskell, LISP oder Standard ML.
Ken Bloom

4

Es geht darum, wie Sie Veränderungen antizipieren.

Beide Konzepte eignen sich für die Wiederverwendbarkeit, aber OOP öffnet die Tür für einfachere Änderungen. OOP bietet die Wiederverwendbarkeit der Strukturprogrammierung. Sie können sie jedoch auch verwenden, um mit weniger Aufwand neue Funktionen zu erstellen.

Man könnte sagen, dass OOP alle Funktionen der Strukturprogrammierung mit der zusätzlichen Funktionalität der Vererbung erbt! :-D


Ich mag das Erbe im Moment nicht sehr.

4
Ich auch nicht, aber das liegt daran, dass die Regierung meinen Großvater aus seiner Rente herausgeschraubt hat. In Bezug auf OOP hat mir die Vererbung jedoch recht gute Dienste geleistet!
CorsiKa

Nach meiner Erfahrung wird Vererbung in OOP am besten vermieden. Wie oft erstellen Sie tatsächlich eine Superklasse im Gegensatz zu einer Schnittstelle? Bevorzugen Sie in der Regel die Komposition.
Janx

1
@ Janx: "Wie oft bauen Sie tatsächlich eine Superklasse im Gegensatz zu einer Schnittstelle?" Huh? Sie bauen keine "Superklassen"; Sie nehmen vorhandenen Klassen und bauen subclasss von ihnen, und Sie tun das die ganze Zeit. Wenn Sie keine Vererbung verwenden, profitieren Sie nicht von der Liskov-Substitution und dem Polymorphismus. Was tun Sie also überhaupt in der objektorientierten Programmierung? Komposition ist ein anderes Werkzeug mit einem anderen Anwendungsfall, kein Ersatz für die Vererbung. Sie sollten nicht einander "vorziehen"; Sie sollten beide verwenden, jeweils für das, wofür sie nützlich sind.
Mason Wheeler

1
@Mason - erwähnenswert, dass Barbara Liskov (vom Liskov-Substitutionsprinzip) tatsächlich sagte (langes Video), dass sie Vererbung nicht besonders mag.
Aidan Cully

2

Die Konzepte sind orthogonal. Bei der strukturierten Programmierung geht es darum, Code innerhalb von Prozeduren / Funktionen / Methoden zu strukturieren. Es ist durchaus möglich (und wünschenswert), bei OOP die Prinzipien der strukturierten Programmierung innerhalb von Klassenmethoden zu befolgen.


1

Das ist eine Art subjektiver Wortlaut - strukturierte Programmierung und OOP sind Stile zur Lösung von Problemen, und einer ist nicht immer besser als der andere. Das Schreiben einer numerischen Methodenbibliothek ist sehr sinnvoll, wenn es in einem strukturierten Stil ausgeführt wird, in dem Sie Transformationen für Eingabedaten durchführen. Ein einfacher Agent, der von einer Zustandsmaschine gesteuert wird, kann jedoch in Java oder C ++ leicht als eigenständige Klasse ausgedrückt werden. OOP kann eine natürliche Möglichkeit sein, Speichercontainer für Datenstrukturen auszudrücken.

Über das Verstecken von Informationen und die Modularität zu sprechen, ist eine gute Möglichkeit, OOP auf natürliche Weise als Stil zu motivieren.

Eine interessante Version dieses Themas wurde von Steve Yegge verfasst - in gewisser Weise eine der besseren Beschreibungen der unterschiedlichen Ansätze zwischen den beiden Stilen.


0

OOP ist leichter zu verstehen, wenn Sie ein Geschäftsmodell erstellen. Wenn Sie über Anwendungselemente nachdenken, verwenden Sie einige OBJEKTE und BEZIEHUNGEN zwischen ihnen, z. B. Buch hat Autor (en), Titel, ISBN. Das Buch ist in der Bibliothek zu vermieten und kann vom Studenten ausgeliehen werden. Strukturelle Programmierung erzwingt das Nachdenken über bestimmte Prozesse, Implementierungen, die nicht abstrahiert sind.

OOP wurde für einfache Änderungen entwickelt. Eine Änderung des Strukturprogramms ist möglich, muss jedoch durch Code beschrieben werden. Eine Änderung des OO-Programms könnte durch eine abstrakte Modelländerung beschrieben werden.


0

Variabler Umfang:

Ich denke, ein Prinzip der Sprachen, um eine gute Programmierung sicherzustellen, besteht darin , den Umfang der Variablen einzuschränken . In strukturierten Sprachen wie C gibt es hauptsächlich zwei Arten:

  • Globaler Geltungsbereich
  • Lokaler / Funktions- / Methodenbereich

Wir alle wissen, dass die globale Reichweite schädlich ist. Manchmal reichen die lokalen Bereiche jedoch nicht aus, um das Programm auszuführen. Das Vermeiden globaler Bereiche führt dann zu einer breiteren Verwendung von Zeigern, die die Verwendung von Variablen außerhalb des Bereichs ermöglichen. Zeiger sind jedoch schwer zu verstehen und zu verwenden.

Die OOP-Sprachen wie C ++ fügen durch Kapselung einen neuen Typ von Gültigkeitsbereich hinzu - Klassen- / Objektbereich . Dieser Umfang wird durch die privaten / öffentlichen Variationen weiter verstärkt. Und dies löst viele Probleme des variablen Umfangs. Die Bereiche sind in OOP genauer definiert. Und Zeiger werden weniger benötigt.

Dies ist eine der großartigen Funktionen von OOP.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.