public boolean quote_string_checker (String stringtoscan) { boolean testval = true; try { Pattern p = Pattern.compile("[a-z]"); for(int i=0;i<stringtoscan.length();i++) { char chartoscan=stringtoscan.charAt(i); //Matcher m = p.matcher(chartoscan); //String s=""+chartoscan; String c=Character.toString(chartoscan); Matcher m=p.matcher(c); testval = m.matches(); if (testval==false) break; } } catch (java.util.regex.PatternSyntaxException e) { testval = false; } return testval; }
C'est une portion de code absolument horrible, et on peut se demander s'il est vraiment possible d'écrire ça... tant qu'on n'a pas travaillé dans une SSII bien sûr. La prochaine fois que vous verrez une de ces entreprises se glorifier de faire du recrutement dans toutes les filières et de les bombarder programmeur après une formation d'une semaine, vous comprendrez mieux pourquoi ça ne fonctionne pas aussi bien que ce qu'on vous avait promis lors de la clinquante présentation de la réponse à l'appel d'offre.
Mise à jour : faut-il vraiment poster de mauvais exemples de code sur le web ? Ceci est-il sérieux ou est-ce une plaisanterie ? :-) Pour finir la mise à jour, la liste des choses horribles :
- le nom de la méthode n'est pas conforme au Code Conventions for the JavaTM Programming Language
- titre du WTF, le try/catch est complètement inutile puisque qu'il ne concerne que la compilation du patron de l'expression régulière, et celui-ci est statique, donc aucune raison que ça plante. PatternSyntaxException est une RuntimeException, donc même pas besoin de l'attraper ou de la relancer.
- la boucle est faite avec test sur String::length() à chaque itération, dans un cas comme ça où le sens de l'itération n'a pas d'importance, autant utiliser une boucle en sens inverse : un seul appel de length() sans pour autant avoir une variable en plus
- utilisation de String::charAt(int) dans la boucle... si on prévoit d'itérer sur tous les caractères, autant utiliser String::toCharArray() et boucler sur le tableau
- on sort un char pour recréer un String dans la nano-seconde qui suit... dans ce cas-là, autant partir sur du String::substring(int,int) non ?
- suivant... tout ça pour tester un caractère, sur une plage continue et bornée de l'encodage... euh... donc là... soit on teste
('a' >= chartoscan && chartoscan <= 'z')
, soit on veut vraiment utiliser une expression régulière ("dis la mouche, tu l'as vu mon marteau ?"), et on prend comme patron"^[a-z]+$"
... - le test sur un booléen avec un comparateur et les constantes
true
etfalse
, c'est, comment dire... c'est nier la nature du booléen. J'ai déjà vu des normes de codage où c'était imposé, mais franchement... - quelque chose m'échappe peut-être, les commentaires sont encore ouverts
8 réactions
1 De Florent MLYNSKI - 13/04/2005, 03:36
Pas mal du tou :-) Un grand moment de bonheur ! Moi qui pensait être mauvais...
2 De avi - 13/04/2005, 07:41
quand est-ce que tu nous sors un bouquin du "bien coder en java"? ;)
3 De Damien B - 13/04/2005, 08:28
Je ne peux malheureusement pas, c'est comme demander a un peintre "peindre des belles toiles" :-)
4 De dda - 13/04/2005, 21:39
De toute façon, avec Java, fallait pas s'attendre à du code de talent !
/me court aux abris anti-nucléaires... :-P
Le problème des regexes, c'est que le premier zozo venu peut se permettre d'écrire des patterns de zombie (surtout pour tester la chaîne caractère par caractère. J'ai un fichier à traiter de 26MB, un million de lignes, il peut toujours essayer, hein !). Faudrait un permis pour accéder au module `re` (ah pardon, c'est pas du Python ici ;-)
5 De Damien B - 14/04/2005, 04:13
C'était tellement mauvais qu'au début j'ai cru que c'était du C# :-) Et puis désolé, je trouve _this_ absolument affreux, d'ailleurs je n'aime pas les traits bas tout court, donc Python ça n'est pas pour moi (enfin, peut-être qu'un jour)...
6 De Yann - 16/04/2005, 08:44
Les WTF c'est comme les blagues, expliquer pourquoi c'est drôle fait perdre toute sa saveur à la chose.
7 De dda - 17/04/2005, 17:37
D'ailleurs, le second exemple dans ce post à WTF est encore pire...
N'empêche que, en Python, toute cette gabegie d'électrons sans doute appelée "code" par l'auteur de ce contre-exemple du bon goût, ça se réduit à une ligne :-)
re.match(r'^[a-z]$',stringtoscan) renvoit True ou False. Difficile de faire en même temps plus court et lisible (dans le fion, Perl, hahahahahaha ! Ahem, 'scusez, un moment de folie...)
8 De Damien B - 18/04/2005, 05:41
@Yann : ceux qui veulent du WTF non explique sont deja abonnes, je dois contenter mes lecteurs aussi, c'est ca ma plus-value :-)
@dda : c'est encore plus court en Java, matches("^[a-z]+$",stringtoscan);, vive les imports statiques !