Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

PHP stilovi pisanja aplikacije (Best design practices)

[es] :: PHP :: PHP stilovi pisanja aplikacije (Best design practices)

Strane: 1 2

[ Pregleda: 17337 | Odgovora: 27 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
195.252.79.*



+34 Profil

icon Re: PHP stilovi pisanja aplikacije (Best design practices)03.03.2010. u 11:56 - pre 172 meseci
Citat:
Milan M. Radovic: Imam pitanje na ovu temu.
Moze li neko, neku malu aplikaciju (sa login,logout,session... ) da stavi (uploaduje za downoad) da malo "pokupim" zanat :D

Ja radim sledecim redom:
1. napravim dizajn (html+css)
2. stavim neke Smarty varijable u header (npr. pagetitle, users online etc.) i footer
3. isecem header,middle,footer
4. Napravim klase za sessiju, mysql.. itd. i smestim u /includes

Pa middle dalje radim i kopiram za svaku stranu...
Na pocetku svake strane, kreiram objekte od klasa include pa new... jelte.

Varijable pisem u stilu neka_varijabla, a klase "Klasa", a fukncije TamoNekaFunkcija().....

dakle?


Da se ubacim i ja:

radim iskljucivo OOP, koristim Doctrine, Smarty i moj kontroler. Moj savet je da klase ne koristis kao skup funkcija; objekat je tu nesto da uradi, a ne samo da drzi funkcije u sebi. Mozda ti ovo zvuci malo konfuzno, ali kad pocnes da koristis ORM, bice ti jasnije.

Skoro nijedna moja dinamicka funkcija ne zahteva parametre, sto i tebi preporucujem. Ako funkciji treba parametar, ona bi morala sama da se snadje.

Static metode koristi da dovuces instancu te klase; npr. Worker::getLogged() koristim da bih dovukao instancu logovanog radnika. Uzmi sledeci primer;

Code:

$id = $_GET['id']
$article = Article::getById($id) ; // npr. korisnik je kliknuo na link ?index.php&action=delete&id=15 . Ovo je samo primer
$article->delete() ;


I ovo ce da radi. Ali korisnik jako lako moze da izmeni URL i da umesto 15, stavi 21 sto na primer ne bi smeo da uradi; zato ti odlucujes da napravis dodatnu zastitu. Metodu Article::delete(), prepravis na ovo:
Code:

Class Article
{
public function delete()
{
  if ( ! Worker::getLogged()->canDeleteArticle() )
     throw new Exception('Hack detected') ;
  // ovde ide stari kod za brisanje
}
}


(naravno, u klasi worker moras da napises i metodu canDeleteArticle)

Nadam se da si razumeo zasto je bitno da metode nemaju ulazni parametar. Article::delete() ce sam da se pobrine oko provere brisanja sto znaci da je mozes pozvati odakle god hoces, iz bilo kog modula ili instance neke druge klase.

Metode MORAJU biti kratke; vremenom ces shvatiti zasto, ali zasad mi veruj na rec. Ako metoda ima vise od 10 linija, znaci da nesto ne valja. Kod mene je prosek 4-5 linija, gornji primer je u stvari:
Code:

Class Article extends BaseArticle
{
public function delete()
{
  if ( ! Worker::getLogged()->canDeleteArticle() )
     throw new Exception('Hack detected') ;
  parent::delete() ;
}
}


jer koristim nasledjivanje klasa u Doctrine-u.

Zasto je jos bitno da metode nemaju ulazni parametar:
Uzmimo opet primer Article::delete(); ako bi toj metodi dodao neki ulazni parametar (kazem, samo primer), onda bi svuda gde se ta metoda poziva morao da dodam slanje parametra. Neki drugi programer koji bi nastavio takav program bi sasvim sigurno ispizdeo u lutanju kodom. Naravno, uvek mozes da ostavis haos i da onda kupac tvog programa jednostavno mora tebe da pozove, ali mislim da tako nesto raditi uopste nije lepo. Veruj, ima ljudi koji hoce da plate vise ali da takav kod ne zavisi od toga hoce li programer biti dostupan i kasnije.

I jos nesto; ako planiras da budes dobar programer, batali dizajn. Kad god sam morao da radim i programiranje i dizajn, nista od ta dva nije valjalo. Pre 4 meseca sam presekao i rekao da tako vise ne moze; sad pisem veoma komplekse programe za 5 puta krace vreme, pri cemu je kod neverovatno kratak, brz, lako citljiv i prosiriv.


 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: PHP stilovi pisanja aplikacije (Best design practices)12.06.2010. u 13:45 - pre 169 meseci
Pitanje o kome trenutno razmišljam: Zašto svi okviri i tekstovi sa savetima iz prakse koriste Router/Dispatcher i index.php kao jednu ulaznu tačku odakle se učitava odgovarajući kontroler? Onda pored rutiranja ove komponente implementiraju i druge mogućnosti veb servera kao što su dogovaranje o formatu sadržaja, jeziku...

Koja je prednost u odnosu na dizajn u kome je svaki kontroler nezavisan i iz svog konstruktora inicijalizuje sistem? Tada imamo više nezavisnih ulaznih tačaka, možemo neograničeno da ih skaliramo horizontalno po različitim serverima zajedno sa njihovim resursima, a ostatak posla oko rutiranja, dogovaranja i autentifikacije može da odradi i veb server, sigurno brže nego kada se to radi iz PHP-a.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Miroslav Ćurčić
ex mVeliki
Novi Sad

Član broj: 19034
Poruke: 1118
*.dynamic.isp.telekom.rs.



+19 Profil

icon Re: PHP stilovi pisanja aplikacije (Best design practices)12.06.2010. u 22:18 - pre 169 meseci
Lakse je za odrzavanje koda, ako se ukaze potreba za korekcijom na ulaznom skriptu lakse je kad je to samo na index.php.

Jos jedan razlog, za jedan sajt na hostingu site5.com sam imao potrebe da korigujem php.ini da bi korektno radio, i u uputstvu nasao da je dovoljno u direktorijum postaviti svoj php.ini koji ce override-ovati default vrednosti, ali sam ga morao iskopirati u SVAKI direktorijum gde imam "ulaznu tacku" - hosting gleda ini samo u tekucem a ne i u roditeljskim direktorijumima. Nazalost taj sajt nisam radio u "Front Controller pattern" stilu.
"The quieter you become, the more you are able to hear."
Blog | PowerCMS
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: PHP stilovi pisanja aplikacije (Best design practices)12.06.2010. u 22:27 - pre 169 meseci
Ulazna tačka uvek može u konstruktoru da pozove taj neki zajednički kod odakle može da se radi popravka. I ja sam do ovog sada projekta radio sa jednim index.php, međutim sada se razmišljam. Deluje mi daleko fleksibilnije da svaki kontroler bude nezavisna ulazna tačka.

Još jedna prednost jedne ulazne tačke je što kontroleri mogu biti van document root direktorijuma, ali i to lako može da se prevaziđe automatski generisanim ulaznim tačkama koje pozivaju kontrolere.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-3.sezampro.yu.



+33 Profil

icon Re: PHP stilovi pisanja aplikacije (Best design practices)14.06.2010. u 09:35 - pre 169 meseci
Citat:
Goran Rakić: Koja je prednost u odnosu na dizajn u kome je svaki kontroler nezavisan i iz svog konstruktora inicijalizuje sistem?

Pa zar to i nije slučaj kod većine framework-a? Ne znam samo šta podrazumevaš pod tim "inicijalizuje sistem"... Svaki zaseban kontroler, odnosno ta klasa koja ga predstavlja, je celina za sebe, u početnoj fazi dispatch-ovanja, odnosno nakon što bude "prozvan", može da vrši neku custom inicijalizaciju, pre izvršavanja konkretne akcije. Eto taj Front controller pattern, koji je uglavnom karakterističan za web aplikacije, definiše jednu komponentu koja je zadužena za prihvatanje svih zahteva. Samim tim, potrebna je samo jedna ulazna tačka, taj neki index.php. A kasnije, u zavisnosti od samog zahteva, instanciraće odgovarajuće kontrolere, kako bi na njih preneo nadležnost za handle-ovanje konkretne akcije.

Alternativa ovome bi bila upravo to što ti predlažeš - separacija sistema na pojedinačne ulazne tačke (PHP skriptove), pri čemu ja ne vidim benefite takvog pristupa, a pritom bi u takvoj situaciji sigurno dolazilo do ponavljanja koda, što je svakako loše.

Većina radnih okvira omogućava da do najsitnijih detalja custom-izuješ ceo taj "uvodni" proces, sa ciljem postizanja te potpune fleksibilnosti koju bi imao u slučaju zasebnih ulaznih tačaka.
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: PHP stilovi pisanja aplikacije (Best design practices)14.06.2010. u 11:17 - pre 169 meseci
Citat:
Goran Rakić: Koja je prednost u odnosu na dizajn u kome je svaki kontroler nezavisan i iz svog konstruktora inicijalizuje sistem? Tada imamo više nezavisnih ulaznih tačaka, možemo neograničeno da ih skaliramo horizontalno po različitim serverima zajedno sa njihovim resursima, a ostatak posla oko rutiranja, dogovaranja i autentifikacije može da odradi i veb server, sigurno brže nego kada se to radi iz PHP-a.


Uzmi sledeci primer; kontroleri admin dela programa zahtevaju da administrator bude svo vreme ulogovan i to je prvo sto se proverava. Svi admin kontroleri nasledjuju neku klasu BaseAdminController koja radi sledece:
Code:

class BaseAdminController extends nesto
{
  public function __construct()
  {
    if ( !User::isLogged() )
      header(... idi na stranu za logovanje ) ;
    else
      parent::__construct() ;  // ili parent ili ovde postavis konekciju ka bazi, konstante itd. Samo primer
  }
}

Na jednom mestu ces sve da postavis i proveris, tvoji kontroleri uopste ne moraju da se zezaju oko toga. Ali, ako ipak zelis neke custom varijante za svaki kontroler pojedinacno, samo ces u njemu napisati novi __construct() i to je to.
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: PHP stilovi pisanja aplikacije (Best design practices)14.06.2010. u 11:46 - pre 169 meseci
@mitke013: To što ti pričaš nema veze sa pitanjem, promašio si temu.

Neka imamo UsersAdminController extends BaseAdminController implements Controller. Umesto da postoji Dispatcher koji od index.php?q=usersadmin (uz kakav god url_rewrite) učitava UsersAdminController zamisli sledeće:
Code:

admin/
   users.php
   articles.php
   images.php
   ...
lib/
   Controller.php
   Request.php
   ...


Dakle nema Dispatcher koda, ne postoji jedinstvena ulazna tačka. To su poslovi koje odrađuje veb server i to radi znatno efikasnije nego neki PHP kod. Sada BaseAdminController može da izgleda:
Code (php):

require_once('Request.php');

abstract class BaseAdminController implements Controller
{
    protected $request;
    public function __construct()
    {
         // pravi objekat koji obuhvata zahtev
         // ovaj objekat može da odradi inicijalizaciju
         $this->request = new Request();

         // da li je korisnik prijavljen?
         if(!$this->request->me->isLogged())
             $this->request->redirect(... strana za prijavu ...);

          // učitava odgovarajuću metodu/akciju na osnovu zahteva
         $this->request->dispatch($this);
    }
 
    ...
}
 


i admin/users.php:
Code (php):

require_once('../lib/Controller.php');

class UsersAdminController extends BaseAdminController
{
    protected function index_action()
    {
        echo 'Hello world!';
    }
}

new UsersAdminController();
 


Sada imamo fleksibilnost da admin/articles.php premestimo zajedno sa svim resursima na drugi server, da implementiramo dogovor o jeziku i sadržaju koristeći HTTP i koristimo sve drugo što veb server sam nudi zato što su pojedinačni kontroleri nezavisni skriptovi na serveru.

Ja pitam, koje su mane, pošto očigledno da svi okviri za koje ja znam koriste jedinstvenu ulaznu tačku? Nikola je rekao ponavljanje koda, ja ne vidim u primeru nikakvo ponavljanje. mitke013 nije ništa rekao, ali naterao me je da sastavim primer. Miroslav je pomenuo postavljanje podešavanja na nivou skripte/direktorijuma, nije nerešiv problem.

http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

kazil
Robert Bašić
Full time PHP dev :)
Bačka Topola - Novi Sad

Član broj: 120044
Poruke: 686
*.static.kdsinter.net.

Jabber: robertbasic@elitesecurity.org
ICQ: 446475288
Sajt: robertbasic.com


+2 Profil

icon Re: PHP stilovi pisanja aplikacije (Best design practices)14.06.2010. u 12:11 - pre 169 meseci
Pa u tom slucaju onda dispatcher ulogu ima rewrite engine web servera. Jer ako ides preko FrontController patterna, tj. sa jednom ulaznom tackom, tamo "dignes" aplikaciju, pa dalje aplikacija odredjuje na osnovu zahteva koja ruta treba da se dispatch-uje. A u ovom drugom slucaju, recimo .htaccess. Jeste rewrite engine brzi od gomile PHP objekata, ali opet, kako se meni cini, sa PHP-om dobijes lakse odrzavanje/podesavanje.
 
Odgovor na temu

[es] :: PHP :: PHP stilovi pisanja aplikacije (Best design practices)

Strane: 1 2

[ Pregleda: 17337 | Odgovora: 27 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.