sabato 29 maggio 2010

DRY up your code e Anti-If... please!

Ieri un'amica mi ha chiesto di spostare il suo sito da un provider ad un altro.

Ecco alcuni spunti di riflessione che ho trovato spulciando il codice sorgente:

  1. DRY up your code (Don't Repeat Yourself)
    Nel codice erano presenti 4 punti dove modificare i parametri di accesso al database, non era molto più semplice mettere tutto in un file di configurazione separato?

  2. Ancora:  DRY up your code (Don't Repeat Yourself) e Anti-If (e qui siamo ai livelli di CodingHorror)
    Il codice che impostava la home page nel caso non ci fossero richieste specifiche era una interminabile catena di if.


Ecco qui un bel esempio da non seguire:
$pid=$HTTP_GET_VARS['pid'];
if($pid == '0' ||
$pid == '1' ||
$pid == '11' ||
$pid == '2' ||
$pid == '3' ||
$pid == '4' ||
$pid == '5' ||
.....
) {
;
}else{
$pid = '0';
}

Bene, proviamo a rifattorizzare un pò questo codice e renderlo in po più flessibile:

  1. Creiamo un array di 'pagine'
    $authirizedPages = array('0', '1', '11', '2', '3', '4', '5',.......);
    $pid = '0';
    if(in_array($HTTP_GET_VARS['pid'], $authirizedPage)){
    $pid =$HTTP_GET_VARS['pid'];
    }

    A questo punto il codice è già molto più flessibile rispetto a prima, basta modificare l'array di pagine autorizzate.

  2. Il passo successivo è rendere indipendente il codice dalla base dati
    $authirizedPages = mysql_fetch_array( mysql_query( 'SELECT id FROM pages' ));
    $pid = '0';
    if(in_array($HTTP_GET_VARS['pid'], $authirizedPage)){
    $pid =$HTTP_GET_VARS['pid'];
    }



  3. Ora possiamo anche eliminare una variabile:

    $pid = '0';
    if(in_array($HTTP_GET_VARS['pid'], mysql_fetch_array( mysql_query( 'SELECT id FROM pages' )))){
    $pid =$HTTP_GET_VARS['pid'];
    }

    A questo punto potremmo anche fermarci, il codice è molto più compatto e flessibile rispetto a prima e l'aggiunta di una pagina comporta semplicemente l'aggiunta di un record sul database e nessuna modifica al codice. Questa è e deve essere una buona norma! Codice indipendente e non ripetuto!


Qualunque suggerimento ovviamente è ben accetto, solo in questo modo è possibile migliorarsi.

Ciao
P

CakePhp, MacOs Snow Leopard, Apache e malditesta

CakePhp, un mac e Snow Leopard mi hanno causato dei bei malditesta oggi.

Il problema principale è che la catena di RewriteRule negli .htaccess non funzionava correttamente per via del fatto che mettevo la root di cakephp sotto la cartella Sites del mio utente, e nonostante abbia modificato /etc/apache2/httpd.conf e il file /etc/apache2/users/<my_user>.conf aggiungendo 'AllowOverride All' i file statici nella cartella webroot (come le immagini e i css) non mi venivano serviti.

La mia soluzione con virtual host
1) ho modificato  /etc/apache2/users/<my_user>.conf aggiungendo un virtual host con document root uguale alla root di Cake e impostando 'AllowOverride All' sulla document root in questo modo:


/Sites/">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all



DocumentRoot /Users//Sites/MyNewSite
ServerName mynewsite.dev
ServerAlias www.mynewsite.dev


/MyNewSite">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all




2) Ho inserito una entry manuale nel file /etc/hosts

127.0.0.1 mynewsite.dev


Ora funziona tutto correttamente compresi i vari RuleRewrite dei tre .htaccess di cakephp

Ciao
P.