Stellen Sie sich eine App vor, mit der Plugins auf ihren Programmfluss reagieren können.
Ich kenne zwei Möglichkeiten, um dies zu erreichen: Hooks und Events
1. Haken
Verwenden Sie Aufrufe, um Funktionen im Hauptprogrammablauf zu leeren. Diese Funktionen können durch Plugins überschrieben werden.
Beispielsweise implementiert Drupal CMS Hooks, die Modulen und Themen zur Verfügung stehen. Hier ist ein Beispiel, wie Hooks in einer file_copy- Funktion implementiert werden.
function file_copy(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
// ... [File copying routine]
// Inform modules that the file has been copied.
module_invoke_all('file_copy', $file, $source);
return $file;
// ...
}
Ein Modul kann eine modulename_file_copy($file, $source)
Funktion implementieren , die vom module_invoke_all
in aufgerufen wird file_copy
. Nach Beendigung dieser Funktion file_copy
wird die Ausführung fortgesetzt.
2. Ereignisse
Lassen Sie die App Ereignisse versenden, die von den Plugins abgehört werden können. Nachdem ein abonniertes Ereignis empfangen wurde, fängt ein Plugin den Programmablauf ab und führt die erforderlichen Vorgänge aus.
Ein Fotorama-Plugin für die jQuery-Galerie implementiert beispielsweise mehrere Ereignisse . Hier ist ein Teil der show
Methode, die das fotorama:show
Ereignis auslöst.
that.show = function (options) {
// ... [show the new frame]
// [fire the event]
options.reset || triggerEvent('show', {
user: options.user,
time: time
});
// ... [do lots of other stuff with navigation bars, etc.]
};
Ein Skript kann dieses Ereignis abhören und etwas tun, wenn es ausgelöst wird:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
FRAGE
Gibt es andere gängige Methoden, um ein solches Plugin-Verhalten zu implementieren?
Wenn nicht, wann sollte man Hooks verwenden und wann sollte man Events verwenden? Ist es das ultimative Ziel, den Code sowohl aus Sicht der App als auch aus Sicht des Plugin-Entwicklers besser zu verwalten und lesbar zu machen ?
Auf jeden Fall Ereignisse, es ermöglicht die notwendige Abstraktion bereits auf der architektonischen Ebene.
Erwarten Sie nicht, dass jemand, der ein Plugin schreibt, dies tatsächlich als dokumentiert oder in irgendeiner Weise korrekt tut. Ich habe eine gut dokumentierte API mit Millionen von Benutzern gepflegt und kann Ihnen aus einer sehr schmerzhaften Erfahrung sagen, dass im Grunde niemand die Dokumentation liest und fast niemand die API richtig verwendet.
Nehmen Sie das folgende Beispiel mit Hooks: Sie haben ein System, auf dem 20 Plugins ausgeführt werden. Eines dieser Plugins ruft die
file_copy
Methode so auf, wie sie dokumentiert ist, und erwartet ein dokumentiertes Ergebnis. Aber ein anderes Plugin hat diese Funktion aktiviert und eines der folgenden Probleme führt zu einem Absturz oder einer Fehlfunktion:Wenn Sie dasselbe wie oben bei Ereignissen mit denselben Problemen in diesen Plugins tun, geschieht Folgendes:
quelle
Vererbung kann eine Option sein.
Anders als bei Hooks erfordert die Vererbung keine zusätzlichen Methodendefinitionen und es gibt keinen Leistungsverlust beim Aufrufen der leeren Methode, falls nichts angeschlossen ist.
Im Gegensatz zu Ereignissen benötigt die Vererbung keinen zusätzlichen Code für den Ereignisaufruf.
Die Vererbung funktioniert jedoch am besten, wenn nur ein Plugin einen Verhaltenstyp ändert. Wenn Sie viele Plugins benötigen, müsste das zweite von dem ersten usw. abgeleitet werden, was nicht angemessen ist.
quelle
Auf jeden Fall Ereignisse. Dadurch kann Ihre Architektur breiter skaliert werden.
Stellen Sie sich vor, was passiert, wenn Sie Ihr Plugin beispielsweise auf einem separaten Computer installieren müssen. Verwenden von Ereignissen - Sie müssen nur einen kleinen Teil des Codes ändern, um Ihr Ereignisnetzwerk zu optimieren.
quelle