Was waren die Entwurfsmuster der Ära der prozeduralen Programmierung? [geschlossen]


24

Ähnlich: Wie wurde vor 20 Jahren programmiert?

OOP ist heutzutage ziemlich in Mode und hat seine Wurzeln in Simula 67 in den 1960er Jahren und wurde später von Smalltalk und C ++ populär gemacht . Wir haben DRY, SOLID, viele Bücher über Designmuster in der objektorientierten Welt.

Aber was waren die Hauptprinzipien der Programmierung vor der Übernahme des OOP-Paradigmas? Und was waren die wichtigsten Designmuster?


11
OOP ist eigentlich etwas älter: siehe en.wikipedia.org/wiki/Smalltalk . Außerdem ist DRY nicht nur bei OOP zu finden. Das Prinzip kann (und sollte) in allen Programmierparadigmen sein, obwohl sie unterschiedliche Antworten darauf haben, wie dies erreicht werden soll.
Tdammers

4
OOP kommt hauptsächlich von Simula
Charles Salvia

8
OOP hat seine Wurzeln in C ++ ??? Kinder in diesen Tagen ... :(
Andres F.

5
Glücklicherweise sind all diese Marketing-nutzlosen Quatsch, all diese Hype-Wörter eine relativ neue Sache in unserer Branche. Früher haben wir nur programmiert, ohne irgendeinen Mist.
SK-logic

@AndresF., Zögern Sie nicht, dies direkt in meiner Frage zu bearbeiten.
Vorac

Antworten:


31

Ich war ein Cobol-Entwickler, bevor ich Java lernte. Ich habe seit über 35 Jahren entwickelt.

In den Tagen der Verfahrenssprachen erfolgte der größte Teil der Verarbeitung im Batch. Gehen Sie in der Geschichte weit genug zurück, und sogar die Programmerstellung wurde mit einem Stapel Lochkarten durchgeführt.

Entgegen Kilian Foths Behauptung hatten wir bereits in den 1970er und 1980er Jahren Designmuster. Es gab eine bestimmte Möglichkeit, einen Match / Merge mit mehreren Dateien in Cobol zu codieren. Es gab eine bestimmte Möglichkeit, das Hinzufügen von Transaktionen zur Masterdatei (Banddatei) in Cobol zu codieren. Es gab eine bestimmte Möglichkeit, in Cobol Berichte zu erstellen. Aus diesem Grund hat IBMs Report Writer in vielen Cobol-Läden nie wirklich Fuß gefasst.

Es gab eine frühe Anwendung des DRY-Prinzips. Erstellen Sie viele Absätze, damit Sie sich nicht wiederholen. Strukturierte Codierungstechniken wurden in den 1970er Jahren entwickelt und Cobol fügte der Sprache 1985 strukturierte Wörter (Verben) hinzu.

Als wir ein neues Cobol-Programm geschrieben haben, haben wir im Allgemeinen ein altes Cobol-Programm kopiert und die Namen geändert, um die Unschuldigen zu schützen. Wir haben fast nie ein Cobol-Programm von einem leeren Blatt Papier oder einem leeren Bildschirm codiert. Das ist ein großes Entwurfsmuster, wenn Sie ganze Programme kopieren und einfügen können.

Es gab so viele Cobol-Designmuster, dass ein Cobol-Programmierer Jahre brauchte, um sie alle zu lernen. Das ist ein Grund, warum die Cobol-Programmierer heute zum größten Teil immer noch die 1985-Syntax verwenden.


2
+1. Ich hatte die gleichen Erfahrungen mit Cobol, Pascal und brachte mir Basic auf einem Vic-20 bei. Es gab viele Dinge, die ich wiederverwendete und kopierte.
JohnP

Wie wäre es mit BONSOP, das noch heute verwendet wird;)
dbasnett

Es fühlt sich nicht richtig an, "Kopieren / Einfügen / Ändern" als "Entwurfsmuster" zu bezeichnen (zumindest wie wir den Begriff heute verwenden) - vielleicht ist das eher ein "Codierungsmuster"?
Izkata

@ Izkata: Es ist nicht wirklich ein Codierungsmuster, da Sie den größten Teil der Codierung vermeiden. Wie wäre es mit einem "Vorlagenmuster"? Sie haben Recht, dass Kopieren / Einfügen / Ändern nach heutigen Maßstäben kein gutes Design ist. Damals war es das Beste, was wir hatten.
Gilbert Le Blanc

1
Ein Entwurfsmuster ist dasselbe wie bei C & P Cobol, ein Singleton ist immer genauso codiert - Sie können sogar einige IDEs dazu bringen, das Boilerplate für Sie auszuspucken. Das unterscheidet sich nicht wesentlich von Ausschneiden und Einfügen.
gbjbaanb

25

"Design Patterns" in Software gab es in der Ära, von der Sie sprechen, nicht, weil das Konzept nicht erfunden worden war. Das bin ich nicht in der frivol - es tatsächlich ist der Grund; Ein erkennbarer Name ist das, was ein Entwurfsmuster zu einem "Entwurfsmuster" macht und nicht nur zu Code, den Sie in der einen oder anderen Form weiter verwenden (z. B. eine "Factory" anstelle einer "Art statischer Klasse", die ich lieber verwende als eine Auswahl von Konstrukteuren ") und das Konzept selbst ist keine Ausnahme.

Das heißt, es gab natürlich Dinge, die in der Arbeit der Praktiker genau dieselbe Rolle spielten, wie dies jetzt bei Entwurfsmustern der Fall ist. Aber Sie werden enttäuscht sein, wenn Sie von ihnen hören: Typische "Tricks der Gurus" waren damals Dinge, die uns jetzt ziemlich langweilig sind - z. B. einfach verknüpfte Listen, Schleifen, die von einem Index gesteuert werden, der bei jeder Iteration erhöht wird, kluger "Accessor msgstr "" "Methoden, die nichts anderes zu tun scheinen, als Ihnen Spielraum zu geben, Ihre Meinung zu Implementierungsdetails später zu ändern.

Richtig, Dinge, die wir heute für selbstverständlich halten - die manchmal sogar Teil der von uns verwendeten Sprachen sind -, waren früher fortgeschrittene (und manchmal eifersüchtig gehütete) Konzepte, die nur erfahreneren Programmierern bekannt waren. Die Chancen stehen gut, dass fast alles, was Sie heute in einem grundlegenden Programmierkurs lernen, eine Phase durchlief, in der es für die Praktiker der Zeit das moralische Äquivalent zu einem "Designmuster" war. Softwarekonstruktion mag noch keine strenge technische Disziplin sein, aber wenn Sie den Stand der Technik der 50er und 60er Jahre studieren, können Sie nicht leugnen, dass sie von Anfang an einen enormen Weg zurückgelegt hat.


4
Ein Designmuster ist nur der Name, den Beck und Cunningham entwickelt haben, um das Konzept eines sich wiederholenden Code-Musters zu formalisieren. Sie taten dies 1987. Fowler veröffentlichte sein Buch 2002 und machte sie populär.
Gbjbaanb

1
@gbjbaanb, ich dachte, Design-Muster gehen mindestens mehrere Jahrzehnte zurück
Vorac

3
@Vorac diese waren nicht für Software
gnat

18

Das vorherige große Paradigma war die strukturierte Programmierung . Anstelle von UML gab es verschiedene Diagramme (Flussdiagramme, Datenflussdiagramme, Strukturdiagramme usw.). Die Entwicklung erfolgte größtenteils von oben nach unten und folgte einem Prozess der funktionellen Zersetzung. Eine der Grundideen war, dass Ihre Programmstruktur einem Diamanten ähneln sollte: Das Hauptmodul oben, das sich in übergeordnete Steuerungsmodule aufteilt, die Routinen in untergeordneten Modulen aufriefen. Diese untergeordneten Module basieren auf noch untergeordneten Modulen, von denen alle (theoretisch) auf eine Handvoll grundlegender E / A-Routinen konvergierten. Übergeordnete Module sollten die Programmlogik enthalten, untergeordnete befassten sich mehr mit Datenintegrität und Fehlerbehandlung.

Wichtige Konzepte, die in dieser Zeit eingeführt wurden, waren das Verstecken von Informationen, Modularität und hohe Kohäsion / niedrige Kopplung. In den Werken von Dave Parnas finden Sie einige wegweisende Artikel zu diesen Themen. Schauen Sie sich auch die Arbeiten von Larry Constantine, Tom DeMarco und Ed Yourdon an.


Yup, das habe ich vor 25 Jahren gelernt
Binary Worrier 20.06.13

10

Ich nehme an, ein großer Punkt (neben der strukturierten Programmierung selbst) war das Konzept, ein Handle zu übergeben - in OO haben Sie ein Objekt und es enthält Status und Funktionalität. Vor OO hatten Sie eine Menge unabhängiger Funktionen, und Sie würden ein Handle an einen Zustand zwischen ihnen übergeben - ein Cookie, wenn Sie möchten. Dies gab Ihnen OO-Prinzipien, ohne tatsächlich OO zu haben.

Sie können dies häufig im alten Win32-Code sehen. Sie übergeben einen HANDLE, der ein undurchsichtiger Typ ist, der einen im Windows-Kernel zugewiesenen Status darstellt. Sie können dies selbst tun, indem Sie einen Zeiger auf eine Struktur übergeben, die Sie zuvor als ersten Parameter für Funktionen zugewiesen haben, die diese Daten verarbeiten.


Das ist ziemlich interessant. Ich suche auch andere Beispiele. Wie zum Beispiel hat man "die Logik um die Datenstrukturen herum aufgebaut, nicht umgekehrt"?
Vorac

2
So wie Sie es jetzt tun, außer dass Ihre Methoden freie Funktionen sind, die Ihren Datenstrukturen durch Konvention, Implikation oder Dokumentation zugeordnet sind, und nicht durch spezielle Sprachunterstützung.
Nutzlos

1
Es ist wie bei Javascript, nur mit JS können die Funktionszeiger Teil der Struktur sein, die Sie weitergeben. Nichts ändert sich wirklich, wir setzen nur Schichten der Verschleierung über sie :)
gbjbaanb

5

Da noch niemand das Offensichtliche erwähnt hat: Ein großes Entwurfsmuster in der prozeduralen Ära war Object. Wie viele gängige Entwurfsmuster vor (z. B. Subroutine) und nach (z. B. Iterator) wurde es so beliebt, dass es sogar Sprachunterstützung erhielt.


3

Eine "endliche Zustandsmaschine" kann als Muster gelten, und FSMs wurden (z. B. für Kommunikationsprotokolle) unter Verwendung von Pre-OO-Sprachen geschrieben.

Auch "Interrupt-Handler" und TSRs waren früher beliebt, zB unter DOS.


3

Begriffe wie "Spaghetti Code" und "Single Point of Exit" sind Rückschläge in diese Zeit. Heutzutage nennen wir Code, den wir nicht als "Spaghetti-Code" bezeichnen, aber das ist wirklich ein Hinweis auf Code, der (schlecht) mit GOTOs und JMPs verbunden ist.

(Heute leiden wir unter "Ravioli-Code", in dem der Code wie ein Bündel nicht verwandter, dicht gepackter Klassen ist, ähnlich wie ein Teller Ravioli. Einige OO-Experten fragen jedoch zu Recht: "Aber ist es nicht das, was OO soll aussehen wie?")

"Single Point of Exit" ist heutzutage nur ein frustrierender Refactoring-Roadbump. Viele Entwickler, mit denen ich gesprochen habe, haben noch nicht einmal davon gehört und sind entsetzt, wenn ich es erkläre. Aber früher hieß es, nicht plötzlich aus einem Codeblock in Spaghetti-Code zu springen. Springe vorwärts zum Ende der Logik und verlasse sie dann mit Anmut.

Ich erinnere mich immer wieder daran, dass die Idee, Code in Prozeduren zu bündeln, ein großer Fortschritt war. Die Idee, Prozeduren in interoperable, wiederverwendbare Module zu packen, war eine Art Heiliger Gral der Programmierung.

BEARBEITEN: "Selbstmodifizierender Code" war auch ein Muster, das insbesondere im ursprünglichen Doom verwendet wurde. Dort würde das Programm seine Anweisungen tatsächlich mit schnelleren Anweisungen überschreiben, die auf seinem Status basieren. Als ich ein Typ war, der einen Programmierkurs im Science Museum belegte, warnte mich mein Ausbilder streng: "Schreiben Sie keinen selbstmodifizierenden Code!"

BEARBEITEN BEARBEITEN: Vor dem Internet verbreitete sich das Wort jedoch viel langsamer. Die Idee, Algorithmen und Datenstrukturen zu implementieren, war früher viel wichtiger. Heute sortiere ich die ganze Zeit, ohne zu wissen, welche Sorte ich benutze. Aber damals musste man es selbst verschlüsseln. Ich erinnere mich an einen Artikel über Programmierherausforderungen, die früher Tage in Anspruch nahmen, die wir heute in einer halben Stunde oder weniger überwunden haben. Wahrscheinlich würde die wirklich bewusste "algorithmische" und "Datenstruktur" -Programmierung auf der Liste stehen, viel mehr als heute.

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.