Rozważ aplikację, która pozwala wtyczkom reagować na przebieg programu.
Znam 2 sposoby na osiągnięcie tego: haczyki i wydarzenia
1. Haki
Użyj wywołań, aby opróżnić funkcje wewnątrz głównego programu. Funkcje te można zastąpić za pomocą wtyczek.
Na przykład Drupal CMS implementuje zaczepy dostępne dla modułów i motywów. Oto przykład implementacji hooka w funkcji file_copy .
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;
// ...
}
Moduł może implementować modulename_file_copy($file, $source)
funkcję, która zostanie wywołana przez module_invoke_all
in file_copy
. Po zakończeniu tej funkcji file_copy
wznawia wykonywanie.
2. Wydarzenia
Niech aplikacja wysyła zdarzenia, które mogą być odsłuchiwane przez wtyczki. Po otrzymaniu zdarzenia, które subskrybuje, wtyczka przechwytuje przebieg programu i wykonuje niezbędne operacje.
Na przykład wtyczka galerii jQuery Fotorama realizuje kilka zdarzeń . Jako przykład, oto część jego show
metody, która uruchamia fotorama:show
zdarzenie.
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.]
};
Skrypt może nasłuchiwać tego zdarzenia i robić coś po jego uruchomieniu:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
PYTANIE
Czy istnieją inne główne sposoby implementacji takiego zachowania wtyczek?
Jeśli nie, to kiedy należy użyć haczyków, a kiedy zdarzeń? Biorąc pod uwagę ostateczny cel, to uczynienie kodu łatwiejszym w utrzymaniu i czytelnym, zarówno z perspektywy aplikacji, jak i twórcy wtyczek?
Zdecydowanie wydarzenia pozwalają na niezbędną abstrakcję już na poziomie architektonicznym.
Nie oczekuj, że ktokolwiek pisze wtyczkę, robi to w sposób udokumentowany lub w jakikolwiek sposób poprawny. Utrzymuję dobrze udokumentowane API z milionami użytkowników i mogę powiedzieć z bardzo bolesnego doświadczenia, że w zasadzie nikt nigdy nie czyta dokumentacji i prawie nikt nie używa poprawnie API.
Weź przykład z hakami: Masz system, w którym działa 20 wtyczek. Jedna z tych wtyczek wywołuje
file_copy
metodę w sposób, w jaki jest udokumentowana i oczekuje wyniku zgodnie z dokumentacją. Ale niektóre inne wtyczki podłączyły tę funkcję i dlatego jeden z następujących problemów powoduje awarię lub nieprawidłowe działanie:Jeśli zrobisz to samo co powyżej w przypadku zdarzeń z tymi samymi problemami w tych wtyczkach, dzieje się tak:
źródło
Dziedziczenie może być opcją.
Poza chwytaniem dziedziczenie nie wymaga dodatkowych definicji metod i nie ma utraty wydajności w przypadku wywoływania pustej metody, na wypadek gdyby nic się nie podłączyło.
Oprócz zdarzeń dziedziczenie również nie wymaga dodatkowego kodu do wywołania zdarzenia.
Jednak dziedziczenie działa najlepiej, jeśli tylko jedna wtyczka modyfikuje jeden typ zachowania. Jeśli potrzebujesz wielu wtyczek, drugi musiałby pochodzić z pierwszego itd., Co nie jest właściwe.
źródło
Zdecydowanie wydarzenia. Pozwala to na większą skalowalność architektury.
Wyobraź sobie, co się stanie, jeśli na przykład będziesz musiał umieścić wtyczkę na osobnym komputerze. Korzystanie ze zdarzeń - wystarczy zmodyfikować niewielki spokój kodu, aby Twoje wydarzenia były oparte na sieci.
źródło