Overloading

venerdì 6 febbraio, 2009

L'overloading è una caratteristica davvero utile di alcuni linguaggi di programmazione ad oggetti. Tuttavia non tuti i linguaggi OO la supportano, e alcuni la "implementano" in modo o limitato o differente. In linea generale, per le funzioni o metodi, l'overloading permette di creare due o più funzioni/metodi che hanno lo stesso nome ma accettano parametri differenti, ad esempio:

CODE:
  1. function somma (a:int, b:int) {
  2. // code
  3. }
  4.  
  5. function somma ( a:float, b:float ) {
  6. // code
  7. }
  8.  
  9. function somma ( a:string, b:string, c:string ) {
  10. // code
  11. }

La scelta della funzione giusta da usare è, evidentemente, dettata esclusivamente dal "tipo" (e anche dal numero) di parametri passati alla funzione stessa. È possibile, cone poche righe di codice aggiuntive, emulare tale comportamento anche in linguaggi che non lo supportano direttamente. Ad esempio in PHP è possibile creare una funzione di questo tipo:

PHP:
  1. /**
  2.  * Questa funzione si comporta in modo diverso in base ai parametri in input.
  3.  * In questo esempio possiamo "capire" come comportarci in base all'analisi
  4.  * dei parametri di input e quindi:
  5.  *
  6.  * - recuperare i parametri anche se passati in modo diverso
  7.  * - far eseguire codice diverso alla funzione in base ai parametri di input
  8.  *
  9.  *
  10.  */
  11. function get_qualcosa( $id_qualcosa = '' ) {
  12.  
  13.     if( func_num_args()> 0 ) {                   // numero degli argomenti
  14.         $arg = func_get_arg(0);                   // prendo il primo
  15.         if( is_array( $arg ) ) {                  // se il primo argomento è un array...
  16.             $id_qualcosa = $arg[ 'id_qualcosa' ]; // faccio qualcosa o recupero il parametro
  17.         }
  18.     }
  19. }

Questa tecnica può risultare utile quando abbiamo una funzione che può venire chiamata in ambiti diversi. Ad esempio immaginiamo di avere una funzione che estrae da una database le informazioni di un utente. Questa potrebbe avere la forma:

PHP:
  1. /**
  2.  * Ottiene le informazioni utente tramite l'id
  3.  *
  4.  * @param    $id    ID dell'utente sul database
  5.  */
  6. function get_user_info ( $id_user = '' ) {
  7.     if( func_num_args()> 0 ) {           // numero degli argomenti
  8.         $arg = func_get_arg(0);           // prendo il primo
  9.         if( is_array( $arg ) ) {          // se il primo argomento è un array...
  10.             $id_user = $arg[ 'id_user' ]; // $arg === $_POST
  11.         }
  12.     }
  13. }

Questa funzione può essere utilizzata all'interno di una libreria (mialib.php) e richiamata da altre funzioni PHP. Se usiamo tecniche Ajax o anche semplici FORM, sarebbe comodo poter riusare la medesima funzione senza costruirne una appositamente. Se abbiamo quindi un FORM che richiede tramite un menu select la scelta dell'utente:

HTML:
  1. <form method="post" action="sample.php">
  2. <select name="id_user">
  3. <option value="1">Utente 1</option>
  4. <option value="2">Utente 2</option>
  5. <option value="3">Utente 3</option>
  6. <input type="hidden" name="comando" value="get_user_info" />
  7. <input type="submit" value="Invia" />

La nostra sample.php potrebbe essere:

PHP:
  1. // includo il file che contiene le mie funzioni
  2. include_once "mialib.php";
  3. // chiamo la mia funzione passando un array $_POST
  4. eval( 'echo ' . $_POST[ 'comando'] . "( \$_POST );" );

Post correlati

Questo articolo ti è stato utile?: Per nientePocoAbbastanzaMoltoMoltissimo
Loading ... Loading ...

Non ci sono commenti per questo Post

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre>         // blocco generico
[code][/code]       // blocco generico
[as][/as]           // Actionscript
[css][/css]         // CSS Style Sheet
[html][/html]       // HTML
[js][/js]           // Javascript
[objc][/objc]       // Objective-C
[php][/php]         // PHP
[sql][/sql]         // SQL