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 Views
zu 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.
Antworten:
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.
quelle
Wheeler jump
oderModified Wheeler jump
.TI-83 Plus
Grundsprache führte zu einem ähnlichen Muster, als ich um 2001 das Programmieren lernte.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.
quelle
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:
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.
quelle
Die meisten dieser Muster können in den meisten Programmiersprachen ohne spezifische sprachliche Unterstützung implementiert werden. Nehmen Sie zum Beispiel MVC in Java:
Angesichts all dieser Optionen ist es wenig sinnvoll, die Sprache direkt zu erweitern. Und es gibt eine Reihe von "Nachteilen":
quelle
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.
quelle
Lesen Sie das Buch "Viererbande" und es wird klar, dass:
quelle
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.
quelle
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.
quelle