Czy jako programista Javascript uważasz, że tradycyjne wzorce projektowe są ważne lub mniej ważne niż w przypadku innych języków / środowisk ?.
Klasyczne wzorce projektowe nie dotyczą JavaScript.
Obowiązuje pisanie kodu modułowego i funkcjonalnego.
Powinieneś użyć kombinacji Konstruktorów i funkcji pierwszej klasy.
Jako programista JavaScript osobiście staram się traktować JavaScript jako LISP, a nie Java. Spróbuj więc emulować monady i kod funkcjonalny wysokiego poziomu zamiast próbować emulować klasyczny kod OOP.
Proszę wymienić trzy najlepsze wzorce projektowe, których programista Javascript regularnie używa, i podać przykład, w jaki sposób pomogły one w rozwoju Javascript.
Znów wzory projektowe nie mają tak wielkiego zastosowania, ale poniżej są trzy ważne konstrukcje.
- Zastosowanie zamknięć
- Korzystanie z funkcji pierwszej klasy
- Korzystanie z fabryk obiektów z lub bez
new
Proszę zostawić jakiś kontekst, dla którego mogę pokazać przykłady tego rodzaju technik w porównaniu do robienia tego samego rodzaju kodu przy użyciu tradycyjnych wzorców projektowych.
Rzućmy okiem na niektóre klasyczne Wzory Projektowe i jak je wdrożyć w js, a także alternatywne wzory bardziej dostosowane do samego js:
Wzór obserwatora:
W node.js
tym jest po prostu events.EventEmitter
. W jQuery
tym jest $.fn.bind
&& $.fn.trigger
. W backbone
tym jest Backbone.Events.trigger
i Backbone.Events.bind
. Jest to bardzo powszechny wzorzec stosowany w codziennym kodzie.
Nigdy nie zatrzymuję się i myślę „Hej, używam tutaj wzoru obserwatora!”. Nie, jest to tylko niski poziom przekazywania wiadomości lub sposób kaskadowej zmiany.
Na przykład w szkielecie wszystkie widoki MVC wiążą się ze onchange
zdarzeniem modeli , więc zmiana modelu powoduje kaskadowe zmiany w widoku automatycznie. Tak, jest to potężny wzorzec, ale jego użycie jest tak powszechne w programowaniu sterowanym zdarzeniami, że nie zdawano sobie sprawy z używania go wszędzie.
W WebSocket
protokole mamy, .on
którego używamy do wiązania on("message", ...
zdarzeń. Znowu jest to bardzo powszechne, ale jest to obserwator na strumieniu, a nie oparty na klasycznym OOP while (byte b = Stream.ReadNextByte())
.
Są to wszystkie potężne zastosowania wzorca Observer. Ale to nie jest wzór, którego używasz. To jest prosta część języka. To tylko kod.
Wzór pamiątkowy:
To jest po prostu JSON. Pozwala na serializację stanu obiektu, dzięki czemu można cofnąć akcję.
function SomeObject() {
var internalState;
this.toJSON = function() {
return internalState;
}
this.set = function(data) {
internalState = data;
}
this.restore = function(json) {
internalState = JSON.parse(json);
}
}
var o = new SomeObject();
o.set("foo"); // foo
var memento = JSON.stringify(o);
o.set("bar"); // bar
o.restore(memento);
W JavaScript natywnie obsługujemy API dla pamiątek. Po prostu zdefiniuj metodę wywoływaną toJSON
na dowolnym obiekcie. Kiedy zadzwonisz JSON.stringify
, wewnętrznie wywoła .toJSON
Twój obiekt, aby uzyskać prawdziwe dane, które chcesz serializować do JSON.
To pozwala trywialnie tworzyć migawki twojego kodu.
Ponownie nie zdaję sobie sprawy, że to wzór pamiątkowy. Jest to po prostu użycie narzędzia do serializacji, jakim jest JSON.
Wzorzec stanu / wzorzec strategii:
Nie potrzebujesz wzorca stanu. Masz funkcje pierwszej klasy i typy dynamiczne. Wystarczy wstrzyknąć funkcje lub zmienić właściwości w locie.