Article View: pl.comp.lang.php
Article #231898Re: Dobre praktyki
From: Wojciech Bancer
Date: Sat, 27 Jan 2018 22:02
Date: Sat, 27 Jan 2018 22:02
90 lines
4906 bytes
4906 bytes
On 2018-01-27, Marek S <precz@spamowi.com> wrote:
[...]
>>> 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.
A skąd założenie że jest singletonem?
> ...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.
I ponownie, skąd założenie że jest singletonem?
> 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();
Gdzie tu widzisz wzorzec singletona?
Rozumiesz czym jest ten wzorzec?
> ...aplikacja sobie działa i potrzebuje w pewnym momencie dostępu do
> bazy. I co wtedy robi? A no to co napisałeś.
Nie. Aplikacja w konfiguracji trzyma opisy zależności dla poszczególnych
serwisów i udostępnia konterner z tymi serwisami, już zainicjalizowanymi
(lub inicjowanymi w momencie pierwszego załadowania jak dana zależność
wspiera lazy loading). Jednak w tym momencie nie potrzebujemy w ogóle
zmiennych statycznych, a ponieważ inicjalizuje i kontroluje wszystko
manager, to mamy kontrolę nad ilością tworzonych obiektów bez uciekania
się do sztuczek z wzorcem singletona.
> 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."
Nie.
1. Nie ma potrzeby zapewniania globalnego dostępu
2. Możesz tworzyć więcej obiektów, po prostu nie jest to potrzebne.
Wzorzec singletona zakłąda w praktyce istnienie konstruktora
prywatnego i metody statycznej go jego tworzenia. Wtedy jesteś
w stanie zapewnić oba powyższe punkty.
> Nasz kernel wypełnia wszelkie przesłanki bycia singletonem i jest on
> jedynym singletonem w całej aplikacji tej mini aplikacji.
Nie wypełnia.
> Nawet ciężko mi sobie wyobrazić aplikację, nie ma żadnego nadrzędnego
> obiektu, który siłą rzeczy staje się singletonem.
No to mamy niezgodę, bo ja nie uznaję dowolnego pojedynczego obiektu
za singletona tylko dlatego że jest jeden :P
--
Wojciech Bańcer
wojciech.bancer@gmail.com
Technical Details
Message-ID:
<slrnp6ptnk.q0u.wojciech.bancer@pl-test.org>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!peer01.am4!peer.am4.highwinds-media.com!peer03.fr7!futter-mich.highwinds-media.com!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.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> <p4ip7b$boi$1@node1.news.atman.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!peer01.am4!peer.am4.highwinds-media.com!peer03.fr7!futter-mich.highwinds-media.com!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail Newsgroups: pl.comp.lang.php From: Wojciech Bancer <wojciech.bancer@gmail.com> Subject: Re: Dobre praktyki 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> <p4ip7b$boi$1@node1.news.atman.pl> Organization: None Date: Sat, 27 Jan 2018 23:02:28 +0100 User-Agent: slrn/1.0.3 (Darwin) Mime-Version: 1.0 Message-ID: <slrnp6ptnk.q0u.wojciech.bancer@pl-test.org> Lines: 90 NNTP-Posting-Host: 37.47.128.20 X-Trace: 1517090548 unt-rea-a-02.news.neostrada.pl 604 37.47.128.20:24813 X-Complaints-To: abuse@news.neostrada.pl X-Received-Body-CRC: 1009482259 X-Received-Bytes: 4814 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit