🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #13841

Re: Eliminacja singletonów

#13841
From: Filip Sielimowicz
Date: Thu, 19 Jan 2006 13:06
65 lines
4339 bytes
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.

-- 
Filip Sielimowicz
http://panda.bg.univ.gda.pl/~sielim/fractal/index.htm
Technical Details
Message-ID: <dqo2sa$p8v$1@news.onet.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mail
References: <dqjqn2$nv2$1@news.onet.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mail
From: "Filip Sielimowicz" <sielim@poczta.onet.pl>
Newsgroups: pl.comp.objects
Subject: Re: Eliminacja singletonów
Date: Thu, 19 Jan 2006 14:06:14 +0100
Organization: Onet.pl
Lines: 67
Message-ID: <dqo2sa$p8v$1@news.onet.pl>
References: <dqjqn2$nv2$1@news.onet.pl>
NNTP-Posting-Host: ns2.hands.com.pl
X-Trace: news.onet.pl 1137675978 25887 62.111.242.130 (19 Jan 2006 13:06:18 GMT)
X-Complaints-To: usenet@news.onet.pl
NNTP-Posting-Date: Thu, 19 Jan 2006 13:06:18 +0000 (UTC)
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
X-Sender: HWuT3ZQ16+B3O4dnsZlCZgocIOkeW3FM
X-Priority: 3
X-Newsreader: Microsoft Outlook Express 6.00.2800.1506
X-MSMail-Priority: Normal
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit