Znaczenie wzorców projektowych w Javascript, NodeJs i in

36

Ponieważ JavaScript wydaje się być wszechobecnym językiem programowania w Internecie w ciągu najbliższych kilku lat, nowe frameworki pojawiają się co pięć minut, a programowanie oparte na zdarzeniach zajmuje wiodącą rolę zarówno po stronie serwera, jak i klienta:

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 ?.

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.

Chwytak
źródło
5
Niektórzy twierdzą, że wzorce projektowe (zwłaszcza te GoF) są oznakami niedoboru języka (patrz ta dyskusja ). Ponieważ JavaScript ma charakter prototypowy i funkcjonalny, powiedziałbym, że inny zestaw wzorców ma zastosowanie / jest użyteczny.
bardzo zainteresowany odpowiedziami ... +1 na pytanie :)
usoban
2
Książka Wzory JavaScript autorstwa Stoyana Stefanowa to świetne źródło informacji na temat mnóstwa wzorów, które można wykorzystać w JS. Wiele z nich istnieje specjalnie dla JS, a nie dla żadnego innego języka.
IgorGanapolsky
JavaScript ma swoje własne wzorce. Oprócz książki, o której wspomniał Igor, jest też bezpłatny Addy Osmani's Learning Javascript Design Patterns .
user16764

Odpowiedzi:

23

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.

  1. Zastosowanie zamknięć
  2. Korzystanie z funkcji pierwszej klasy
  3. 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.jstym jest po prostu events.EventEmitter. W jQuerytym jest $.fn.bind&& $.fn.trigger. W backbonetym jest Backbone.Events.triggeri 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 onchangezdarzeniem 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 WebSocketprotokole mamy, .onktó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ą toJSONna dowolnym obiekcie. Kiedy zadzwonisz JSON.stringify, wewnętrznie wywoła .toJSONTwó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.

Raynos
źródło
Raynos, niezła odpowiedź. Jeśli chodzi o przykłady, myślałem więcej z poziomu koncepcyjnego. Na przykład: „wzorzec obserwatora pomógł w sytuacji ...”
@ Lewis wybiera kilka wzorów, które ci się podobają, a później postaram się zasugerować bardziej odpowiednie funkcjonalne alternatywy.
Raynos
Podejście wysiłkowe i odpowiedź są genialne Raynos. Dzięki.
Lewis,
@ Lewis Próbowałem spojrzeć na kilka innych, ale wpadłem w zakłopotanie, ponieważ wszystkie są dostosowane do ściśle klasycznych języków OO. jeśli są inne konkretne wzory, na które chciałbym spojrzeć, daj mi znać.
Raynos
Zapomniałeś o Prototype wzór - aka głupi JavaScript nie ma nawet normalnego oop ;)
C69
10

Weź tę odpowiedź jako subiektywną opinię.

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?

Jeśli masz na myśli tradycyjne wzorce projektowe, takie jak Gang of Four , wówczas większość technik jest agnostycznych dla języka / platformy, takich jak „Program do interfejsu, a nie implementacja” lub „Preferuj kompozycję obiektów nad dziedziczeniem klas” i są one równie ważne dla programistów JavaScript.

Bardziej szczegółowe wzorce, takie jak kreacyjne, strukturalne i behawioralne, mogą lub nie muszą być używane w taki sam sposób lub tak często, jak w innych językach, ponieważ cechy językowe mogą mieć duży wpływ na ich użycie. Dlatego niektóre języki (w tym JavaScript) mają własne wzorce projektowe oparte na oferowanej przez nich funkcjonalności lub składniowym cukrze.

Ogólnie powiedziałbym, że tradycyjne wzorce projektowe są równie ważne, jak w innych językach, ale wzorce specyficzne dla JavaScript są ważniejsze niż tradycyjne.

wymień trzy najlepsze wzorce projektowe, których programista Javascript regularnie używa, i podaj przykład, w jaki sposób pomogły Ci one w rozwoju Javascript

Spośród podstawowych wzorców projektowych JavaScript najczęściej używam tych:

1. Wzór konstruktora (z prototypami)

Zwłaszcza po stronie serwera podczas pisania rzeczy node.js, ponieważ dobrze nadaje się do pisania modułów, chociaż brakuje natywnej enkapsulacji. Jest również popularny wśród wielu programistów, jeśli przeglądasz repozytoria w GitHub, więc znajomość tego wzorca może pomóc lepiej zrozumieć inne kody.

2. Ujawnianie wzoru modułu

Oferuje modułowość z enkapsulacją.

3. Wzór SUCHY

Jest to raczej specyficzne dla scenariusza, chociaż każdy programista powinien z niego korzystać tak często, jak to tylko możliwe.

yojimbo87
źródło
Dzięki! Niezła odpowiedź i taka odpowiedź, na jaką liczyłem. Chociaż pytanie można uznać za subiektywne, dobra odpowiedź taka jak ta sugeruje, że istnieje odpowiednia odpowiedź. Poczeka na więcej odpowiedzi przed „wylogowaniem się”.
2

Wzory projektowe są nauczane w klasach projektowania dla CS. Nie są one niezbędne, ale naprawdę pomocne, jeśli można znaleźć analogiczne sytuacje, aby uzyskać przemyślane rozwiązanie.

Pozwala także programiście na łatwiejszą komunikację. Możesz również porozmawiać ze swoim współpracownikiem w kwestii wzorów. Jeśli powiesz tutaj, że mam mojego obserwatora, to całkiem dobrze rozumiem, co się dzieje.

Ludzie naturalnie wymyślą rozwiązania, które same pasują do wzorca projektowego, ale wzorce projektowe pomagają zdefiniować terminologię i standardowe pomysły, które mogą być pomocne.

Nie ma nic nadzwyczajnego w wzorach, najmilszą rzeczą jest to, że są to pomysły kanonizowane i definiowane w sposób, który jest wielokrotnie użyteczny.

niestandardowe naklejki
źródło
1

Czy jako programista Javascript uważasz, że tradycyjne wzorce projektowe są ważne lub mniej ważne

Są niezbędne.

Jest tak, ponieważ koncepcje rozwiązań wielokrotnego użytku mogą wykraczać poza język. - zmiany składniowe - zmiany implementacyjne - Pojęcie wzorca nadal istnieje.

Programiści z dowolnego języka mogą uczyć się zaawansowanego JS, ucząc się wzorców, a nie składni. Tych, którzy nie wiedzą o tym, brakuje.

Proszę wymienić trzy najlepsze wzorce projektowe, których programista Javascript regularnie używa

Są często używane wzorce, przeciwko którym niektórzy „argumentują”. Warto je jednak wiedzieć, ponieważ są niezwykle popularne i zaawansowane w zaawansowanym JS.

1- Przestrzeń nazw - zawiń swój kod w obiekcie.

var x = (function () {}) ();

2 - Konfiguracja obiektów, wzór podobny do fabrycznego. -Pass obiektu do funkcji, a nie kilka zmiennych.

var produkt = fabryka ({});

3- Funkcja oddzwaniania. - Przekaż funkcję jako parametr, która zostanie wywołana po zakończeniu zadania.

funkcja longTask (function () {// zadzwoń do mnie po zakończeniu});

Jak powiedziałem, niektórzy mogą twierdzić, że nie są to wzorce, ale są one bardzo powszechne i bardzo potężne, i należy o nich wspomnieć, ponieważ są one rzeczywiście bardzo przydatnymi rozwiązaniami wielokrotnego użytku do typowych problemów. Co jest definicją wzorca projektowego.

Doskonałe pytanie.

Mam nadzieję, że to pomaga.

Jack Stone
źródło