DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   Templates, Singleton etc. (http://www.devprotalk.com/showthread.php?t=364)

Ilija Studen 11. 11. 2005. 23:35

<dpt><edit user="bluesman">Ovo je "presečen" thread koji je otišao off topic pa je dinke pokušao da od haosa napravi 2 smislena thread-a, a da bi bilo jasnije onima koji se kasnije uključuju morao sam da dodam ovaj komentar jer ovako izlgeda kao da počinje iz sredine. Obrisane su neke poruke u kojima se direktno obraćamo jedni drugima koje nemaju veze sa temom. Obrisao sam i ja neke svoje poruke tako da je tema pročišćena od privatnosti koliko god je moguće. Hvala dinke :)</edit></dpt>

Citat:

Originalno napisao Petar Marić
Što se tiče primera koje si dao, na stranu što nije realan, pre bih izabrao prvi: čitljiviji je, ako ništa drugo.

PHP kôd:

<?php for($i 0$i 10$i++) { ?>
<?= $i ?>
.<br />
<?php ?>

Najbolji primeri mešanja HTMLa i PHPa su primeri gde IMA HTMLa, ne ovo. Nije ni čudo što izgleda nečitko kad nema šta da se pokaže.

Primer iz života (stranica koja prikazuje sadržaš carta):

PHP kôd:

<h2>Cart</h2>
<p>There are total of <strong><?= CartService::instance()->countProducts() ?></strong> products in the cart with the total order value of <strong><?= CartService::instance()->totalPrice() ?>$</strong>.</p>
<?php if(CartService::instance()->countProducts()) { ?>
<form action="<?= get_url('shopping''update_cart'?>" method="POST">
<table>
  <tr>
    <th width="15%">Quantity</th>
    <th width="65%">Product</th>
    <th width="30%">Price</th>
  </tr>
<?php foreach(CartService::instance()->getOrder()->getOrderedProducts() as $ordered_product) { ?>
  <tr>
    <td><input type="text" name="product_<?= $ordered_product->getProductId() ?>" style="width: 30px; text-align: right;" value="<?= $ordered_product->getQuantity() ?>"/></td>
    <td><?= clean($ordered_product->getProduct()->getName()) ?></td>
    <td style="text-align: right"><?= $ordered_product->getQuantity() ?> x <?= $ordered_product->getPrice() ?>$ = <strong><?= $ordered_product->getTotalPrice() ?>$</strong></td>
  </tr>
<?php // foreach ?>
  <tr>
    <td colspan="2"><div class="formButtons"><input type="submit" value="Update order" /></div></td>
    <td style="text-align: right;"><strong>Total: <?= CartService::instance()->totalPrice() ?>$</strong></td>
  </tr>
</table>
</form>
<?php // if ?>

PS: Pogledajte ovaj kod u nekom normalnom editoru, ovako prelomeljen i sa blago rečeno konfuznim highlightom izgleda odvratno :(

Petar Marić 12. 11. 2005. 04:19

Ilija, mislim da si upoznat sa mojim mišljenjem o ekstenzivnom mešanju php-a i html-a, kao i korišćenju php-a kao template jezika za sam php:
loša ideja IMHCO.

Ilija Studen 12. 11. 2005. 18:54

PHP je templating jezik i nekako mi ideja pravljanje posebnog template jezika za templatate jezik nije baš naj naj. Doduše, više o tome na jednoj starijoj temi. Moje mišljenje o ovoj temi je poznato svima, a iz mog iskustva (nešto obilnije od tvog :p ) znam da ti Smarty nije potreban u 99% slučajeva.

bluesman 12. 11. 2005. 19:47

Iz mog iskustva ( nesto obilnije od tvog :) ) upotreba PHP na nacin na koji ti to radis je najblaze receno radikalna.

Ja još ni u jednoj poznatijoj aplikaciju, uključujući i ovaj forum, nisam video bilo šta slično onome što ti radiš. Nije da sam se nešto nagledao tih aplikacija, možda par takvih, ali siguran sam da mnogi odavde mogu da potvrde ovo što pričam.

Meni je neshvatljivo zasto ti pises:
<?= $ordered_product->getProductId() ?>
umesto:
<?= $ordered_product['productId]; ?>

Imaš tendenciju (a to sam ti već rekao) da komplikuješ stvari. Ako mi objasniš kao da imam 6 godina šta ti dobijaš ovakvim kodom, koje su tu prednosti, mogu da ti obećam da ću i ja da počnem da pišem na isti način. :)

90% funckija u tvom kodu vracaju varijablu koja se zatim echo-uje. Ti znaš da svaka funkcija pri kompajliranju rezerviše određene resurse i mislim da tvoj kod po pitanju resursa uopšte nije optimalan. Neću da grešim dušu jer nisam 100% siguran u ovo što ću ti reći ali mislim da ćeš, pošto nisi do sada radio ništa baš veliko, imati veliki problem po pitanju resursa jednom kada budeš napravio neki veliki web projekat.

Osim to je problem sto covek treba da nagadja sta se dešava iza ->getProductId(); totalno mi je nejasan koncept zasto tako radis za ovakve trivijalne stvari?

Sada ja uzmem da pogledam tvoj kod, ili ne daj Bože nesto izmenim, kao sto sam imao priliku "jedared", i kada vidim
<?= $ordered_product->getProductId() ?>

razmisljam da li on u toj funkciji čita iz baze, sa diska, ko zna šta radi. Zatim moram da otvorim 4 klase da vidim gde je getProductId(), i onda pravo razočarenje, funkcija getProductId () samo vraća nešto tipa:

return $this->product_id;

I onda tako imaš po jednu funkciju za svako polje u bazi (doduše ti si malo elegantnije to rešio ali je i dalje smor.).

Ili recimo:
CartService::instance()->getOrder()->getOrderedProducts()
umesto
$CartService->order->products;
ili
$CartService->order['products'];

Što kažu "pričaj srpski da te ceo svet razume" ja bih rekao "pričaj programerski da svaki programer razume tvoj kod".

Iskreno, to sam ti već jednom rekao, ne znam gde, kako ili od koga si učio programiranje ali ovakvim načinom jedino postižeš to što si "radikalan". Samo nemoj sada da mi daš neki link na neki blog :)

Nije ni čudo da imaš takvo mišljenje o Smarty kada tebi jedan smarty template izgleda ovako:

PHP kôd:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="sr">
<head>
  <title>{$site_name} - {$__document->getTitle()}</title>
{if $__document->getMeta()}
  {foreach item="meta" from=$__document->getMeta()}
    {$meta}
  {/foreach}
{/if}
{if $__document->getLinks()}
  {foreach item="link" from=$__document->getLinks()}
    {$link}
  {/foreach}
{/if}
{if $__document->getScripts()}
  {foreach item="script" from=$__document->getScripts()}
    {$script}
  {/foreach} 
{/if}
{if $__document->getInlineStyles()}
  {foreach item="style" from=$__document->getInlineStyles()}
    {$style}
  {/foreach}
{/if}
</head>
<body>{$__document->getBody()}</body>
</html>

Kada ti ovako template igleda onda si sigurno better-off bez smarty jer ga ionako ne upotrebljavaš. U stvari, tebi ovde smarty samo smeta u tvom konceptu.

Mislim, nisam hteo da (ponovo) pričam o ovome, naročito zato što smo već pričali i privatno i javno, međutim ti i dalje u svojim postovima insistiraš da ceo svet ne zna šta radi, pa rekoh daj da to rešimo već jednom. :)

Ilija Studen 12. 11. 2005. 20:13

Ajmo opet redom:

1. <?= $ordered_product->getProductId() ?> - <?= $ordered_product['productId]; ?>

Koristim Propel, najbolji persistance layer za PHP (PHP port Torque projektu). Ideja je prilično jednostavna: na osnovu XML šeme se automatiski generišu sve potrebne klase i DDL. Dakle, sve te klase i relacije među njima za mene pravi skripta (potrebno vreme od 4 - 7 sekundi). Ja ih samo koristim. Za ručno pravljenje istih bilo bi mi potrebno par sati.

Pošto PHP5 ima podršku za enkapsulaciju ne mogu da pozivam $product->id; iz templatea jer je ID protected polje (kakvo i treba po OO konceptima). To je samo primer dobrog programiranja. Praktičnost je malo narušena, ali kad te metode dobiješ "džabe" (generisane su za tebe) onda nema šta da se brineš.

Persistance layeri (ORM) kao koncept je prilično jednostavni i normalni u svim "jačim" programskim jezicima, posebno u Javi. Mislim da bi trebalo da pročitaš malo više o njima... Meni sam Propel štedi 50% vremena koje sam ranije ulagao u razvoj (bez preuveličavanja).

Probaj, olakšava život.

2. Imaš tendenciju (a to sam ti već rekao) da komplikuješ stvari.

Moguće. Ali danas nešto za šta mi je ranije trebalo 2 nedelje radim za 2, 3 dana (opet bez preuveličavanja). Meni je bilo bitno da povećam sopstvenu produktivnost, u čemu sam uspeo.

Biraš alat prema svojim potrebama. Moje potrebe danas nisu da napravim nešto što će svaki hakeran koji bar malo zna PHP razumeti "iz prve". Bitno mi je da radim brže i da to bude jednostavno za održavanje (što jeste!).

3. 90% funckija u tvom kodu vracaju varijablu koja se zatim echo-uje.

Sasvim normalno. Navedeni primer je template koji služi za prezentovanje informacija. Tu je sasvim normalno da se podaci "u 90% slučajeva echuju" :p Kontroler koji pokazuje ovaj template izgleda ovako:

PHP kôd:

/**
* Show cart content
*
* @access public
* @param void
* @return null
*/
function cart() {
  
  
// Empty cart?
  
if(CartService::instance()->countProducts() < 1) {
    
flash_error('Your cart is empty');
    
$this->redirectTo('shopping''index');
  } 
// if
  
// cart 

To je sva potrebna ligika + template da bi prikazao cart (Controler + View). Model je malo bogatiji, ali to te opet ne zanima jer je to generisao Propel a ti sa dve funkcije povezao ;)

Da opet ponovim, jer ovo je bitno da biste razumeli šta i kako radim, funkcija gore i template na prethodnoj stranici je sve što programer treba da uradi da bi prikazao cart. Nema prenošenje mase promenljivih, rogobatnih funkcija i koječega sličnog. Najteži deo je generisan za njega od strane persistance layera i uvezan od strane frameworka. Fizikalisanje je zastarelo...

4. <?= $ordered_product->getProductId() ?> ... razmisljam da li on u toj funkciji čita iz baze, sa diska, ko zna šta radi.

Da li tebe kao dizajnera to zanima? Ne. Imaš API dokumentaciju i radiš po njoj... Ako voliš da gledaš u bazu onda koristiš sledeći metod:

polje - id, funkcija - getId()
polje - name, funkcija - getName()
polje - first_name, funkcija - getFirstName()

...

Pattern je оčigledan ;)

5. I onda tako imaš po jednu funkciju za svako polje u bazi

Tačnije, dve... Getter i setter (tkz. akcesori). Zbog enkapsulacije koja ti ne dozvolja da vidiš konkretno polje van trenutne klase ili klase naslednice Propel ti generiše getPolje() i setPolje($value) funkcije.

Naravno, te funkcije si dobio džabe, nisi ih ručno pisao.

6. CartService::instance()->getOrder()->getOrderedProducts() umesto $CartService->order->products;

Singleton je jedan od osnovnih patterna i omogućava ti da izbegneš prenošenje gomile promenljivih na sve strane. Izuzetno korisno i štedi vreme (zna ko je probao).

CartService je Singleton klasa.

7. Navedeni template...

Navedeni template je loš. To sam uvideo odmah... Eksperiment koji je pokazao da je nepraktičan. Sad koristim drugačiji pristup gde se templatei i layouti automatski mapiraju sa parom kontroler - akcija (takav pristup koristi Rails) osim ako nije navedeno drugačije.




PS: Da bi stvarno video koliko ovaj "komplikovani" pristup olakšava život i smanjuje količinu fizikalisanja treba da ga probaš. Sva ova objašnjenja što sam naveo će ti se najverovatnije učiniti neubedljiva, ali slobodno tvrdim, iz iskustva: nikad u životu nisam brže i lakše radio.


Dodatak:

Citat:

Iz mog iskustva (nesto obilnije od tvog) upotreba PHP na nacin na koji ti to radis je najblaze receno radikalna.
Pogledaj o čemu se ovde diskutuje (ne samo skorije diskusije već kopaj imalo dublje). OOP modelovanje aplikacija je starije od PHPa, a PHP5 napokon pruža bolje okruženje za OO razvoj što pokušavam da iskoristim. Ništa u mojim pristupima nije radikalno... Čak naprotiv, većina stvari je prilično stara.

Petar Marić 12. 11. 2005. 20:34

Ilija, tvoj osnovni problem, je, koliko mi se čini, to što ne želiš/možeš da prihvatiš da poneki put ti nisi u pravu. Prilično mi otežavaju diskusiju osobe koje odjedanput počnu da ubacuju emocije i čisto subjektivna mišljenja bez iole dokaza.

Citat:

Originalno napisao Ilija Studen
Pa dobro, s obzirom na to da si koristio Smarty za projekat koji je imao max 10kb "ostalog" koda razumem tvoj stav. Spavaš sa njim isto? I na putovanja ga nosiš? :p

Argumenti koje si ovde izneo su u najmanju ruku diskutabilni, da ne upotrebim teže reči. Mislim da nisi svestan šta reč projekat u stvari znači - koristiš je kao jedan od svojih mnogih buzzword-a.
Moraćeš da me podsetiš za dotični slučaj (pošto ga se očigledno bolje sećaš od mene) jer, za razliku od tebe, ne znam da izvlačim argumente "iz uveta".

Citat:

Originalno napisao Ilija Studen
PHP je templating jezik i nekako mi ideja pravljanje posebnog template jezika za templatate jezik nije baš naj naj.

Sa php.net:
Citat:

What is PHP?
PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML.
Imaš čudan običaj da budeš veći katolik od pape - ne znam možeš li mi pomoći da nađem termin "template" ovde ili ovde? Probaj da pogodiš koja su prva 3 rezultata za ovu pretragu.
No, pošto izgleda imaš problema da shvatiš celokupnu ideju iza šablona (ili template-a, kako ih Englezi zovu) preporučio bih ti 2 wikipedia unosa za početak:
1. Template
2. Template engine


Citat:

Originalno napisao Ilija Studen
Doduše, više o tome na jednoj starijoj temi. Moje mišljenje o ovoj temi je poznato svima, a iz mog iskustva (nešto obilnije od tvog :p ) znam da ti Smarty nije potreban u 99% slučajeva.

Mene interesuje odakle ti više izvlačiš te silne brojke? Nisam imao prilike da vidim ijednu studiju vezanu za spomenutu temu koja iznosi datu cifru. Ako je moguće, molio bih te da me prosvetliš, uvek sam voljan da naučim nešto novo, ako je korisno.

Ilija Studen 12. 11. 2005. 20:57

[edit by dinke]Izbacene licne poruke upucene Petru[/edit]

2. Svi dobro znamo kako je PHP nastao i da svoje osnovne koncepte vuče i dan danas. Ne moraš citirati PHP5 manual, bar ne meni. PHP = PHP Hypertext Preprocessor. Šta ti to govori?

3. Da opet ne linkujem na verbalno terorisanje: jedan od osnovnih načina da skreneš razgovor sa određene teme ili izbegneš suštinu je da se uhvatiš za sitnice, što ti radiš u svojoj poruci nakon trećeg citata. Nemoj to da radiš, bar ne kad sam ja u pitanju...

4. Brojke su odokativne i služe da oslikaju ideju / stav. Ne treba ti naučna studija da bi znao da ti sutra treba hleb ili da bi znao da je dizel 66 din. Opet se hvataš za jefine verbalne trikove kako bi skrenuo sa teme / izbegao poentu :p

Citat:

Ilija, tvoj osnovni problem, je, koliko mi se čini, to što ne želiš/možeš da prihvatiš da poneki put ti nisi u pravu.
Meni se čini da se varaš. Uvek sam spreman da kažem da sam pogrešio i/ili da se izvinim kad uvidim da nisam u pravu. Seti se teme gde sam lupio za ASP.NET recimo. Rekao da sam nešto pogrešio, zamolio ljude da mi bolje objasne i sad sam bogatiji za jedno znanje / iskustvo.

No, ova tema se ne bavi mojom malenkošću već nekim drugim stvarima.

Što se priče kojom se na ovoj temi bavimo uveren sam da sam u pravu i tako se ponašam (iznosim svoja mišljenja i stavove, branim se kad su isti napadnuti, odobravam kad mislim da je neko u pravu itd... klasičan forumski život).

Petar Marić 12. 11. 2005. 21:01

Citat:

Originalno napisao Ilija Studen
Koristim [ulr=http://propel.phpdb.org/]Propel[/url], najbolji persistance layer za PHP (PHP port Torque projektu).

IMHO izrazito je loš, jer te ne obavezuje da izvršiš rukovanje grešaka.

Citat:

Originalno napisao Ilija Studen
Pošto PHP5 ima podršku za enkapsulaciju ne mogu da pozivam $product->id; iz template jer je ID protected polje (kakvo i treba po svim normalnim OO konceptima). To je samo primer dobrog programiranja. Praktičnost je malo narušena, ali kad te metode dobiješ "džabe" onda nema šta da se brineš.

Tehnički "id" bi u programskim jezicima koji se pridržavaju OOP principa bio property sa prekopljenim operacijama "set" i "get" - jedan od razloga zbog kojeg mi se Python i C# dopadaju.

Ilija Studen 12. 11. 2005. 21:11

Citat:

Originalno napisao Petar Marić
IMHO izrazito je loš, jer te ne obavezuje da izvršiš rukovanje grešaka.

PHP5 te ne forsira da obradiš greške da bi se očuvala kompatibilnost sa starim kodom. Doduše, imaš set_exception_handler(), ali to nije ono o čemu pričamo.

BTW: Od kad je rukovanje greškama presudno pri izboru ORMa? Ne, ne sviđa mi se BMW jer su mu papučice metalne.

Citat:

Originalno napisao Petar Marić
Ilija je definitivno ubeđen da je izumeo "the best thing since sliced bread" tako da je svaka diskusija uzaludna.

Ne bih se složio. Svaki sistem ima svoje prednosti i mane. Mane ovog sistema su:

1. PHP5 only
2. Ne scaleuje dobro - tj. nije pogodan za male skripte
3. Propel bi mogao da bude bolje uvezan, a proces generisanja klasa automatizovan. Sad moraš ručno da pozoveš Phing da generiše klase i da ih kopiraš (nešto što se radi jako retko).
4. Definitivno nije speed king

Najverovatnije ima još, ali to su stvari koje mi padaju na pamet. Napravio sam nešto što radio posao i omogućava mi da radim brzo zadržavajući clean dizajn aplikacije i sam kod. Šta je tu loše?

bluesman 13. 11. 2005. 00:24

Pročitah... i poučen prethodnim iskustvom u diskusijama sa Ilijom nemam ništa pametno da dodam... ili nemam ništa da dodam što bi se izrodilo u nešto pametno.

Jedino što moram da primetim, Ilija, je da nas olako "gađaš" subjetkivnim zaključcima, zatim kažeš nešto kao "najbolji persistance layer za PHP" a onda u dodatnom objašnjenju napišeš

Citat:

1. PHP5 only
2. Ne scaleuje dobro - tj. nije pogodan za male skripte
3. Propel bi mogao da bude bolje uvezan, a proces generisanja klasa automatizovan. Sad moraš ručno da pozoveš Phing da generiše klase i da ih kopiraš (nešto što se radi jako retko).
4. Definitivno nije speed king
Sorry, meni bi 1, 2 i 4 bilo sasvim dovoljno da nikada ne pogledam to, a kamoli da ga hvalim i koristim. Ali, svako ima svoje, ja sam navikao da pišem sve svoje ručno, ti si navikao na razne gadgetse koje ne znam ni da nabrojim, možda sam lood što trošim vreme na pisanje svega lično, možda sam paranoičan jer verujem samo sebi i svom kodu... ali to je moj loodilo... tako sam navikao i so far so good.

Ilija Studen 13. 11. 2005. 01:00

To "najbolji persistance layer" nije samo moje mišljenje već gomile drugih programera koji su ih probali. Ima ih par: PEAR::DB_DataObject, MetaStorage, Propel... Propel se pokazao kao najkompletniji i najviše korišćen. Zajednica oko njega je živa i ima par prilično jakih likova u ekipi tako da mu ne fali ni kvalitet ni stabilnost.

1. i 2. mi ne predstavljaju problem jer uglavnom pravim veće PHP5 aplikacije. Baš pre neki dan sam napisao malu news skriptu za prijatelja. Koristio sam PHP4 i sve sam napisao from scratch. Kao što rekoh, alat biraš po potrebi i ne postoji univerzalno rešenje.

Što se brzine tiče pitanje je gde povući granicu između brzine kojom praviš aplikacije i brzine kojom se iste izvršavaju. Zavisi od slučaja do slučaja...

Pobornik sam agilnog razvoja i primene patterna. Good old PHP4 sa akcentom na proceduralnom programiranju mi ne leži baš najbolje u toj priči.

Citat:

ti si navikao na razne gadgetse
Pa i ne baš. To o čemu pričam su uglavnom koncepti, ne gotova rešenja. Od biblioteka koristim Propel i Creole, ponekad Textile (klasa izvučena iz TextPatterna). Sve ostalo sam ja pisao...

bluesman 13. 11. 2005. 15:58

Ja mislim da si ti pogresno shvatio, ja i Ilija smo prijatelji i ne pokusavam da ga ocrnim vec jednostavno pricamo i komentarisem njegov koncept i metod rada. Ti si, kao i bilo ko drugi, slobodan da prokementarises moj koncept i metod rada, niko ti to ne brani dok god se civilizovano ponasamo i obracamo drugima sa "respect" bez obzira koliko je ko iskusan.

Jedino sto hocu da kazem da je Ilija gotovo neupotrebljiv kada je u pitanju timski rad zbog nacina na koji radi. On verovatno odlicno radi sam, ali kao sto sam vec jednom pokusao, bilo je puno nesporazuma kada smo pokusali nesto zajedno da odradimo.

BTW, ne znam da li si procitao ceo thread, ovo sto spominjes "haha, to ti je bez veze" ... je upravo Ilija zapoceo svojim komentarom, pa je zato moj prvi post na ovoj strani poceo ironijom na Ilijin post. Nije bitno, mozda je i u pravu kada kaze da Petar nije dovoljno iskusan, ali postoji normalan nacin da se to kaze.

PS Opusti se, vidim da je "green county" ekipa :) odmah skocila da brani Iliju, nemate od cega da ga branite, ako pazljivo procitas - u mojim postovima su samo komentari - nema ni jedan "napad". U to lepo obrazlozeni komentari, zar ne? Da li sam u pravu i ko je u pravu, to je drugo pitanje.

degojs 15. 11. 2005. 04:45

Da ne propadne tema, da se vratimo malo na tehničku stranu :)

Citat:

Ilija
Singleton je jedan od osnovnih patterna i omogućava ti da izbegneš prenošenje gomile promenljivih na sve strane.
Da li bi mogao da pojasniš ovakav primer upotrebe singleton d.p.-a: "da izbegneš prenošenje gomile promenjivih na sve strane"? Odnosno, zašto bi za to "prenošenje gomile promenjivih na sve strane" uopšte izabrali singleton?

Jesi li ti uopšte siguran u to --- koja je osnovna svrha singleton d.p.-a?

degojs 15. 11. 2005. 05:22

Citat:

CartService je Singleton klasa.
Šta tačno radi i čemu služi CartService?

Možeš li da daš primer implementacije i pojasniš, pošto me zainteresovalo :)

Ilija Studen 15. 11. 2005. 10:47

Osnovna svrha Singletona je da osigura da imaš jednu instancu klase. Još jedna osobina je da toj instanci možeš pristupiti pozivom jednog statičkog metoda klase. Ne zna koje jezike koristiš, ali u PHPu je generalan problem imati "opštepristune" promenljive. Možeš da koristiš neki od autoglobals nizova ($_GLOBALS), cimati se sa globals sve vreme, prosleđivati kao parametre (stupid) itd, ali to je sve daleko od elegantnog rešenja.

CartService::instance() vraća jednu jedinu instancu servisa kojoj možeš da pristupiš odakle god hoćeš. Primera radi, da bih dodao proizvod u cart dovoljno je da napišeš:

Kôd:

CartService::instance()->addProduct( new Product(12) );
Ovo možeš pozvati odakle god hoćeš: iz funkcije, kontrolera, template (ok, ovo bi bilo glupo, samo navodim primer), a da ne moram da je prosleđujem, cimam se sa globals itd.

CartService je Singleton klasa koja se brine o korpi i pruža niz metoda za baratanje proizvodima (add, remove, setQuantity, clear itd). Ništa posebno, samo je u shop delu skripte izuzetno bitna... Umesto da se uvek ručno uvezuješ podatke imaš CartService koji to radi.

PS: Za često korišćene operacije definišen shortcut funkciju tipa add_to_cart(Product $product, $quantity = 1); da se ne smaram.

bluesman 15. 11. 2005. 11:25

Dakle, Singleton je pravi, ortodoksni, prvoklasni buzzword :)

Ti sad pomislis ko zna sta radi taj singleton kad neko kaze da jedva može bez toga a on ti osigurava da imas jednu instancu klase :)

Znaci ti imas jednu "obicnu" Shopping Cart klasu koju si samo "uhapsio" preko singleton da ne bi greskom imao vise od jedne instance? Ako grešim sorry.

a šta fali:
$CartService->addProduct( 12 );

umesto:
$CartService::instance()->addProduct( new Product(12) );

Koje su tačno prednosti ovog drugog metoda?

BTW, u PHP-u nije problem imatu "ošteprisutnu" promeljivu, niti je problem obezbediti da imaš samo jednu instancu, bitno je samo lepo isplanirati.

Nije $_GLOBALS, nego $GLOBALS, verovatno omaška

Ilija Studen 15. 11. 2005. 11:42

Citat:

Originalno napisao bluesman
Dakle, Singleton je pravi, ortodoksni, prvoklasni buzzword :)

Nije buzzword nego ime patterna. Tako se zove... Umesto da kažem klasa koja ima samo jednu instancu kojoj se statički može pristupati kažem da je to Singleton. Uostalom, Singleton.

Ilija bi bio buzzword za osobu koja živi u Novom Sadu, non stop zvoca o PHPu i voli Smoki?

Citat:

Originalno napisao bluesman
a šta fali:
$CartService->addProduct( 12 );

umesto:
$CartService::instance()->addProduct( new Product(12) );

Pa pogledaj "dolare" ispred. Nije poenta u promenljivima koje moraš definisati / prenositi, već o instanci kojoj pristupaš samim tim što imaš definisanu klasu...

Citat:

Originalno napisao bluesman
BTW, u PHP-u nije problem imatu "ošteprisutnu" promeljivu, niti je problem obezbediti da imaš samo jednu instancu, bitno je samo lepo isplanirati.

Upravo tako. Singleton je jedno od mogućih rešenja. Meni odgovara pa ga koristim...

Citat:

Originalno napisao bluesman
Nije $_GLOBALS, nego $GLOBALS, verovatno omaška

Jap :)

bluesman 15. 11. 2005. 13:06

Đe dolari? :) Nisam te razumeo za to.

noviKorisnik 15. 11. 2005. 13:22

jel mogu ja ? :-)

Dakle, nije kako si napisao

$CartService::instance()->addProduct( new Product(12) );

već

CartService::instance()->addProduct( new Product(12) );

Nema dolara... statički metod - možeš ovaj kod da koristiš u bilo kojoj funkciji.

S druge strane da bi...

$CartService->addProduct( 12 );

... radilo u nekoj funkciji, mora prethodno...

global $CartService

godza 15. 11. 2005. 13:24

sorry korisniche, nemoj misliti da se pravim drvenim advokatom, ali verujem da je ilija omashkom napisao $ isred poziva staticke metode, jel to ovako ne bi radilo.

degojs 15. 11. 2005. 13:46

Citat:

Ilija
Osnovna svrha Singletona je da osigura da imaš jednu instancu klase.
Pa šta se dešava kad na sajt dođu dva posetioca a singleton sprečava da imamo dve instance shopping cart-a?

degojs 15. 11. 2005. 13:49

Citat:

Ne zna koje jezike koristiš, ali u PHPu je generalan problem imati "opštepristune" promenljive.
Kakve veze ima singleton sa rešenjem ovog problema?

Za rešenje ovog problema dovoljno je imati klasu sa statičkim poljima, singlton je nebitan u toj priči.

noviKorisnik 15. 11. 2005. 14:29

Citat:

Originalno napisao godza
sorry korisniche, nemoj misliti da se pravim drvenim advokatom, ali verujem da je ilija omashkom napisao $ isred poziva staticke metode, jel to ovako ne bi radilo.

Nije Ilija to napisao već bluesman, Ilija samo nije preciznije objasnio zašto pominje dolare (pa sam ja uskočio kao drveni advokat, a sad ako sam zabrljao... upucaću poruku, no problemo).

bluesman 15. 11. 2005. 14:57

Izvninjavam se, ja sam ubacio $ ispred, moja greska. Ali to je nebitno za pricu, zar ne? Moze dalje? Da li moze objasnjenje zasto je toliko vazan singleton ovde.

degojs_ 15. 11. 2005. 16:06

Ma najmanji je problem u definiciji, a veći u korišćenju.

Zašto bi koristio singleton klasu za nekakve globalne promenljive? Ja nisam nikad koristio PHP, ali evo gledam primer na PHP sajtu, tačno ono što sam napisao pre - statička polja u klasi i kraj priče. Zašto bi sad ovo čovek komplikovao dalje singltonom? Šta propuštam?

Kôd:

class Foo
{
  public static $my_static = 'foo';
}

...
print Foo::$my_static . "\n";


Dalje, ShoppingCart koji je singleton - šta se dešava kad imaš 10 posetioca na sajtu, a singleton svima daje referencu na jedan objekt? Zato sam i tražio da Ilija pokaže neki primer.. pa da vidimo. Šta propuštam i ovde?

O.T.
@bluesman ili ko već ima mogućnosti:
da prijavim da neće da mi pošalje password na mail (javi samo Bad Request sa servera)? Evo me na poslu, zaboravio sam koji je pass, pa sam morao da kreiram novi, ovaj, nalog :-)

noviKorisnik 15. 11. 2005. 19:10

Citat:

Originalno napisao degojs_
Dalje, ShoppingCart koji je singleton - šta se dešava kad imaš 10 posetioca na sajtu, a singleton svima daje referencu na jedan objekt?

Pomislio sam da se šališ kad si ovo prvi put pomenuo. Ta jedinstvenost se gleda na nivou izvršenja skripte, dakle jedan zahtev, jedan korisnik, jedna stranica, itd. Inače, i meni deluje preterano navođenje "jedna instanca" jer zašto onda uopšte instanca ako je jedinstvena. Insistiranje na pozivu metoda umesto direktnog pristupa propertima... jeste preporuka za neke objektne manire, ali nije baš i da mora tako.

degojs 15. 11. 2005. 19:31

Pazi,

nemaš ti šta da kažeš "ta jedinstvenost se gleda na nivou.." To je pogrešno. To je restrikcija koju ti sad uvodiš, a singleton to nigde ne navodi.

Ili imaš max samo jedan objekt date klase ili možeš da instanciraš više objekata. Prosto.

Bar ja tako vidim singleton, a daću ti i primer pravog singletona :)

Primer singletona bi bio objekt koji radi sa log fajlom, a svi posetioci na sajtu imaju referencu na jedan te isti objekt. Vidiš, nema nikakvog posmatranja "na nivou.." - svi posetioci imaju referencu na jedan te isti objekt, koga i treba da bude samo jedan. Drugi primer.. evo sad mi pade na pamet - samo jedan COM1 port, pa onda samo jedan printer spooler objekt, itd itd.

Kako god okreneš, ne štima nešto. Ako je svaka instanca ShoppingCart-a zasebna za sesiju, onda to ili nije singleton ili ti singleton d.p. uopšte ne treba, a ako imaš pravi singleton, onda ćeš doći u situaciju da ShoppingCart bude deljen između posetioca, zar ne? Voleo bih da Ilija lepo stavi primer koda koji on koristi (ShoppingCart a la singleton), što sam i tražio, pa da pogledamo.

dinke 15. 11. 2005. 20:17

Evo primera Singletona u php5:

PHP kôd:

<?php
class Example
{
   
// Hold an instance of the class
   
private static $instance;
  
   
// A private constructor; prevents direct creation of object
   
private function __construct()
   {
       echo 
'I am constructed';
   }

   
// The singleton method
   
public static function singleton()
   {
       if (!isset(
self::$instance)) {
           
$c __CLASS__;
           
self::$instance = new $c;
       }

       return 
self::$instance;
   }
  
   
// Example method
   
public function bark()
   {
       echo 
'Woof!';
   }

   
// Prevent users to clone the instance
   
public function __clone()
   {
       
trigger_error('Clone is not allowed.'E_USER_ERROR);
   }

}

?>

Source: http://www.php.net/manual/en/language.oop5.patterns.php

degojs 15. 11. 2005. 20:29

E dobro, pitanje je sad: da li je instanca objekta deljena među posetiocima (različitim sesijama), pošto se referenca na nju čuva u statičkom polju?

Ako jeste, ne možemo da koristimo takav ShoppingCart jer će da nastane zbrka - svi će da koriste isti objekt, a ako nije --- šta će nam uopšte singleton (te se slažem sa, čini mi se imenjakom, noviKorisnik)?

Ajd, vi tamo svi imate php pa možete lako da proverite da li su statička polja klasa deljena među sesijama.

noviKorisnik 15. 11. 2005. 20:40

Pa nisu. Život PHP objekta najduže traje koliko izvršenje skripte. Najčešće kao rezultat toga bude stranica prema klijentu. Privid perzistencije objekta je čuvanje objekta u sesiji i restauracija pri sledećem pozivu skripte. Sesija naravno ide po korisniku, nije deljena.

Ako neka vrednost treba da bude globalna na nivou sajta, za sve posetioce, čuvaće se u bazi ili u fajl sistemu.

degojs 15. 11. 2005. 20:43

Pa koji će mu đavo singleton onda uopšte?


Evo sad sam i ja skinuo i instalirao PHP i proverio: jeste, statička polja klasa su zasebna za svaku sesiju, što je.. malo čudno, I guess PHP is just different :) Opet, onda mogu samo da ponovim ono pitanje gore..

dinke 15. 11. 2005. 21:57

Pa, pazi, verovatno je kod MS-a to drugacije reseno, ili si previse dugo radio na razvoju desktop based aplikacija :)

HTTP je "stateless" protokol. Kao sto rece noviKorisnik, svaki script traje samo tokom ucitavanja strane. Ako se podaci ne snime koriscenjam sesija recimo (file, db, shared memory) sadrzaj strane se nepovratno gubi. Teoretski moguce je signleton klasu serializovati u fajl tako da bude jedinstvena za apsolutno sve usere na jednom (ili cak vise servera), al nije mi poznato da je to iko tako koristio, vec se singleton u Web aplikacijama racuna po klijentu - browseru koji inicijalizuje sesiju.

Uzgred, ovo je vec otislo u totalni offtopic :)

degojs 15. 11. 2005. 22:19

Nema veze što je otišlo u off-topic, meni je zanimljivo :)

Nije samo MS, nego i Java (Server Pages) recimo. Ali nije bitno uopšte.. Http jeste stateless, ali server može da čuva podatke o sesijama. Znači, nije baš tako stateless kao što izgleda - mada, ne znam zašto mi to napominješ?

Citat:

al nije mi poznato da je to iko tako koristio,
A meni se čini da si ti suviše dugo vremena proveo radeći PHP only :)

Citat:

vec se singleton u Web aplikacijama racuna po klijentu - browseru koji inicijalizuje sesiju.
Ama, dinke, šta će ti tu singleton (bar za ovaj slučaj ShoppingCart-a)?

Npr. napraviš ShoppingCart objekt i gurneš ga u sesiju kako bi imao pristup i na drugim stranicama i gotova priča. Šta će ti singleton uopšte? Taj jedan te isti ShoppingCart objekt dakle uvek imaš u sesiji. Šta će ti (tj. Iliji) singleton?

Ilija Studen 17. 11. 2005. 01:02

Citat:

Originalno napisao degojs
Šta će ti (tj. Iliji) singleton?

Nećeš (tj. ne smeš da dozvoliš) da korisnik ima dva carta. Jednostavno je takav zahtev i korišćenjem Singletona isključuješ čak i teorijsku mogućnost da do tog dođe. Problem?

Ti si uglavnom desktop programer. Koliko sam samo puta poželeo "trajnost" koju ti takvo okruženje pruža. Međutim, u PHPu su stvari malko drugačije pa se prilagođavaš pravilima igre.

U to što sever (hipotetički) može, a šta ne ne želim da zalazim. Ako ćemo tom logikom možemo jadikovati što nam Apache ne kuva kafu ;)

degojs 17. 11. 2005. 02:44

Mislim da komplikuješ bez potrebe, a ako ti je to zahtev klijenta.. onda dobro, šta da se radi (mada iskreno, ne verujem u tu tvoju priču iz prostog razloga što si singleton prvo opisao kao nešto što se koristi za jednostavan pristup nekakvim globalnim promenljivim, itd).

Tvoja ocena da sam ja desktop programer: pošto druge popularne web tehnologije (Java, "stari" ASP 3, ASP.NET) podržavaju ono gore (vidljivost istog objekta iz različitih sesija) nije li onda nekako ispravnije reći da si ti PHP-only programer? Ma ne da podržavaju takvu stvar nekakvim "zaobilaznim" putevima i hakovima, nego je to deo osnovne funkcionalnosti. Ko je tu sad desktop, ko web developer, a ko ne zna dalje od PHP-a, bolje da se ne etiketiramo. Ja ovo ne bih nikad potencirao na PHP forumu, ali kad me već nazvaste desktop programerom :), da onda samo razjasnimo kako stvari stoje sa drugim web tehnologijama. Pored toga da si ti PHP-only, tačno bi bilo i napisati da ja nisam upoznat sa PHP-om :) (Kad već pominješ Apache.. u kombinaciji sa TomCat-om (kontejner za JSP) bez problema radi to što ti proglašavaš za hipotetičko.)

ivanhoe 17. 11. 2005. 12:27

Citat:

Originalno napisao dinke
HTTP je "stateless" protokol. Kao sto rece noviKorisnik, svaki script traje samo tokom ucitavanja strane. Ako se podaci ne snime koriscenjam sesija recimo (file, db, shared memory) sadrzaj strane se nepovratno gubi.

ovo je skroz php-isticki pogled na svet :D

recimo mod_perl cuva globalne promenjive na nivou servera, tako da dok god ne ugasis to dete apache-a imaces sacuvane vrednosti globalne promenjive...

to sto php ne moze da sacuva podatke osim snimanjem negde je posledica arhitekture mod_php-a, mada realno je to prednost za obicne korisnike, jer mod_perl zna da bude jako smoran za debug zbog te perzistencije globalnih varijabli...

Ilija Studen 17. 11. 2005. 15:09

Citat:

Originalno napisao degojs
Mislim da komplikuješ bez potrebe, a ako ti je to zahtev klijenta.. onda dobro, šta da se radi (mada iskreno, ne verujem u tu tvoju priču iz prostog razloga što si singleton prvo opisao kao nešto što se koristi za jednostavan pristup nekakvim globalnim promenljivim, itd).

Moguće. Pre oko godinu, dve sam imao problem, Singleton klasa se pokazala kao dobro rešenje tako da sam počeo aktivno da je koristim. Od tad sam je verovatno koristio i za stvari za koje sam pattern originalno nije namenjen i to mi ne predstavlja problem (ne znam zašto bi tebi?). Jedna od stvari sa kojom definitivno mogu da živim ;)

Kad smo već kod toga, osnovna svrha automobila je da preveze osobu (grupu, teret) od tačke A do tačke B. Mada, znam dosta mladih "parova" koji uprkos originalnoj nameni automobila isti koriste i za neke malo "dinamičnije" stvari. Probao sam da im objasnim da to ne valja jer time narušavaju sam koncept automobila, ali nije išlo. Neće da slušaju...

Citat:

Originalno napisao degojs
pošto druge popularne web tehnologije (Java, "stari" ASP 3, ASP.NET) podržavaju ono gore (vidljivost istog objekta iz različitih sesija) nije li onda nekako ispravnije reći da si ti PHP-only programer?

Ispravnije je.

degojs 17. 11. 2005. 15:48

Citat:

Ilija:
Od tad sam je verovatno koristio i za stvari za koje sam pattern originalno nije namenjen i to mi ne predstavlja problem (ne znam zašto bi tebi?). Jedna od stvari sa kojom definitivno mogu da živim
Ako ćeš na primedbu da nešto radiš pogrešno (i savetuješ to isto drugim) da odgovaraš sa "Šta tebe briga kako ja radim?" onda je svaka rasprava besmislena od samog početka.

Ja se ovde isključujem pošto smo, čini mi se, tehničku stranu priče završili (uz mali dodatak za tebe na kraju: singleton d.p. nije auto, a programiranje nije *****. Kad bude bilo, možemo da povlačimo paralele).

Ilija Studen 17. 11. 2005. 16:02

Citat:

Originalno napisao degojs
Ako ćeš na primedbu da nešto radiš pogrešno (i savetuješ to isto drugim) da odgovaraš sa "Šta tebe briga kako ja radim?"

Ne radim to (nit se branim na taj način, nit savetujem drugima da koriste loše rešenje). Koliko vidim, naveo sam potpuno ispravnu primenu Singleton patterna kad se svedemo na PHP (na PHP forumu smo, zar ne?). Razumem te, nisi znao kako stvari funkcionišu u PHP pa si hteo da se stvar "pretrese", ali definitivno ne vidim razlog ovako "dramatičnog" završavanja diskusije.

Nego, izgleda da je ovde najbitnije ko će isterati svoje. :cool:

PS: Što se "globalne prisutnosti" promenljive tiče u PHPu to može da se postigne primenom Singleton paterna iako nije baš "po knjizi" (kao što nije ni korišćenje automobila na gore opisani način). To je jedan alat više u našem arsenalu, ne problem što uporno pokušavaš da istakneš.

degojs 17. 11. 2005. 16:58

Pa šta da ti drugo napišem, kad ti počinješ biti bezobrazan i pričaš nešto tipa da ja imam problem sa tim kako ti koristiš singleton? Misssim.. svodiš stvari na nešto lično, a jebe se meni ako ćeš ti sve da programiraš u Ruby i da koristiš "proširen" Abstract Factory design pattern da sortiraš brojeve.

Citat:

Koliko vidim, naveo sam potpuno ispravnu primenu Singleton patterna kad se svedemo na PHP (na PHP forumu smo, zar ne?).
Jok, obrnuto, tek tu nema valjanog razloga za singletonom. Ja više nemam volje da ti objašnjavam, a i znam da ne bi poslušao desktop programera :)

I sad stvarno kraj od mene.


Vreme je GMT +2. Trenutno vreme je 06:03.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.