Voila, je m'ennui un peu, et je voulais vous faire part d'une reflexion.
Depuis le temps où j'ai commencé à coder des interfaces graphiques pour des petits programmes (écrits par mes soins), je me suis rendu compte que le code de la partie GUI est toujours assez déguellasse.
Bon, les première fois, i s'agissait certes d'appli qui avaient été initialement pensées pour de la console.
Donc forcément, la GUI étant assez intrusive vu que c'est elle qui fait la "chef d'orchestre", en appelant mes fonctions au bons moments en fonction de ce que fais l'utilisateur, je me retrouvais avec un code assez imbuvable.
Et puis dans des projets plus récents (de fac essentiellement), je me suis rendu compte que même prévu à l'avance, le code d'une interface graphique me donne toujours l'impression d'être "rustiné".
C'est surement la nature même d'une GUI qui veut ça, dans le sens où se ne sont que des effets de bords.
Une autre question qui m'est apparue lié à ce sujet est la gestion de l'aspect "on empeche l'utilisateur de faire n'importe quoi".
Il y a toujours le moyen de gérer ça dans le GUI directement (exemple, je met sur ".setEnabled(false)" un bouton qu'il ne faut pas que l'utilisateur active à un certain moment.
Mais il serrait plus propre de faire quand même les vérifications dans la partie "algorithmique".
Que pensez vous de ce problème dans le cadre d'une discussion "sécurité du logiciel"?
Un autre problème : il m'arrive assez fréquemment d'écrire des programmes que je dois prouver. Ils sont prouvés soit à la main, soit à l'aide de l'Atelier B (et je dois donc me coltiner l'intégration d'une GUI sur un code C produit par l'atelier B à partir de ma spec et ma preuve).
Dans tous les cas, l'interface graphique vient perturber ma preuve.
Je peux foutre en l'air un programme qui doit être absolument fiable à cause d'un bouton que je n'ai pas remit sur ".enabled(true)".
Je me demandais comment pourrait être les API de création de GUI pour permettre :
1/ d'avoir le code de la GUI plus propre (moins d'effets "rustine")
2/ De concevoir une GUI n'ont plus comme un méchant machin à effet de bord, mais plus en terme fonctionnel. Le coté "effet de bord" ne devrait apparaitre qu'à la fin de la chaine, sans que le codeur de la GUI s'en préoccupe.
On pourrait peut-être envisager que une action sur un bouton ou un changement d'état soit une des sorties d'une fonction.
On pourrait aller plus loin et considérer que des fonctions livreraient le nouvel état d'un bouton en sortie, des fonctions "plus hautes" livreraient l'état d'une frame complète, et une fonction encore plus haute l'état de la GUI totale.
Un exemple, le créateur d'une GUI pourrait procéder ainsi :
let updateBoutonMachin = fun signal ->
match signal with
|... -> (resultat,nouveau_bouton)
|... -> (resultat2,nouveau_bouton2)
(* Calcule ce qu'il y a à calculer en fonction du signal, et renvoit le resultat et le nouvel état du bouton *)
;;
Bon, après je ne peux être plus précis sachant que je ne sais pas encore comment pourrait être représenté un bouton.
Dons l'updateFrame appellerait l'update sur tous les elements de la frame, l'updateGui sur toutes les frames de la GUI...
Et l'API de la GUI fournirait des fonctions du style :
'InitBouton = fun bouton'
Qui renvoit un bouton à partir d'un bouton "vierge"
Et une fonction
'SetHandler = fun ElementGraphique -> fun handler '
Qui permet d'associer un handler "UpdateBoutinMachin" au bouton en question.
Bref, je voudrais que l'état de la GUI soit plus "calculé"
3/ Pourquoi un état de la GUI plus calculé ?
Justement pour pouvoir plus facilement prouver que son état reste en permanence cohérent.
A l'heure actuelle, j'ai l'impression que de nombreux bugs d'applications ne sont que des bugs issu de la GUI, à cause d'un booléen pas remit en place.
Exemple, si l'utilisateur vient de sauvegarder, on le lui redemande pas immédiatement si il ferme l'appli.
Mais si après avoir refait une modif on a pas repensé à remettre le booléen "estSauvegarde" sur false, l'utilisateur va quitter sans que rien ne lui soit demandé.
Si l'état d'une GUI était moins "rustine un peu partout", il serait plus simple de prouver que "tant que la simulation est en cours, les boutons A, B et C sont dans tel état".
En fait, ce sont peut être aux assistants de preuve de programmes d'évoluer aussi.
Il faudrait qu'ils permettent plus facilement de manipuler des preuves sur des états d'éléments de GUI.
Voilà, je voulais vous faire part de cette reflexion et vous faire réagir dessus.
J'espère que les questions soulevées nous feront émerger de nouvelles idées.
A bientot