Article View: pl.comp.lang.php
Article #231897Re: Dobre praktyki
From: Marek S
Date: Sat, 27 Jan 2018 20:59
Date: Sat, 27 Jan 2018 20:59
95 lines
4815 bytes
4815 bytes
W dniu 27-01-2018 o 20:35, Wojciech Bancer pisze:
>
> A jest powód by był singletonem?
Poniżej
>
>> To co chcę powiedzieć, to to, że zawsze na szczycie aplikacji jest jakiś
>> obiekt "guru".
>
> Ale to jest powiedzmy kernel aplikacji, który postępuje wg pewnego ustalonego
> sposobu. Gdzie tu widzisz potrzebę na singletona?
Właśnie, trafiłeś w sedno w sformułowaniu "ale to jest _powiedzmy_
kernel". Słowo klucz to "powiedzmy". Mógłbym powiedzieć "zgoda" albo
mógłbym powiedzieć "to jest właśnie singleton" i na jedno by wyszło.
Kernel jest singletonem.
Zobrazuję to na podstawie Twojego przykładu. Oczywiście należy tak
postępować jak poniżej:
> class PobieramZBazy() {
> ___construct($cn) { $this->cn = $cn; }
> public getCostam() {
> return $this->cn->query(...);
> }
> }
...ale właśnie teraz wpadasz w pułapkę tego, o czym cały czas piszę.
Skąd masz połączenie do bazy $cn? Gdzieś ono musiało być zainicjowane i
przechowywane przez całą długość życia aplikacji. Prawda? Zrobi to nasz
"kernel" i udostępni innym obiektom handler do raz ustanowionego połączenia.
Teraz popatrz jak powstaje z kernela singleton:
class kernelZwanySingletonem() {
private $connection;
public function getConnection() {
return $connection;
}
__construct() {
//tu kupa kodu plus inicjacja bazy
$this->$connection=...
}
__destruct() {
//tu kupa kodu
zamknijPołączenieZBazaIZapiszLogi($connection);
}
}
$singleton=new kernelZwanySingletonem();
$singleton->runApplication();
...aplikacja sobie działa i potrzebuje w pewnym momencie dostępu do
bazy. I co wtedy robi? A no to co napisałeś.
$cosTam=new PobieramZBazy($singleton->getConnection());
$wyniki=$cosTam->getCosTam();
... aplikacja dalej pracuje i znów jakiś inny jej moduł potrzebuje
grzebania w bazie więc:
$cosTam2=new PobieramZBazyCosInnego($singleton->getConnection());
$wyniki=$cosTam2->getCosTam();
Gdy aplikacja kończy żywot, to niejawnie wołany jest destruktor kernela
zwanego singletonem. Baza pięknie się zamyka, ba, można nawet sprawdzić
w tym miejscu czy moduły pozamykały prawidłowo swoje recordsety i jeśli
nie, to w logach zapisać alerty.
Ten nasz "kernel" czy klasa "guru" to właśnie nasz singleton. Z jego
egzystencji wszelkie pozostałe funkcjonalności czerpią soki.
I jeszcze jedno: singleton to nie jest masywna ilość statycznych metod.
Singleton nie musi mieć żadnej statycznej. Cytat z Wiki:
"Singleton – kreacyjny wzorzec projektowy, którego celem jest
ograniczenie możliwości tworzenia obiektów danej klasy do jednej
instancji oraz zapewnienie globalnego dostępu do stworzonego obiektu."
Nasz kernel wypełnia wszelkie przesłanki bycia singletonem i jest on
jedynym singletonem w całej aplikacji tej mini aplikacji. Nawet ciężko
mi sobie wyobrazić aplikację, nie ma żadnego nadrzędnego obiektu, który
siłą rzeczy staje się singletonem. No chyba, że programujemy liniowo w
jakimś Basicu itp. Ważne jest aby tylko jeden tego typu obiekt
występował pełniąc rolę np. managera pluginów (z pluginem bazy danych
włącznie) - jak to wcześniej nazwaliśmy.
--
Pozdrawiam,
Marek
Technical Details
Message-ID:
<p4ip7b$boi$1@node1.news.atman.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mailReferences:
<2lhebv1xabri$.dlg@tyczka.com> <6d0bd754-9b46-46ce-98ff-c5265a9a93af@googlegroups.com> <chac9zcm8l6a.1gxug7ng6lbce$.dlg@40tude.net> <cd0f750f-2346-4016-bbbd-a72c386c561d@googlegroups.com> <slrnp6hci6.23ml.wojciech.bancer@pl-test.org> <fc6bfbc5-c858-4156-95c5-cb276d07067e@googlegroups.com> <slrnp6kee7.2lbk.wojciech.bancer@pl-test.org> <p4dnnf$m5b$1@node2.news.atman.pl> <slrnp6kpt1.30s7.wojciech.bancer@pl-test.org> <p4f8p3$tfb$1@node1.news.atman.pl> <slrnp6oqo7.g5g.wojciech.bancer@pl-test.org> <p4hrvu$ctn$1@node2.news.atman.pl> <slrnp6p0qc.gpr.wojciech.bancer@pl-test.org> <p4iev1$uic$1@node2.news.atman.pl> <slrnp6pl4l.mtr.wojciech.bancer@pl-test.org>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail From: Marek S <precz@spamowi.com> Newsgroups: pl.comp.lang.php Subject: Re: Dobre praktyki Date: Sat, 27 Jan 2018 21:59:16 +0100 Organization: ATMAN - ATM S.A. Lines: 95 Message-ID: <p4ip7b$boi$1@node1.news.atman.pl> References: <2lhebv1xabri$.dlg@tyczka.com> <6d0bd754-9b46-46ce-98ff-c5265a9a93af@googlegroups.com> <chac9zcm8l6a.1gxug7ng6lbce$.dlg@40tude.net> <cd0f750f-2346-4016-bbbd-a72c386c561d@googlegroups.com> <slrnp6hci6.23ml.wojciech.bancer@pl-test.org> <fc6bfbc5-c858-4156-95c5-cb276d07067e@googlegroups.com> <slrnp6kee7.2lbk.wojciech.bancer@pl-test.org> <p4dnnf$m5b$1@node2.news.atman.pl> <slrnp6kpt1.30s7.wojciech.bancer@pl-test.org> <p4f8p3$tfb$1@node1.news.atman.pl> <slrnp6oqo7.g5g.wojciech.bancer@pl-test.org> <p4hrvu$ctn$1@node2.news.atman.pl> <slrnp6p0qc.gpr.wojciech.bancer@pl-test.org> <p4iev1$uic$1@node2.news.atman.pl> <slrnp6pl4l.mtr.wojciech.bancer@pl-test.org> NNTP-Posting-Host: 89-69-207-111.dynamic.chello.pl Mime-Version: 1.0 X-Trace: node1.news.atman.pl 1517086763 12050 89.69.207.111 (27 Jan 2018 20:59:23 GMT) X-Complaints-To: usenet@atman.pl NNTP-Posting-Date: Sat, 27 Jan 2018 20:59:23 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 In-Reply-To: <slrnp6pl4l.mtr.wojciech.bancer@pl-test.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit