🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.php
Article #231898

Re: Dobre praktyki

#231898
From: Wojciech Bancer
Date: Sat, 27 Jan 2018 22:02
90 lines
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-mail
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>

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