🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Dobre praktyki

#231897
From: Marek S
Date: Sat, 27 Jan 2018 20:59
95 lines
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-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>

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