Vu sur le Daily WTF, ici :

 

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 :

  1. le nom de la méthode n'est pas conforme au Code Conventions for the JavaTM Programming Language
  2. 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.
  3. 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
  4. 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
  5. 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 ?
  6. 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]+$"...
  7. le test sur un booléen avec un comparateur et les constantes true et false, 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...
  8. quelque chose m'échappe peut-être, les commentaires sont encore ouverts