Fabio Mosti
consulente informatico
stressato e bastardo

sviluppo web, appunti di buona programmazione / I

12/05/2012 - sviluppo web, appunti di buona programmazione / I
tags: PHP, programmazione

Mi è capitato a un certo punto di dover mettere insieme una semplice funzione per eliminare gli spazi ripetuti nelle stringhe; sul momento la tentazione di buttare lì due righe di codice in fretta e furia è fortissima, specialmente quando il compito è molto semplice come in questo caso. Però trovando cinque minuti in più si può fare un lavoro molto migliore, e allora perché non farlo? Il trucco che uso in questi casi è approcciare i problemi semplici come se fossero molto complessi. Funziona! Ecco il sorgente che è saltato fuori:

    /**
     * questa funzione riduce i caratteri ripetuti in una stringa
     * tramite l'impiego di una espressione regolare
     *
     * @param string $t         la stringa da modificare
     * @param string $c         il carattere ripetuto da ridurre (opzionale, di default riduce gli spazi)
     * @return string           la stringa modificata
     *
     * @category                testo
     * @author                  Fabio Mosti <fabio@videoarts.eu>
     * @version                 2012-05-10 14:39        funzione creata
     * @version                 2012-05-12 11:09        test unit e debug
     *
     */

    function riduciCaratteriDoppi( $t , $c = " " ) {

        // compongo l'espressione regolare
            switch( $c ) {

                case " ":

                    $expr = '/\s+/';
                    $sost = ' ';

                break;

                case "\\":
                case "^":
                case "{":
                case "}":
                case "[":
                case "]":
                case "(":
                case ")":
                case "?":
                case "*":
                case "$":
                case "+":
                case ".":

                    $expr = '/[\\' . $c . ']+/';
                    $sost = $c;

                break;

                default:

                    $expr = '/[' . $c . ']+/';
                    $sost = $c;

                break;

            }

        // debug, test dell'espressione regolare
            // preg_match_all( $expr , $t , $ar );
            // print_r( $ar );

        // eseguo l'espressione regolare
            $t = preg_replace( $expr , $sost , $t );

        // restituzione risultato
            return $t;

    }

    /**
     * test unit
     * questa funzione e' stata testata per il funzionamento con le seguenti chiamate
     *
     * chiamata                                                         // valore restituito    // check
     * echo riduciCaratteriDoppi( "test  test" );                       // test test            // OK
     * echo riduciCaratteriDoppi( "test  test      test" );             // test test test       // OK
     * echo riduciCaratteriDoppi( "test__test___test" , "_" );          // test_test_test       // OK
     * echo riduciCaratteriDoppi( "testAAtestAAAtest" , "A" );          // testAtestAtest       // OK
     * echo riduciCaratteriDoppi( "test--test---test" , "-" );          // test-test-test       // OK
     * echo riduciCaratteriDoppi( 'test\\test\\\test' , '\\' );         // test\test\test       // OK
     * echo riduciCaratteriDoppi( 'test$$test$$$test' , '$' );          // test$test$test       // OK
     *
     */

Come vedete la funzione ha due modalità di lavoro innanzitutto; com'è mia abitudine, faccio in modo che l'utilizzo più frequente richieda meno parametri possibile e siccome la funzione nasce per ridurre gli spazi se vogliamo che si comporti in questo modo possiamo limitarci a passare la nostra stringa e basta (casi 1 e 2 della test unit). Nel caso invece ci serva di ridurre un carattere diverso allora dobbiamo specificarlo come secondo parametro, e qui entra in gioco un problema che è emerso in fase di test (ecco perché bisogna sempre fare i test anche per le funzioni dell'oca tipo questa); visto che alcuni caratteri hanno un significato funzionale nel contesto delle espressioni regolari è necessario farne l'escape quando andiamo a inserirli nell'espressione stessa, ed ecco la ragione del costrutto case che occupa tutta la parte centrale della funzione.

Le cose su cui vorrei insistere qui, al di là della banalità della funzione, riguardano le modalità con cui è costruita e lo stile con cui è scritto il codice. Che vi piaccia o meno il mio modo di indentare (e se non vi piace sono affari vostri), noterete che tutti i passaggi logici sono commentati nella maniera più chiara possibile, inoltre la funzione è introdotta da un commento sinottico che ne rende evidenti l'impiego, i parametri, il valore di ritorno oltre ad altri dati interessanti. Fondamentale poi, come abbiamo già visto, è la test unit in fondo, che ci consente non solo di essere sicuri di aver provato tutto e constatato che tutto funzioni, ma anche di avere dei comodi esempi di utilizzo della funzione ideali per un copia e incolla veloce. Notate infine il codice di debug adeguatamente commentato e lasciato comunque per velocizzare eventuali debug successivi. Inutile dire che la funzione, prima di essere mandata in produzione, andrà ripulita di tutti i commenti (e per tutti intendo tutti!) in quanto nessuno sano di mente si metterebbe mai a fare debug in produzione... vero??? ^_^

Warning: Illegal string offset 'codice' in /var/www/vhosts/videoart000003/httpdocs/_codice/_templates/_default_/_template.footers_pagina.php on line 10