2014-07-17 14 views
5

Patrzę na GIST Addy Osmani za wzorzec publikacji/subskrypcji tutaj:Tworzenie zmiennej globalnej od zwracanej wartości funkcji za

https://github.com/addyosmani/pubsubz/blob/master/pubsubz.js

On powierzchnie swój przedmiot jako globalny tak:

;(function (window, doc, undef) { 

var topics = {}, 
    subUid = -1, 
    pubsubz ={}; 

.... 

getPubSubz = function(){ 
    return pubsubz; 
}; 

window.pubsubz = getPubSubz(); 

Jaka jest wartość tworzenia tej funkcji getPubSubz? Czy nie byłoby prościej po prostu napisać:

window.pubsubz = pubsubz; 
+0

Używa również undef, chociaż nie jest potrzebny .. – jantimon

Odpowiedz

2

Tak, w tym przypadku, ponieważ getPubSubz nazywa się tylko w jednym miejscu, zaraz po ogłoszeniu go, może być bezpiecznie inlined.

Trudno dokładnie powiedzieć, co autor miał na myśli, ale w rosnącej bazie kodu może być pewna wartość funkcji "gettera", która mogłaby zostać zmodyfikowana, gdyby akt uzyskania obiektu pubsubz wymagał bardziej zaawansowanej logiki .

+0

Czy możesz podać konkretny przykład tego, jak będzie użyteczny? W innych językach do enkapsulacji używane są gettery i setery, ale w tym przypadku nie widzę przewagi. – Hazaart

+0

@Hazaart: Jeśli kod dojrzewa, aby uzyskać dostęp do obiektu 'pubsubz' z wielu różnych miejsc, a następnie pewnego dnia uświadomisz sobie, że chcesz użyć innej instancji' pubSubz' w zależności od stanu zmiennej przełączającej, byłoby dobrze wystarczy tylko zmienić implementację metody 'getPubSubz', a nie wszystko, co ma do niej dostęp. Oczywiście w takim przypadku nierozsądnym byłoby ujawnienie obiektu jako zmiennej globalnej. Jak już powiedziałem, trudno jest wiedzieć, co autor miał na myśli. – StriplingWarrior

2

To absolutnie byłoby.

Istnieją tylko dwa potencjalne powody, dla getter byłyby stosowane w tym przypadku:

  1. było wcześniej jakiś dodatkowy kod wewnątrz getter (rejestrowania, chyba) tylko po dobrą praktyką
  2. Addy Osmani za * , w tym getter - nawet dodając możliwość dodania dodatkowego kodu w przyszłości.

Mocą GitHub, możemy rzeczywiście eliminate option one, jak getter dodano w jego obecnym stanie, więc myślę, że możemy jednoznacznie powiedzieć, że to tylko kwestia dobrej praktyki tutaj.

* Jak jantimon nawiązuje w komentarzach poniżej, nie jest to szczególnie korzystne w większości przypadków (w tym tej) i ten kod niekoniecznie musi być traktowany jako przykład.

+0

W której książce jest to dobra praktyka? – jantimon

+0

@jantimon dobrze, to nie jest szczególnie korzystne dla JS, masz mnie. Może tylko stare nawyki z języków, w których to jest dobra praktyka :) –

Powiązane problemy