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.


Vreme je GMT +2. Trenutno vreme je 10:27.

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.