Mangiare Senza Glutine disponibile su App Store

Per altre informazioni scrivi a fabriziocaldarelli@negusweb.it

Gestione della configurazione di un'applicazione web

Da Programmazione Software.

Descrizione

Per configurazione si intende la centralizzazione di costanti utilizzate all’interno dell’intero programma, in modo che lo stesso sia, nei limiti e nelle modalità previste dal progetto, modificabile attraverso la variazione del valore di queste costanti.


La centralizzazione dell’applicazione consentirà, in tutti i files che necessitano della configurazione, semplicemente di richiamare il file della configurazione per averne il contenuto.

Pensiamo ad esempio all’indirizzo email del gestore del sito; molto sicuramente questa email verrà inserita più volte ed in più punti del programma; esternalizzarne il valore ed inserirlo in un file unico insieme ad altre costanti, rende più facile il lavoro di manutenzione nel caso in cui questa email, per esempio, cambi nel tempo.

Per realizzare questa configurazione ci sono due strade: la prima più diretta ma che presenta alcuni inconvenienti ed una seconda, meno immediata, ma sicuramente più efficace dal punto di vista del controllo della configurazione stessa.

Il linguaggio di riferimento di questi esempi è PHP, ma questo discorso è abbastanza astratto dal linguaggio e quindi applicabile anche in altri ambiti.

Il primo metodo è quello di utilizzare una variabile, es. $config, che sarà un vettore le cui chiavi sono il nome delle costanti ed il valore il valore stesso della costante.

Esempio: config1.php

$config = array(); 
$config['email'] = 'mario@rossi.it'; 
$config['version'] = '1.0.0'; 
$config['db_host'] = 'localhost';


Una prima importante modifica di questo semplice esempio è già scendere di almeno un altro livello nell’array, in modo da poter utilizzare la prima chiave come argomento principale e la seconda chiave come elemento specifico. Mi spiego meglio. Come si vede, l’ultimo elemento di $config ha come chiave ‘db_host’. La prima parte di ‘db_host’ specifica un eventuale categoria dell’elemento, mentre la seconda specifica il dettaglio. A questo punto si potrebbe specificare meglio $config in questo modo:

config2.php

$config = array();
$config['general']['email'] = 'mario@rossi.it';
$config['general']['version'] = '1.0.0';
$config['db']['host'] = 'localhost';


Ora è molto più chiaro ed evidente cosa appartiene alla sezione ‘general’ di configurazione e cosa alla sezione ‘db’; A questo punto lavorare su un file di questo tipo è molto semplice e chiaro, e non richiede particolari compentenze. Per utlizzare questa configurazione in un qualsiasi file basterà fare l’include appunto del file di configurazione e utilizzare la variabile $config, che ora sarà opportunamente inizializzata.

Appare evidente però che una soluzione di questo tipo, per quanto funzionante, lascia nel codice il pericolo, ad esempio, di sovrascrivere una variabile o comunque di compromettere il valore della variabile $config; infine c’è anche il rischio ed il pericolo che la variabile $config già esista nel codice (soprattutto nel caso in cui nel codice ci debbano lavorare più persone). Allora la soluzione a questo problema è incapsulare il più possibile la variabile $config, in modo che sia facilmente riutilizzabile nel codice senza paura di sovrascrivere niente o che qualcun’altro la possa sovrascrivere.

Per questo proposito utilizzerò il patter Singleton, in questo modo:

cconfig.class.php


class CConfig
     {
          var $instance = null;
          var $arrGeneral;
          var $arrDb;
 
          private function InitConfig()
          {
               $arrConfig = include('config.inc.php');
               $this->arrGeneral = $arrConfig['general'];
               $this->arrDb = $arrConfig['db'];
          }
 
          public function getDb($key) 
          { 
               return $this->getValueConfig($this->arrDb, $key); 
          }
          public function getGeneral($key) 
          { 
               return $this->getValueConfig($this->arrGeneral, $key); 
          }
 
 
          private function getValueConfig($arrData, $key)
          {
               $retVal = null;
               if (isset($arrData[$key])) $retVal = $arrData[$key];
               return $retVal;
          }
 
          /*
               Parte relativa al Singleton 
          */
          public function getSingleton() 
          { 
               if ($instance==null) $instance = new CConfig();
               return $instance;
          }   
          private function CConfig() { $this->InitConfig(); }
 
     }


config.inc.php

$arrGeneral = array(
     'email'   => 'mario@rossi.it',
     'version' => '1.0.0'
);
 
$arrDb = array(
     'host'    => 'localhost'
);
 
return array(
     'general' => $arrGeneral,
     'db' => $arrDb
);


Il tutto sembra più complicato, ma non lo è. Infatti i valori delle costanti sono sempre definiti all’interno del file config.inc.php (maneggiabile da chiunque), con la sola complicazione che per ogni categoria che si creerà si dovrà mettere mano alla classe CConfig. Ma si tratta comunque di un’operazione molto rapida e sicuramente poco frequente dopo aver messo in produzione l’applicazione.

Così nel nostro file di test, scriveremo semplicemente:

require_once('cconfig.class.php'); 
$configurazione = CConfig::getSingleton();
echo $configurazione->getGeneral('email');
echo $configurazione->getDb('localhost');

E potremo chiamare la nostra variabile (in questo caso $configurazione) come vogliamo, senza avere il rischio di sovrascriverla (perchè in sola lettura) e di sovrascriverne i valori.