Bienvenue sur PEBKAC.fr, le site qui recense les anecdotes où l’on se moque des utilisateurs ne maîtrisant pas l’outil informatique. PEBKAC est un acronyme signifiant « Problem Exists Between Keyboard And Chair ».
Le problème se situe entre la chaise et le clavier : soumettez vos histoires, donnez votre avis !
Ce site n'est pas le site original pebkac.fr. Je publie ici la liste des PEBKAC que j'ai pu sauvegarder avant que le site original ne soit mis hors ligne.
En stage, on m'a demandé de reprendre et d'améliorer un clavier virtuel implémenté en C# .NET par mon maître de stage. Le clavier possédait 3 états : minuscules, majuscules, et caractères spéciaux/chiffres.
Chaque « touche » du clavier était représentée par un bouton, et avait le bon caractère à afficher dessus (c'est-à-dire que le texte du bouton est bien modifié en fonction de l'état). Voilà à quoi ressemblait le code que j'ai ouvert :

button_A_Click(object sender, EventArgs e)
{
  if (etat == min) { envoyer("a"); }
  else if (etat == maj) { envoyer("A"); }
  else { envoyer("0"); }
}

button_B_Click(object sender, EventArgs e)
{
  […]

En effet, au lieu de créer une seule fonction commune à toutes les touches qui envoie simplement le texte affiché dessus, le développeur avait créé une fonction différente pour chaque touche du clavier, avec des conditions pour chaque état. PEBKAC.
PEBKAC #9227 proposé par Klarchen le 08/01/2014 | 25 commentaires | 👍🏽 👎🏽 +155
Après il faut aussi voir comment, il affiche le texte sur la touche. Je pense qu'il serait capable d'utiliser des bitmaps :)
Commentaire #124687 écrit par but2ene le 08/01/2014 à 12h52 | 👍🏽 👎🏽
[Meta]
Quelqu'un peut-il m'expliquer les deux (pour le moment ils sont deux) votes "CTLP" svp ?
Commentaire #124690 écrit par Alfred456654 le 08/01/2014 à 13h04 | 👍🏽 👎🏽
Incompréhension, manque d'intérêt pour l'anecdote, le pouvoir de dire non... This is the Internet !
Commentaire #124692 écrit par Belore le 08/01/2014 à 13h09 | 👍🏽 👎🏽
A tel point que les situations louches ne sont pas celles avec quelques votes marginaux, mais celles sans un seul vote marginal.
Commentaire #124697 écrit par Voynich le 08/01/2014 à 13h26 | 👍🏽 👎🏽
Peut-être aussi le fait qu'un code non-optimisé, mais fonctionnel, n'est pas nécessairement un PEBKAC, comme ce qui a été dit en commentaire sur d'autres anecdotes.

Je m'abstiens de voter personnellement =/
Commentaire #124698 écrit par Milleuros le 08/01/2014 à 13h27 | 👍🏽 👎🏽
Comme tu as l'air de t'en plaindre je vais en mettre un autre
Commentaire #124704 écrit par Sokra le 08/01/2014 à 13h35 | 👍🏽 👎🏽
"Incompréhension" => "Compréhension différente de la tienne", plutôt...
Commentaire #124708 écrit par Sihn le 08/01/2014 à 13h56 | 👍🏽 👎🏽
C'est pourtant très simple.
Je ne suis pas développeur, de ce que j'en comprend, le code me semble logique et donc devrait fonctionner, je ne vois donc pas en quoi c'est un PEBKAC.

Perso, je ne vote pas sur ce genre de PEBKAC puisque je ne suis pas dev et ne les comprends pas toujours très bien (quand j'ai le courage de lire jusqu'au bout).
Commentaire #124712 écrit par seb le 08/01/2014 à 14h17 | 👍🏽 👎🏽
Par « incompréhension », je pensais à ceux qui n'ont pas compris. Ceux qui ont compris mais qui n'apprécient pas l'anecdote, je les vois plutôt dans « manque d'intérêt » ou dans une autre catégorie que je ne cite pas.
Commentaire #124716 écrit par Belore le 08/01/2014 à 14h35 | 👍🏽 👎🏽
C'est pas optimisé mais ça marche, non ? J'imagine qu'il a testé sur un bouton puis qu'il a copier/coller pour aller plus vite, ou alors ça peut aussi être fait par un générateur.
Ah mon avis il n'a pas voulu s'embêter, surtout pour le "else" qui ne va surement pas renvoyer la même chose dans chaque fonction.
Commentaire #124719 écrit par juu le 08/01/2014 à 14h54 | 👍🏽 👎🏽
L'avantage c'est que de cette façon, il peut mapper très précisément chaque touche en incluant quelques blagounettes si l'envie lui en prend.
Commentaire #124721 écrit par Loute le 08/01/2014 à 14h57 | 👍🏽 👎🏽
C'est juste qu'il y a un principe en programmation, que si jamais un morceau de code / une instruction se répète, alors on a meilleur temps d'en faire une fonction.
Il y a donc des manières beaucoup plus élégantes (et plus optimisées) de faire ça. Je ne sais pas lesquelles par contre, parce que je ne connais que le base de C++ (donc je proposerais un raisonnement orienté objet).

Néanmoins, c'est simple, ça fonctionne, donc c'est pas vraiment un PEBKAC.
Commentaire #124726 écrit par Milleuros le 08/01/2014 à 15h13 | 👍🏽 👎🏽
@Milleuros : C'est du C#, donc c'est de l'objet.


Une façon plus simple, élégante, maintenable, whatever you want de le faire aurait été quelque chose du genre :

button_Click(object sender, EventArgs e)
 {
   Button b = sender as Button; // vu le nom des méthodes j'imagine que le clavier est composé de Button asp ?
   if (b == null) {
     // gestionnaire d'évènement appelé au mauvais endroit => gérer l'erreur
     return;
   }
   envoyer(b.Text);
 }


Et utiliser cet unique gestionnaire d'évènement sur tous les boutons du clavier.
Commentaire #124727 écrit par Acorah le 08/01/2014 à 15h24 | 👍🏽 👎🏽
"@Milleuros : C'est du C#, donc c'est de l'objet."

Ah ah ... oups.
Commentaire #124728 écrit par Milleuros le 08/01/2014 à 15h26 | 👍🏽 👎🏽
Mouais... Rajoute donc un mode "caractères spéciaux" pour réutiliser ton clavier dans une autre appli. Tu changeras d'avis sur le "ça va plus vite". Surtout que ça ne va pas forcément plus vite quand on peut utiliser très simplement une méthode unique qui ne prend pas plus de lignes (cf mon autre commentaire plus haut).
Commentaire #124729 écrit par Acorah le 08/01/2014 à 15h28 | 👍🏽 👎🏽
@Acorah : je dirais même plus

Créer une classe qui étend Button lui rajouter 2 variable (ou un tableau/liste, a jauger) et une méthode. La première avec la lettre (qui sera passé en majuscule le cas échéant), et une seconde qui sera le caractère spécial de la lettre.

La méthode fera juste le if/else présent mais avec les variables (ou le tableau/liste).

Un constructeur pour initialiser les variables en question.

En plus en faisant comme ca je suis sur qu'on peux faire en sorte que les boutons "écoutent" le changement d'état du clavier pour s'auto-modifier avec la bonne valeur à afficher :3

Du coup le texte récupéré avec envoyer(b.Text); est toujours le bon et à jour :3

Mais je ne suis pas très bon en C#, j'en ai juste fait un peu en cours (je préfère le Java x) )
Commentaire #124748 écrit par Nejaa Halcyon le 08/01/2014 à 17h26 | 👍🏽 👎🏽
Y'avait surement moyen de stocker les valeurs dans un tableau à 3 entrées, genre id de la touche, [valeur à afficher/valeur à envoyer], mode actuel.
Ensuite une petite fonction avec en paramètre l'id de la touche et le mode actuel du clavier, et le tour est joué. En modifiant le tableau on peut modifier le comportement et le "libellé" des touches.
Pas la peine de coder les touches une à une avec des if, des else et des valeurs en dur.
Et si on aime les fichiers texte & co, on peut même stocker ça dans un fichier éditable par l'utilisateur s'il veut personnaliser son clavier !

C'est dans ces moments-là que je comprends le mieux cette phrase de mon ancien maitre de stage: "un bon programmeur est un programmeur feignant"...

EDIT: et la solution d'Acorah est tout à fait élégante.
Commentaire #124757 écrit par Youplà le 08/01/2014 à 17h42 | 👍🏽 👎🏽
"Quelqu'un peut-il m'expliquer les deux (pour le moment ils sont deux) votes "CTLP" svp ?"

C NUL Y A DU CODE DEDAN LOL C PAS DROL JE COMPREN PAS.
Commentaire #124781 écrit par wut le 08/01/2014 à 20h22 | 👍🏽 👎🏽
On peut aussi générer "automagiquement" les touches et garder directement une référence avec l'objet Button, dans ce genre là:
 enum States {Lowercase, Uppercase, SpecialChars}
 
 Tuple<string, string, string>[] Keys = [
     new Tuple<string, string, string>("a","A","1"),
     new Tuple<string, string, string>("z","Z","2"),
     new Tuple<string, string, string>("e","E","3"),
     /.../
 ];
 
 Dictionnary<Button, Tuple<string, string, string>> ButtonKeys = new Dictionnary<Button, Tuple<string, string, string>>();
 
 private void Init(){
     for(Tuple<string, string, string> t in Keys){
         Button b = new Button();
         b.OnClick += Button_Click;
         b.Text = t.Item1;
     }
 }
 
 private void Button_Click(object sender, EventArgs e){
     Button b = sender as Button;
     if(b != null && ButtonKeys[b] != null){
         Tuple<string, string, string> key = ButtonKeys[b];
         
         switch(CurrentKeyboardState){
             case Lowercase:
                 Envoyer(key.Item3);
                 break;
             case Uppercase:
                 Envoyer(key.Item3);
                 break;
             case SpecialChars:
                 Envoyer(key.Item3);
                 break;
             default:
                 return;
         }
     }
 }
 


Après, un code qui marche est mieux qu'un beau code...
Commentaire #124812 écrit par triman le 09/01/2014 à 07h54 | 👍🏽 👎🏽
Sur internet, et même en général, tu n'as jamais 0 vote pour un choix.

Même si un jour on propose de soit manger une sucette à la fraise ou tuer un chaton en violant une grand mère en mangeant des choux de Bruxelles, y'aura toujours quelqu'un pour choisir la seconde solution.

C'est justifié par le fait que chacun perçoit les chose sa sa manière.
Commentaire #124963 écrit par Cartman34 le 09/01/2014 à 23h14 | 👍🏽 👎🏽
Ah, en effet je n'ai pas précisé, mais s'il m'a demandé de reprendre le code, c'est que le clavier était truffé de bugs ^^

J'ai vu plein d'aberrations dans ce programme, mais celle la était la plus énorme...

Dans toutes ces fonctions, quoi qu'il arrive, il est sensé envoyer le texte qui est affiché sur le bouton. Et si jamais il veut changer les caractères spéciaux affichés sur son clavier, il doit aussi retrouver la fonction de la touche associée, et la modifier.
(Evidemment il n'avait pas tout mis à jour, et certaines touches ne correspondaient pas à ce qui était affiché sur le clavier...)
Donc énorme perte de temps, créer 26 fonctions avec des conditions plutôt qu'une seule d'une seule ligne (oui, une seule ligne, je l'ai fait, ça marche)... Il s'est embêté beaucoup plus que s'il avait réfléchit 30 secondes à comment faire ça je pense.
Commentaire #124965 écrit par Klarchen le 09/01/2014 à 23h16 | 👍🏽 👎🏽
J'ai pas eu besoin de faire une fonction aussi compliquée, il avait bien fait une fonction qui modifiait le texte des boutons du clavier en fonction de son état. Il suffisait de récupérer le texte du bouton sender et de l'envoyer...
Commentaire #124966 écrit par Klarchen le 09/01/2014 à 23h20 | 👍🏽 👎🏽
Je ne sais pas pourquoi, mais j'ai toujours eu horreur de me baser sur le texte affiché par un contrôle...
Commentaire #124968 écrit par triman le 09/01/2014 à 23h38 | 👍🏽 👎🏽
En effet. D'ailleurs j'aime pas la fraise !
Commentaire #124985 écrit par Alfred456654 le 10/01/2014 à 09h42 | 👍🏽 👎🏽
Ni les grand-mères ?
Commentaire #125238 écrit par Kebukai le 12/01/2014 à 14h32 | 👍🏽 👎🏽