Article View: pl.comp.objects
Article #13842Re: Eliminacja singletonów
From: giku1
Date: Thu, 19 Jan 2006 15:08
Date: Thu, 19 Jan 2006 15:08
79 lines
4817 bytes
4817 bytes
Filip Sielimowicz wrote: > U¿ytkownik "Przemek Pokrywka" <adres@zastrzezony.com> napisa³ w wiadomo¶ci > news:dqjqn2$nv2$1@news.onet.pl... > >>W tworzonym przeze mnie systemie u¿y³em w pewnej liczbie przypadków >>wzorca singleton. >> >>W trakcie rozwoju projektu okaza³o siê, ¿e kilka z tych przypadków >>powinno przestaæ byæ singletonami, a wej¶æ w sk³ad instancji pewnego >>komponentu, który do tej pory by³ jeden w ca³ym procesie (systemu >>operacyjnego), a wed³ug nowego wymagania powinna byæ mo¿liwo¶æ >>posiadania jego kilku instancji. >> >>K³opot w tym, ¿e wiele kodu, maj±cego wej¶æ w sk³ad tego komponentu >>polega ju¿ na globalnej obecno¶ci tych paru singletonów. >> >>W tej chwili narzuca mi siê rozwi±zanie, polegaj±ce na tym, ¿eby poprzez >>konstruktory przekazywaæ te obiekty (najlepiej zgrupowane w jaki¶ obiekt >>kontekstu) od obiektu komponentu do najmniejszego z obiektów sk³adowych >>potrzebuj±cego korzystaæ z us³ug obecnych singletonów. Jest to jednak >>dosyæ inwazyjna zmiana i ciekaw jestem, czy nie poradzi³ sobie kto¶ >>kiedy¶ z tym problemem w inny sposób? >> >>Przemek > > > :) > > Przyk³adem jest np. aplikacja, w której pierwotnie ma dzia³aæ jeden operator, > z czasem okazuje siê, ¿e operator czasami musi siê prze³±czaæ, np. kto¶ musi > autoryzowaæ operacjê wyp³aty du¿ej kwoty z kasy i ma zupe³nie inne uprawnienia > (singleton managera uprawnieñ siada, bo my¶la³, ¿e ...), a potem jeszcze > kto¶ wpada na pomys³, ¿eby logikê z aplikacji wynie¶æ na serwer aplikacyjny, > gdzie równolegle pracuje 100 operatorów o ró¿nych uprawnieniach ... > > I tego typu sprawy ... > > Byæ mo¿e u Ciebie sprawa wygl±da podobnie, wiêc rozwi±zanie moze te¿ Ciê skusi. > Otó¿ ka¿dy proces w systemie pracuje w kontek¶cie jakiego¶ w±tku i, przynajmniej > w Javie, ma do tej informacji dostêp z ka¿dego miejsca w kodzie. > W szczególno¶ci maj± do tej informacji dostêp metody getInstance() singletonów. > > Wprowadzamy takie ograniczenie: pojêcie singletona zachowuje swoje znaczenie > na poziomie w±tku, czyli w±tek zawsze widzi tylko jeden obiekt singletona > i siê on nie zmienia. Natomiast implementacja metody getInstance() tam, gdzie > singletony siê nam mno¿±, polega na tym, ¿e korzystaj± one z mapy obiektów, > gdzie kluczem jest w±tek. W tym momencie na potrzeby ka¿dego w±tku mo¿emy > zdefiniowaæ oddzielny obiekt singletona i jest to dla w±tku ca³kowicie > przezroczyste. Ten, kto tworzy w±tek jest odpowiedzialny za to, by > stworzyæ odpowiedni zestaw singletonów i powi±zaæ z w±tkiem. > > Kluczem/wyznacznikiem kontekstu wcale nie musi byæ w±tek. Ale zazwyczaj > w tego typu sytuacjach mo¿emy ³atwo znale¼æ w systemie jaki¶ punkt skupienia, > wokó³ którego wszystko siê krêci, np. sesja zwi±zana z u¿ytkownikiem (a > w±tki wtedy mog± byæ przydzielane dynamicznie do obs³ugi pojedynczych > requestów). Wtedy metody getInstance singletonów jako klucz bior± sesjê, > nie w±tek. > > Mo¿na te¿ trochê od innej strony: scentralizowaæ zarz±dzanie singletonami > i w jednej globalnej mapie trzymaæ obiekty trzymajace referencje na ca³y > zestaw singletonów. Wtedy same singletony ju¿ nie trzymaj± w³asnych map, > tylko odwo³uj± siê do jednej, gdzie ka¿dy ma swoje miejsce. Ale idea > klucza reprezentuj±cego sta³y kontekst dalej ma tu zastosowanie. > Rozwiazanie z watkami, dziala niby piekne a jednak uzaleznianie kontraktu funkcji od watku z ktorego jest wolana to jest czystej postaci HACK refactoring to rape pattern ;) przychodzi nowy developer, ktorego trzeba poinformowac: uwazaj z ktorego watku to wolasz ! mozna pojsc jeszcze dalej, np. exception.printStackTrace( PrintStream mojParser ) wyciagnac informacje skad jestem wolany. Niezla metoda zeby zrobic kumplowi kawal :).
Technical Details
Message-ID:
<dqoa1i$m48$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.gazeta.pl!not-for-mailReferences:
<dqjqn2$nv2$1@news.onet.pl> <dqo2sa$p8v$1@news.onet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.gazeta.pl!not-for-mail From: giku1 <giku@poczta.fm> Newsgroups: pl.comp.objects Subject: Re: Eliminacja singletonów Date: Thu, 19 Jan 2006 16:08:32 +0100 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 79 Message-ID: <dqoa1i$m48$1@inews.gazeta.pl> References: <dqjqn2$nv2$1@news.onet.pl> <dqo2sa$p8v$1@news.onet.pl> NNTP-Posting-Host: 195.94.213.2 Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1137683314 22664 195.94.213.2 (19 Jan 2006 15:08:34 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Thu, 19 Jan 2006 15:08:34 +0000 (UTC) In-Reply-To: <dqo2sa$p8v$1@news.onet.pl> X-Accept-Language: en-us, en X-User: giku1 User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit