Warum werden den Sprachkonstrukten keine Entwurfsmuster hinzugefügt?


11

Kürzlich habe ich mit einem Kollegen gesprochen, der erwähnte, dass sein Unternehmen daran arbeitet, das MVC-Entwurfsmuster als PHP-Erweiterung hinzuzufügen.

Er erklärte, dass sie C-Code zum Hinzufügen Controllers, Models and Viewszu den Sprachkonstrukten geschrieben haben, um die Leistung zu steigern.

Jetzt weiß ich, dass MVC ein Architekturentwurfsmuster ist, das in Webanwendungen weit verbreitet ist, aber ich muss immer noch auf Sprachen stoßen, die beispielsweise ein Sprachkonstrukt für Controller haben.

IMHO kann die Integration von Designmustern in eine Sprache die Bedeutung eines guten OO-Designs unterstreichen.

Also, warum sind nicht die am häufigsten verwendeten Entwurfsmuster (MVC, Fabrik, Strategie, ... usw.) Hinzugefügt , um die Sprachkonstrukte?

Wenn die Frage zu weit gefasst ist, können Sie die Frage nur auf PHP beschränken.

Bearbeiten:

Ich impliziere nicht, dass man bei der Entwicklung eines Projekts ein Entwurfsmuster verwenden muss . Eigentlich fördere ich die Methode, es einfach zu halten, solange es funktioniert.


19
Es gibt eine Denkschule, die besagt, dass zu viele Muster ein Sprachgeruch sind. Sicherlich verschwinden viele Muster im GO4-Buch oder werden in Lisp zu einem 1-Liner.
Zachary K

5
"Der Bau von Fabriken ist in jedem Projekt zu 100% garantiert." Dann haben Sie an schlechten Projekten gearbeitet. Die Fabrik ist zwar ein nützliches Muster, aber keineswegs garantiert. Jedes OOP hat ein Werksmuster. Es wird Konstruktor genannt.
Euphoric

9
Ich bin ziemlich skeptisch gegenüber der ganzen OO-Sache im Allgemeinen. Es könnte eine Idee geben, die Wiederverwendbarkeit zu fördern, ja, aber es funktioniert einfach nicht. Und sobald Sie einige wirklich leistungsstarke Tools wie Metaprogrammierung, Funktionen hoher Ordnung, leistungsstarke Typsysteme, Module usw. zur Verfügung haben, können Sie alle OO-Entwurfsmuster einfach als neue Sprachkonstrukte ausdrücken - aber Sie würden es tun Ich will es nicht tun, denn mit all diesen brauchst du überhaupt kein OO mehr.
SK-Logik

2
Da dies das Hinzufügen von Features in der Allzwecksprache bedeutet, möchten Sie keine Sprache mit zweitausend Features, da all diese Syntaxen und subtilen Wechselwirkungen zwischen den Features nicht in Ihren Kopf passen. Stattdessen möchten Sie eine Sprache mit einem minimalen Satz von Funktionen, die viele Designmuster prägnant genug aufnehmen können. Wenn ein Entwurfsmuster in Bezug auf vorhandene Sprachfunktionen mit einer nicht allzu schlechten Syntax geschrieben werden kann, sind die Kosten für das Hinzufügen der neuen Funktion viel höher und würden die Sprache unnötig komplizieren.
Lie Ryan

5
Es gibt auch eine Denkschule (zu der ich gehöre) , die besagt, dass Designmuster nur Problemumgehungen für Sprachmängel sind. In ihren Augen würden nicht alle vorhandenen Entwurfsmuster in der perfekten Sprache existieren; aber die beliebtesten Sprachen sind in Anbetracht weit entfernt , perfekt, wir sind mit diesen Abhilfen stecken. (Beispiel)
BlueRaja - Danny Pflughoeft

Antworten:


20

Entwurfsmuster werden ständig zu Sprachkonstrukten hinzugefügt. Schon mal was vom Subroutine Call Design Pattern gehört? Nein? Ich auch nicht. Das liegt daran, dass Subroutinenaufrufe, die in den frühen 1950er Jahren ein Entwurfsmuster waren , den Sprachen ziemlich sofort hinzugefügt wurden. Heutzutage sind sie sogar in den Maschinencode-Befehlssätzen von CPUs vorhanden.

Was ist mit dem For Loop Design Pattern? Das While-Loop- Designmuster? Das Schalterdesignmuster ? Das Objektdesignmuster ? Die Klasse Design - Muster? All dies wurde einigen Sprachen hinzugefügt.


Tatsächlich waren verschiedene Entwurfsmuster für Unterprogrammaufrufe (zumindest im Assembler- und Maschinencode) bis in die späten 50er und frühen 60er Jahre üblich und wurden beispielsweise auch im M6800 (dem 8-Bit-Modell) ausgestellt. Suche nach Wheeler jumpoder Modified Wheeler jump.
Vatine

Das Fehlen eines solchen Konstrukts in der TI-83 PlusGrundsprache führte zu einem ähnlichen Muster, als ich um 2001 das Programmieren lernte.
Izkata

12

Einige von ihnen sind. Zum Beispiel sind Iteratoren Sprachfunktionen in vielen Sprachen und ihren Standardbibliotheken (hi there, foreach und Yield Return). Observer ist auch häufig in Form von Ereignissen vorhanden (nicht in PHP - Sie müssen das Rückrufabonnement selbst verwalten). Befehl ist die Kernfunktion in WPF.

Viele der anderen würden nicht wirklich von der Sprachunterstützung profitieren (und die Sprache umständlicher machen) - wie würden Sie Controller vereinfachen, wenn Sie Sprachfunktionen für sie entwerfen könnten? Als Klassen profitieren sie von der gesamten Infrastruktur, die bereits zur Unterstützung von Klassen vorhanden ist. Sie können sie instanziieren, weitergeben und beispielsweise wie jedes andere Objekt einem Komponententest unterziehen.

Die einzige Komponente von MVC, die IMO von einer Art Sprachunterstützung profitieren könnte, ist View (mit einer offiziellen Template-Engine) - und es wird bereits in PHP unterstützt - Sie können PHP-Skripte dynamisch erstellen und laden (was häufig der Fall ist) eine Art Vorverarbeitung, die als Vorlagen verwendet wird).

Gleiches gilt für die Factory-Methode - wie würden Sie das vereinfachen, wenn Sie eine gewünschte Sprachfunktion hätten? Eine Funktion, die einigen Sprachen (wie C ++) fehlt, ist die Fähigkeit, Objekte aus diesem Typnamen zu erstellen. Die meisten übergeordneten Sprachen können dies jedoch (und es ist nicht einmal erforderlich, nützliche Factory-Methoden zu erstellen). Abgesehen davon müssen Sie lediglich eine Methode erstellen können, die instanziiert und zurückgibt und ein Objekt erstellt.


10
Sogar die Objektorientierung kann als ein bestimmtes Muster angesehen werden, das als nützlich erachtet und daher in viele Sprachen eingebrannt wurde. Im Allgemeinen ist das Vorhandensein eines Musters ein Indikator für das Fehlen eines Sprachmerkmals.
Andrea

7

Einige Entwurfsmuster werden in der Tat als Sprachkonstrukte hinzugefügt - sie werden einfach nicht als solche identifiziert, weil die Leute sie als "Syntax" betrachten, sobald sie eingebaut sind. Die Ausnahmebehandlung in Java ist ein gutes Beispiel - viele Leute würden etwas Ähnliches explizit codieren als Entwurfsmuster, wenn es nicht Teil der Kernsyntax war.

Um sich auf die Frage zu konzentrieren: Es gibt viele Gründe, warum Sie einer Sprache nicht zu viele Entwurfsmuster hinzufügen möchten:

  • Es ist nicht erforderlich , sie als Sprachkonstrukte hinzuzufügen - alle Entwurfsmuster können auf andere Weise implementiert werden
  • Dies würde die Sprache komplizieren - dies ist eine schlechte Idee, da es das Erlernen der Sprache erschwert, das Schreiben von Compilern und Tools erschwert
  • Für viele Entwurfsmuster gibt es alternative Implementierungsansätze . Die Wahl eines Ansatzes und dessen Segen als Teil der Kernsprache würde wahrscheinlich dazu führen, dass Menschen diesen Ansatz gegenüber anderen verwenden (was unter bestimmten Umständen viel besser sein könnte).
  • Übermäßiges Vertrauen in Designmuster ist wahrscheinlich auf jeden Fall eine schlechte Idee - Sprachdesigner erkennen wahrscheinlich, dass sie sie nicht noch weiter ermutigen sollten.

Wenn Sie eine ausreichend leistungsfähige Sprache mit Metaprogrammierfunktionen (z. B. ein Lisp) verwenden, ist es relativ einfach, die Sprache selbst zu erweitern, um ein beliebiges Entwurfsmuster zu implementieren . Sie benötigen überhaupt keine Muster in der Kernsprache, wenn es einfach ist, Ihre eigenen mit einem 5-zeiligen Makro hinzuzufügen.


4

Warum werden den Sprachkonstrukten nicht die am häufigsten verwendeten Entwurfsmuster (MVC, Factory, Strategie usw.) hinzugefügt?

Die meisten dieser Muster können in den meisten Programmiersprachen ohne spezifische sprachliche Unterstützung implementiert werden. Nehmen Sie zum Beispiel MVC in Java:

  • Sie können es direkt codieren.
  • Sie können es mit einem Anwendungsgenerator implementieren ... und sich gleichzeitig um eine ganze Reihe anderer Boilerplates kümmern.
  • Sie können es mithilfe von "Framework" -Bibliotheksklassen implementieren.
  • Sie können es mithilfe von Anmerkungen und statischer oder Laufzeitanmerkungsverarbeitung implementieren.

Angesichts all dieser Optionen ist es wenig sinnvoll, die Sprache direkt zu erweitern. Und es gibt eine Reihe von "Nachteilen":

  • Dies würde dazu neigen, die Sprachsyntax zu überladen, was Anfängern (wohl) das Leben erschwert.
  • Dies würde dazu neigen, die Sprachspezifikation größer und komplexer zu machen, was es für Sprachimplementierer schwieriger macht. (Und je größer die Spezifikation ist, desto wahrscheinlicher ist es natürlich, dass Fehler und Inkonsistenzen auftreten.)
  • Es wird immer Druck geben, noch ein weiteres Muster hinzuzufügen ... was zu Problemen / Bedenken hinsichtlich der Sprachstabilität führt.
  • Indem Sie bestimmte Muster in der Sprache unterstützen, können Sie bestimmte Methoden zur Unterstützung der Muster fest verkabeln, die für einige Anwendungen möglicherweise nicht geeignet sind.

4

Sie sind.

Funktionen waren ein Entwurfsmuster im Assembler-Code, bevor sie in C zu einem Sprachkonstrukt wurden.

Virtuelle Funktionen waren in C ein Entwurfsmuster, bevor sie in C ++ zu einem Sprachkonstrukt wurden.

Es gibt jedoch einen Kompromiss. Wenn das Muster die Produktion von Boilerplate-Code (sogar ein paar Schlüsselwörter) beinhaltet, ist dies ein Hinweis darauf, dass dies eine nützliche Sprachfunktion wäre. Aber wenn das Muster einfach und klar ist, z. Cs "für (int i = 0; i <10; i ++)", es ist immer noch nützlich, dass jeder es auf die gleiche Weise schreibt, aber es ist nicht wesentlich länger als "für i = 0 bis 10" und hat den signifikanten Vorteil, dass es ist Es ist offensichtlich, wie man es ändert, um eine etwas andere Schleife zu erstellen.


3

Lesen Sie das Buch "Viererbande" und es wird klar, dass:

  1. Designmuster im Buch sind eigentlich bekannte Smalltalk-Konventionen, die in anderen OO-Sprachen codiert sind.
  2. Daher können diese Muster nicht in die OO-Sprache aufgenommen werden - es würde eine Neuimplementierung von Smalltalk in diesen Sprachen bedeuten - es ist besser, Smalltalk direkt zu verwenden
  3. Entwurfsmuster sind nützlich, weil sie die Rolle der derzeit verwendeten Sprache nicht besonders hervorheben und sich auf andere Aspekte als die Syntax konzentrieren. Das Codieren dieser Muster in der Sprache würde diese Funktion der Entwurfsmuster verlieren.
  4. Das eigentliche Problem bei der obigen Frage ist, dass der Punkt übersehen wird, dass es beim Schreiben von Software nicht nur darum geht, die Sprache zu lernen. Es ist wichtig, ausreichend Abstand zu der Sprache zu halten, die direkt bereitgestellt wird, und sich auf die aktuellen Anforderungen zu konzentrieren.

2

Weil Entwurfsmuster mit Benutzercode perfekt implementiert werden. Sein Beispiel ist nur passiert, weil es PHP ist - aber wenn Sie tatsächlich Leistung benötigen, würden Sie einfach in einer anderen Sprache arbeiten oder HipHop oder so etwas bekommen.

Sprachfunktionen sind kompliziert zu spezifizieren und zu implementieren, und es ist nicht gerechtfertigt, eine für den alleinigen Zweck von "Die aktuellen Redewendungen sind X" zu erstellen. Sie würden kaum einen aussagekräftigen Benutzercode speichern, und das umsonst.


0

Eh, veraltete Frage, aber ich bin mit vielen Antworten nicht einverstanden, je nachdem, wo Sie "Design Patterns" auf dem Semantik-Zifferblatt eingestellt haben, einschließlich des akzeptierten.

Im Sinne von GoF Design Patterns würde ich sagen, dass es darauf ankommt. MVC zum Beispiel (eigentlich kein GoF-Muster, passt aber in diese Form) ist völlig ungeeignet, um es als Sprachkonstrukte für den Massenkonsum auszudrücken (obwohl es für ein bestimmtes PHP-Projekt möglicherweise sinnvoll ist). Als architektonisches Muster gibt es ständige Variationen des Themas und eine Vielzahl von absolut legitimen Interpretationen für verschiedene Umstände (obwohl viele so weit von MVC abweichen, sollten sie es wahrscheinlich nicht mehr MVC nennen). Zum Beispiel macht es die http-Barriere im Web zu einer etwas unangenehmen Anpassung, je nachdem, ob Sie versuchen, die Client-Seite (ohne Zweifel schmerzhaft) in die Gleichung einzubeziehen, und was Sie als "die Ansicht" betrachten angemessen streng serverseitige Perspektive.

Iterator hingegen ist ein sehr allgemeines Konzept, das auf sehr unterschiedliche Weise auf eine Vielzahl von Konstrukten angewendet werden kann.

Wo die Grenze gezogen werden sollte, ob etwas in ein Kernsprachendesign gehört, selbst in eine serverseitige webspezifische Sprache, IMO, ist der Punkt, an dem etwas die Grenze überschreitet, um es einfacher zu machen, eine unkalkulierbare Anzahl von Dingen zu erledigen einfacher als eine übermäßig spezifische, aber breit implementierte Sache wie ein Architekturmuster für Sie zu tun.

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.