Discussion:
:-) le betisier du PHP
(trop ancien pour répondre)
Pascal Boulerie
2007-07-19 18:36:59 UTC
Permalink
(Contexte : je suis grand débutant en PHP (je n'ai suivi aucune
formation), après avoir fait du Turbo-Pascal et du C durant les 20
dernières années...)
----------------------------------
Si vous enseignez le PHP et que vous aimez les anecdotes. :-)

1) Suite à un problème de serveurs DNS (un utilisateur obligé
d'accéder par l'adresse IP à un site distant), j'ai vu du code dans
lequel le programmeur avait déclaré en dur l'adresse de son serveur
'http://(adresse_URL)/, au lieu de déclarer le répertoire racine :

Code d'origine :
// define('HTTP_MAIN', 'http://(adresse_URL)/') ;

Code corrigé :
define('HTTP_MAIN', '/') ;


2) J'ai bondi en lisant la ligne suivante d'un fichier index.php, ce
genre de code compact (dans un style que l'on retrouve hélas
habituellement chez les programmeurs C) n'étant ni intuitif pour les
débutants, ni pédagogique ! :-(

$intro.= strlen($themes)>0 && $themes!="defaut"?"_".$themes:"" ;
Bruno Desthuilliers
2007-07-20 09:31:27 UTC
Permalink
Pascal Boulerie a écrit :
(snip)
Post by Pascal Boulerie
2) J'ai bondi en lisant la ligne suivante d'un fichier index.php, ce
genre de code compact (dans un style que l'on retrouve hélas
habituellement chez les programmeurs C) n'étant ni intuitif pour les
débutants, ni pédagogique ! :-(
$intro.= strlen($themes)>0 && $themes!="defaut"?"_".$themes:"" ;
C'est surtout inutilement compliqué:

$intro .= ($themes && $themes != 'defaut' ? "_$themes" : '');

Mais je concède qu'en l'occurrence, un if explicite serait plus, heu...
explicite:

if ($themes && $themes != 'defaut') {
$intro .= "_$themes";
}
Michel Billaud
2007-07-20 20:26:22 UTC
Permalink
Post by Pascal Boulerie
2) J'ai bondi en lisant la ligne suivante d'un fichier index.php, ce
genre de code compact (dans un style que l'on retrouve hélas
habituellement chez les programmeurs C) n'étant ni intuitif pour les
débutants, ni pédagogique ! :-(
$intro.= strlen($themes)>0 && $themes!="defaut"?"_".$themes:"" ;
Je ne conteste pas que l'exemple pourrait être mieux écrit, mais
l'argument comme quoi le code devrait être "intuitif" pour les débutants
ne me parait pas correct.

Les opinions esthétiques des débutants sur des langages de
programmation qu'ils ne connaissent pas ne présentent aucun intérêt
en ce qui concerne l'écriture de code destiné à être relu et maintenu
par des non-débutants !

Par ailleurs, l'intuition est surement une belle chose, mais elle se
base sur quoi ? Pour la syntaxe il va y avoir deux criteres :

- soit ce qui est écrit traduit directement l'intention. Ici ce
qu'exprime ce code, c'est que "si la chaine $themes n'est pas vide, ni
égale à défaut, on l'ajoute à $intro précédé d'un '_'". On ne peut pas
dire que ça soit le cas ici.

- soit c'est la tournure adoptée le plus souvent parmi la communauté des gens qui
pratiquent ce même langage pour faire ce genre de choses.


La première chose qui saute aux yeux, c'est le mauvais usage des espaces
qui rend pénible la lecture. Et quelques parenthèses peuvent améliorer
au besoin

$intro .= (strlen($themes) > 0) && ($themes != "defaut")
? "_".$themes
: "" ;


La chose qui fache le plus, c'est la manière de tester si la chaine
est vide. Il y a des manières plus standard de faire ça, sans aller
chercher une comparaison de la longueur, la plus simple
conceptuellement étant sans doute la comparaison avec la chaine vide !

$intro .= ($themes != "") && ($themes != "defaut")
? "_".$themes
: "" ;

reste l'idée d'allonger $intro seulement si la condition est
satisfaite, mieux traduite par un if/then que par une expression
conditionnelle (qui a ses mérites, mais pas ici).

if (($themes != "") && ($themes != "defaut"))
$intro .= "_".$themes;

et résisterait-on à utiliser une expansion plutot qu'une
concaténation ?

if (($themes != "") && ($themes != "defaut"))
$intro .= "_$themes";
MB
--
Michel BILLAUD ***@labri.fr
LABRI-Université Bordeaux I tel 05 4000 6922 / 05 5684 5792
351, cours de la Libération http://www.labri.fr/~billaud
33405 Talence (FRANCE)
Mr Prout !
2007-07-23 08:15:10 UTC
Permalink
Post by Michel Billaud
La chose qui fache le plus, c'est la manière de tester si la chaine
est vide. Il y a des manières plus standard de faire ça, sans aller
chercher une comparaison de la longueur, la plus simple
conceptuellement étant sans doute la comparaison avec la chaine vide !
$intro .= ($themes != "") && ($themes != "defaut")
? "_".$themes
: "" ;
Ou encore mieux, utiliser empty(), qui retourne FALSE lorsque l'on teste
une chaîne vide entre autre :

$intro .= (!empty($themes)) && ($themes != "defaut")
? "_".$themes
: "" ;
slambert
2007-07-21 17:17:22 UTC
Permalink
Post by Pascal Boulerie
(Contexte : je suis grand débutant en PHP (je n'ai suivi aucune
.............
Post by Pascal Boulerie
Si vous enseignez le PHP et que vous aimez les anecdotes. :-)
Alors, on vanne ses collègues et on dit du mal , hmm ?????

tssss tssss.......

Stef
Francois Girault
2007-07-23 18:09:01 UTC
Permalink
Post by Pascal Boulerie
(Contexte : je suis grand débutant en PHP (je n'ai suivi aucune
formation), après avoir fait du Turbo-Pascal et du C durant les 20
dernières années...)
----------------------------------
Si vous enseignez le PHP et que vous aimez les anecdotes. :-)
google code search permet aussi de voir des horreurs :

http://www.google.com/codesearch?hl=en&lr=&q=SELECT+%5C*+FROM+%27%5C.%5C%24_GET

(merci à herodiade pour le lien)
--
FG
Pascal Boulerie
2007-09-04 10:08:37 UTC
Permalink
Question opérateur conditionnel avec variable sans type :-( , voici
l'exemple le plus frappant à mes yeux que j'ai vu :-) :

$variable1 = variable1=='OUI'?1:0;
Olivier Miakinen
2007-09-04 11:19:40 UTC
Permalink
Post by Pascal Boulerie
Question opérateur conditionnel avec variable sans type :-( , voici
$variable1 = variable1=='OUI'?1:0;
^^^^^^^^^
Utiliser le nom « variable1 » pour une constante, c'est assez rigolo.
Cela étant dit, je ne vois strictement pas où tu veux en venir.
Pascal Boulerie
2007-09-06 10:33:50 UTC
Permalink
(Désolé, j'avais oublié le deuxième symbole "$" en reprenant le texte
de l'exemple de code en question.)
--------------------------------------------------------
Question opérateur conditionnel avec variable sans type :-( , voici
l'exemple le plus frappant à mes yeux que j'ai vu :-) :
$variable1 = $variable1=='OUI'?1:0;

Ce qui m'étonnait, c'était de partir d'une variable de type chaîne
pour aboutir à un Booléen, restocké immédiatement dans la même
variable... Mais vu que le langage n'est pas typé... :-(
Olivier Miakinen
2007-09-06 13:32:51 UTC
Permalink
Post by Pascal Boulerie
(Désolé, j'avais oublié le deuxième symbole "$" en reprenant le texte
de l'exemple de code en question.)
--------------------------------------------------------
Question opérateur conditionnel avec variable sans type :-( , voici
$variable1 = $variable1=='OUI'?1:0;
D'accord.

Note que cet exemple n'est pas très aéré, et donc (à mon goût) pas très
lisible. Pour un résultat équivalent, j'aurais écrit :
$variable1 = ($variable1 == 'OUI') ? 1 : 0;
Post by Pascal Boulerie
Ce qui m'étonnait, c'était de partir d'une variable de type chaîne
pour aboutir à un Booléen, restocké immédiatement dans la même
variable...
Non : pas un booléen mais un entier. Pour stocker un booléen, l'écriture
serait beaucoup plus simple :
$variable1 = $variable1 == 'OUI';

Note que j'ai déjà vu l'écriture suivante, parfaitement ridicule :
$variable1 = ($variable1 == 'OUI') ? true : false;
Post by Pascal Boulerie
Mais vu que le langage n'est pas typé... :-(
Oui.
Pascal Boulerie
2007-09-07 07:51:29 UTC
Permalink
cet exemple n'est pas très aéré, et donc (à mon goût) pas très lisible.
C'est d'ailleurs pour cela que je l'ai posté à dessein... :-)

Michel Billaud
2007-09-06 14:19:46 UTC
Permalink
Post by Pascal Boulerie
(Désolé, j'avais oublié le deuxième symbole "$" en reprenant le texte
de l'exemple de code en question.)
--------------------------------------------------------
Question opérateur conditionnel avec variable sans type :-( , voici
$variable1 = $variable1=='OUI'?1:0;
Ce qui m'étonnait, c'était de partir d'une variable de type chaîne
pour aboutir à un Booléen,
Un entier, plutôt, vu qu'il n'y a pas de booléens en PHP
Du reste, on aurait pu faire
$variable1 = $variable1=='OUI';
Post by Pascal Boulerie
restocké immédiatement dans la même
variable... Mais vu que le langage n'est pas typé... :-(
Absolument. Mais le problème n'est pas là, il y a des tas de langages
très bien où on peut faire ce genre de choses (Lisp, Smalltalk, etc.).

En fait cet exemple a 3 problèmes
- nom de variable mal choisi $variable1
- réutilisation d'une variable pour deux usages différents (chaine de caractère en entrée, condition)
- et utilisation d'une tournure maladroite ( X==Y ? 1 : 0 équivaut à X==Y)

et ce n'est pas la faute d'un langage si n'importe qui s'en empare
pour programmer comme un goret :-)


MB
--
Michel BILLAUD ***@labri.fr
LABRI-Université Bordeaux I tel 05 4000 6922 / 05 5684 5792
351, cours de la Libération http://www.labri.fr/~billaud
33405 Talence (FRANCE)
Olivier Miakinen
2007-09-06 15:18:23 UTC
Permalink
Post by Michel Billaud
Post by Pascal Boulerie
$variable1 = $variable1=='OUI'?1:0;
Ce qui m'étonnait, c'était de partir d'une variable de type chaîne
pour aboutir à un Booléen,
Un entier, plutôt, vu qu'il n'y a pas de booléens en PHP
En fait si, depuis PHP 4 :
http://www.php.net/manual/fr/language.types.boolean.php
Post by Michel Billaud
Du reste, on aurait pu faire
$variable1 = $variable1=='OUI';
Pour avoir un booléen, oui.
Post by Michel Billaud
[...]
et ce n'est pas la faute d'un langage si n'importe qui s'en empare
pour programmer comme un goret :-)
'bsolument.
Continuer la lecture sur narkive:
Loading...