Nicht-OOP-Entwurfsmuster? [geschlossen]

70

Ich habe nur gehört, dass der Begriff "Entwurfsmuster" für objektorientierten Code verwendet wird, und die GoF-Muster enthalten nur OOP-Entwurfsmuster, aber Entwurfsmuster sind elegante Lösungen für häufig auftretende Programmierprobleme, oder? Da ist nichts drin, was besagt, dass sie auf OOP beschränkt sein müssen, oder?

Ich würde gerne einige Beispiele für Entwurfsmuster außerhalb des Bereichs der objektorientierten Programmierung sehen. Hast du welche? Existieren solche überhaupt (kein Buch, wie das GoF-Buch, muss unbedingt geschrieben worden sein, sie sollten nur verwendet werden; das ist genug)?

Sie können für einige Programmiersprachen spezifisch sein, es werden jedoch allgemeine Muster (Muster auf Paradigmenebene) von anderen als den objektorientierten Mustern bevorzugt.

Anto
quelle
8
Ich denke, der größte Nachteil der populären Designmusterbücher bestand darin, eine ganze Reihe von Menschen zu erschaffen, die glaubten, dass die Muster nur für objektorientierte Sprachen gelten. Kreationsmuster sind umstritten, aber so gut wie alle anderen können und werden die ganze Zeit in keiner objektorientierten Sprache implementiert. Ich bin sicher, dass dieser Nebeneffekt nicht die Absicht des Autors war, er ist dennoch ein Nebeneffekt.
Pemdas
14
Nun, Objekte sind ein Designmuster in Nicht-OO-Sprachen :)
back2dos
1
Schlimmer noch, Musterbücher schufen eine ganze Klasse von Menschen, die glauben, dass jedes Problem durch Anwendung eines bestimmten Musters gelöst werden sollte (normalerweise das letzte, das ihnen von einem Schullehrer beigebracht wurde, der selbst dasselbe glaubt).
31.

Antworten:

25

Schauen Sie sich die Linux Kernel Design Patterns-Reihe an. Die Artikel beziehen sich auf eine nicht objektorientierte Sprache (C) und ich glaube, dass sie gut geschrieben sind:

Sakisk
quelle
Sie verwenden jedoch einen objektorientierten Ansatz.
Kais
12

Eigentlich ist es paradox - eines der beliebtesten Non-OO-Muster ist ... "Klasse".

Da OO in Nicht-OO-Sprachen erfunden wurde, mussten Entwickler es simulieren (und sie tun es auch jetzt noch) - also war das Muster geboren. LISP und C sind Beispiele dafür.

Aber nehmen Sie meinen Rat an: Machen Sie keinen häufigen Fehler - verwenden Sie Muster nicht nur, weil es cool ist. Sie brauchen ernsthafte Gründe, um die Verwendung von Mustern zu rechtfertigen (zumindest OO).

Nehmen wir zum Beispiel das Befehlsmuster - obwohl es nett ist und den Anrufer vom Empfänger entkoppelt, sollte es nicht verwendet werden, es sei denn, Sie benötigen das tatsächlich - weil Operationen mit Verben ausgedrückt werden sollten - was Methoden bedeutet. Und wenn Sie Befehle überall einsetzen, erhalten Sie eine Reihe von vollständig dezentralen OO-Lambdas -> das gilt auch für viele Strategien.

Kamil Tomšík
quelle
11

"Design Pattern" ist eigentlich ein Euphemismus für "Workaround". Die Entwurfsmuster wurden erfunden, um Mängel und Mängel in OO-Sprachen zu umgehen . Nehmen wir zum Beispiel das Iterationsmuster, das schließlich zur Einführung der Sammlungen in Java führte. Groovy hat durch die Konvertierung in Sprachfeatures viele weitere Muster beseitigt: Sie benötigen das Dekorationsmuster nicht mehr, da Sie in Groovy vorhandenen Klassen Methoden hinzufügen können.

So finden Sie überall Designmuster. Tatsächlich kann jede "Best Practice" als einfache Form eines Entwurfsmusters angesehen werden.

Aaron Digulla
quelle
9
Einverstanden! Von Paul Graham : "In der OO-Welt hört man zum Beispiel viel über" Muster ". [...] Wenn ich Muster in meinen Programmen sehe, betrachte ich dies als Zeichen von Problemen. Die Form eines Programms sollte sich widerspiegeln Nur das Problem, das es zu lösen gilt: Jede andere Regelmäßigkeit im Code ist für mich zumindest ein Zeichen dafür, dass ich Abstraktionen verwende, die nicht leistungsfähig genug sind - oftmals generiere ich die Erweiterungen eines Makros von Hand dass ich schreiben muss. "
Andres F.
7
Ich bin nicht damit einverstanden, dass ein Entwurfsmuster eine Problemumgehung darstellt. Die beiden sind Gegensätze. Eine Problemumgehung ist ein kurzfristiger Patch, der zusammengestellt wird, um ein bestimmtes Hindernis zu umgehen. Entwurfsmuster sind langfristig wiederverwendbare Lösungen. Das Dekorationsmuster dient dazu, Funktionen hinzuzufügen, ohne die Klasse zu ändern. Sie können einem Objekt verschiedene Dekorateure zuweisen, ohne dass das Objekt davon Kenntnis hat.
Despertar
Der Grund, warum Muster als "Problemumgehung" angesehen werden, liegt darin, dass das Dekorieren eines Objekts ein Merkmal der Sprache sein sollte. Stattdessen müssen wir viele, viele Codezeilen schreiben, um dies zu implementieren. Beispielsweise ist das Iteratormuster Teil vieler moderner Sprachen geworden. Bei älteren OO-Sprachen müssen Sie durch ein paar Rahmen springen, um sie zu simulieren.
Aaron Digulla
@AaronDigulla Ich verstehe nicht, warum Sie denken, dass ein Muster wie der Dekorateur eine so schwere Implementierung ist. Sie sprechen über ein paar Codezeilen. Eine Klasse enthält eine andere Klasse und leitet Anforderungen mit einigen zusätzlichen Funktionen an sie weiter. Vererbung und Komposition werden so verwendet, dass das Aufrufen eines dekorierten Objekts dem Aufrufen des Objekts selbst entspricht. Ich betrachte diese Transparenz als Stärke. Auf diese Weise können Sie Dekoratoren zur Laufzeit austauschen. Wenn Sie sagen, dass groovy kein Dekorationsprogramm benötigt, weil es einer Klasse Methoden hinzufügen kann, scheint es, als ob Sie den Punkt verfehlen.
Despertar
2
Das Iterator-Muster wurde in modernen Sprachen nicht durch ein neues Sprachmerkmal ersetzt. Es wird nur mit einer Standardimplementierung für allgemeine Sammlungen geliefert. Nur weil es eine Standardimplementierung gibt, bedeutet dies nicht, dass das Muster nicht verwendet wird. Wenn Sie eine eigene Sammlung schreiben, müssen Sie diese selbst implementieren.
Despertar
10

LtU erwähnt, dass Jeremy Gibbons ein Buch über Muster in der funktionalen Programmierung schreibt. Ein paar Teaser finden Sie in Mr. Gibbons Blog Patterns in Functional Programming . Beachten Sie, dass er empfiehlt, seine Beiträge von der ältesten zur neuesten zu lesen.

Seine Arbeit Design Patterns as Higher-Order Datatype-Generic Programs (pdf) modelliert funktional die Vierergruppen-Muster: Composite, Iterator, Visitor und Builder. Er beschreibt die Muster der Programmierung mit rekursiven Gleichungen in der Origami-Programmierung (Falten und Entfalten).

Corbin March
quelle
9

Es gibt SQL-Entwurfsmuster .

Und es gibt auch einige funktionale Designmuster - siehe hier für Scala.

Oded
quelle
Die Scala-Verbindung ist unterbrochen
corvus_192
7

Anstatt Nicht-OO-Entwurfsmuster zu benennen, möchte ich Ihnen einige Beispiele für Bücher geben, die viele Entwurfsmuster enthalten (in denen einige Muster immer noch OO-spezifisch sind):

Hoffe das hilft

KeesDijk
quelle
Dies sind die, die ich auch empfehlen würde, sowie die Enterprise-Integrationsmuster von Hohpe & Woolf .
TMN
Fowlers Muster sind sehr OO :)
David Conde
@ David Conde :) Die meisten von ihnen sind reine OO, alle sind in einer OO-Weise niedergeschrieben, aber einige gelten auch für Nicht-OO: siehe "Webpräsentationsmuster", "Sitzungsstatusmuster", "Verteilungsmuster" "
KeesDijk
2

In der funktionalen Programmierung (insbesondere in Haskell) gibt es viele Muster und Redewendungen, die OOP nicht sehr gut entsprechen. Phantomtypen sind ein bekanntes Beispiel, und auf der Wiki-Seite von haskell zu Idioms finden Sie noch viel mehr .

yatima2975
quelle
1

Modulare Programmierung ist sehr beliebt für numerische Bibliotheken und mathematisch anspruchsvolle Anwendungen (numerische Software ist bekanntermaßen schwer mit objektorientierten Mustern zu modellieren, vor allem, weil Sie nur sehr wenig einkapseln können).

quant_dev
quelle
In JS & "pure C" verwendet: en.wikipedia.org/wiki/Module_pattern
umlcat
0

Ich stelle mir Datenstrukturen wie Warteschlangen, verknüpfte Listen, Bäume, Diagramme usw. gerne als Muster vor. Sie definieren bestimmte Muster zum Speichern und Verarbeiten von Daten. Sie mögen primitiv erscheinen im Vergleich zu Gang of Fours High-End-Mustern, aber sie sind nichtsdestotrotz Muster. Ich meine, was würde passieren, wenn jemand einen Stapel als FIFO anstelle eines LIFO und umgekehrt für eine Warteschlange implementieren und sie anders benennen würde?

DPD
quelle