2013-05-02 19 views
22

Mam model, który "przeniesie" (Model.validator) instancję sprawdzania poprawności z nim, i potrzebuję walidatora, aby mieć dostęp do atrybutów modelu. Tak, co wymyśliłem jest następujący: Ten kod tworzy odniesienie kołowe między tymi 2 obiektami. Czy jest to zła praktyka, która spowoduje wycieki pamięci? Jakieś inne pomysły na jego implementację?Czy okrężne odniesienie między obiektami jest złym ćwiczeniem?

P.S. Widziałem takie kołowe odwołania między obiektami w zakresach Angular.js.

+6

@ArunPJohny: IE6 może ... ale nowoczesne silniki JS są całkowicie w stanie obsłużyć cykle GC. – georg

+3

@ArunPJohny: Nawet w IE6, jeśli są one zwykłymi obiektami JS i nie zawierają DOM – Bergi

+0

Należy pamiętać, że odwołania kołowe spowodują problemy w przypadku serializacji (na przykład poprzez "JSON.stringify()") – Uriel

Odpowiedz

19

Ten rodzaj kodu nie spowoduje wycieków pamięci w dzisiejszych przeglądarkach; jako mentioned on MDN wszystkie główne przeglądarki zostały wysłane z Mark-and-Sweep GCs (które mogą obsługiwać cykle dobrze) od jakiegoś czasu (np. Firefox sam miał kolekcjoner od czasu wersji 3).

Z architektonicznego punktu widzenia ten rodzaj kodu wprowadza umiarkowanie ścisłe połączenie między dwoma obiektami (jeśli zmieni się choćby w drobny sposób, drugi musi zostać poddany przeglądowi, aby ustalić, czy musi on również ulec zmianie) i powinien w konsekwencji należy unikać, jeśli to możliwe. Ale nie ma w tym nic z natury nie w porządku.

+6

"umiarkowanie ciasne sprzężenie "- masz prezent za niedopowiedzenie. –

+1

@ErickRobertson: No cóż, w innych językach istnieje również dziedziczenie oparte na klasach, 'friend'," po prostu załatwiaj sprawę ", zastanawiasz się ... przynajmniej tutaj możesz się tylko pozbyć z publicznego interfejsu. :-) – Jon

2

Na pewno nie będzie żadnych problemów. Parsery JS większości przeglądarek mogą pracować z obiektami zależnymi od cyklu podczas zbierania śmieci. Koniec z potencjalnymi problemami.

2

Nie będzie problemu z wyrzucaniem elementów do śmieci: każdy nowy Garbage Collector (> IE6) obsłuży okrągłe odnośniki!

Może to jednak stanowić problem, jeśli użytkownik wykonuje funkcje rekurencyjne lub drukuje obiekt.

Więc odpowiedź brzmi: to nie jest problem, jeśli nie zepsuć sobie :-)