Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

Non aux booléens !

Dernièrement, en relisant un ancien script, je suis tombé sur une ligne du type "ma_fonction( true, false, false, true)". 


Et là, je me suis dit : "heu .. ça correspond à quoi ces paramètres, je ne me rappelle plus !".

En effet, lorsque l'on n'a pas la signature de la fonction sous les yeux, ce type de paramètre devient complètement illisible.


Comparez ceci :


<?php
affiche_formulaire
( true, false, false, true );
?>


et


<?php
affiche_formulaire
( ACCESS_VISITEUR, SANS_EMAIL, SANS_IDENTIFICATION, TEST_TURING );
?>


Cette dernière ligne de code n'est-elle pas plus explicite ?

En fait ce n'est pas exactement les booléens qu'il faut bannir mais toutes formes de paramètres sans signification claire.

Ainsi, "setOptions(TITRE + DESCRIPTION)" est plus lisible que "setOption( 3 )".

Bon, c'est peut-être bateau comme remarque, mais je constate que beaucoup d'auteurs de scripts utilisent les paramètres booléens sans définir de constantes, obligeant leurs utilisateurs à écrire d'obscures fonctions ou à définir eux-même des constantes.

D'ailleurs, un booléen est-il toujours nécessaire ?

Dans l'exemple "affiche_formulaire", j'aurais pu définir les constantes suivantes :


<?php
define
('ACCESS_VISITEUR', 1 );
define('EMAIL',           2 );
define('IDENTIFICATION',  4 );
define('TEST_TURING',     8 );
?>


Ensuite, il devient simple d'écrire une fonction prenant un seul paramètre comme ceci :
 


<?php
affiche_formulaire
( ACCESS_VISITEUR + TEST_TURING ); // 1 + 8 = 9
?>

Enfin, le corps de ma fonction effectue les tests de la manière suivante :

<?php
// [..]
if( $options & ACCESS_VISITEUR ) // ...
if( $options & EMAIL ) // ...
if( $options & IDENTIFICATION ) // ...
if( $options & TEST_TURING ) // ...
// [..]
?>


Attention : Je vous conseille de préfixer vos constantes pour éviter toutes formes de conflits et de confusions.


Ex: "FORM_OPTION_ACCESS_VISITEUR"

Comme vous pouvez le voir, j'utilise l'opérateur binaire "&" qui permet de faire une sorte de filtrage.


Dans mon exemple, "$options & TEST_TURING" revient à faire "9 & 8", ce qui va me retourner "8" sachant qu'une valeur différente de "0" est assimilée à une condition "vrai". De même "$options & EMAIL" revient à faire "9 & 2", ce qui me donne "0" lui-même assimilé à "faux".


Remarque: Si vous ne maîtrisez pas la logique binaire, je ne peux malheureusement pas vous aider plus et je vous invite à lire quelques articles à ce sujet, disponible sur le Net.

Alors, avez-vous vraiment besoin de booléens ?


ADAM Benjamin 2008 | Admin