Re: Initialisation dans le corps d'un paquetage

Thomas De Contes via Ada-france <[email protected]> Mon, 13 Sep 2021 14:33:04 +0200
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>
Le 18 avr. 2021 à 16:25, Jean-Pierre Rosen via Ada-france a écrit :

> Le 17/04/2021 à 22:45, Thomas De Contes via Ada-france a écrit :
>> Le problème qu'il me reste c'est de savoir ce qu'est un usage "bien
>> comme il faut" et "pas comme il faut" de cette "fonctionnalité", en
>> sorte de pouvoir faire ...
> 
> Les instructions en corps de paquetage sont prévues pour initialiser le paquetage. L'idée est de permettre de ne pas avoir de procédure Init, dont on ne sait jamais qui doit l'appeler, ni ce qui se passe si on l'appelle deux fois. On peut voir ça comme une procédure Init appelée automatiquement une fois et une seule au démarrage du programme.

C'était bien mon avis :-)
(Si je te comprends bien, tu es d'accord avec moi que GtkAda aurait pu s'en servir pour éviter Gtk.Main.Init, et je devine que tu ne sais pas pour quelle raison ça a été fait comme ça simplement parce que c'est pas toi qui l'a fait ?)

> 
> Comme toute fonctionnalité, on peut en abuser... d'ailleurs rien n'empêcherait de mettre tout le programme dans une procédure Init également.

Dans une application graphique, c'est assez facile de trouver une justification pour mettre quasiment toute la procédure principale en initialisation,
mais à la réflexion, il y a, au minimum, l'appel au Loop qui serait clairement abusif !

> Je dirais qu'il y a abus si le corps du paquetage fait autre chose que d'initialiser l'état interne, mais on peut toujours trouver des exceptions.

Je crois deviner que dans le cas que j'ai présenté, qui fait des manipulations sur des fichiers donc "autre chose que d'initialiser l'état interne", tu considères ça comme une exception qui n'est pas un abus ?


Je crois avoir trouvé la méthode pour faire ce choix :

Quand on est tenté de faire une initialisation de paquetage,
la question à se poser c'est : existe-t-il une 3ème alternative que l'initialisation de paquetage et la procédure Init ?
- si oui, il vaut mieux préférer la 3ème alternative,
- si non, il vaut mieux préférer l'initialisation de paquetage que la procédure Init, et ça n'est pas un abus.

Que penses tu de cette méthode ? :-)




Le précédent mainteneur de RAPID a dit :

>>>> In the past we had problems with elaboration order if this is used a lot.

On pourrait documenter, dans les commentaires de la spécification, la liste des paquetages utilisés par l'initialisation de paquetage (peut-être seulement ceux qui font eux-mêmes de l'initialisation de paquetage ?).
Ainsi, on devrait pouvoir s'apercevoir d'une dépendance circulaire juste en lisant la spécification (et même au moment où on l'écrit), sans avoir besoin d'éplucher tout le code.

(J'envisage d'appliquer la même méthode de documentation pour signaler la présence de variables globales à l'intérieur des paquetages.
As tu un avis là dessus ?)


>>>> Even if the compiler manages to find a valid elaboration order, the poor human usually cannot understand it, especially when bugs happen.


Là par contre, il me faudrait un cas, parce que je ne visualise pas bien le problème concret qui serait posé.
(Mais si tu as l'habitude d'en faire sans avoir de problème, peut-être que tu ne peut pas m'éclairer et qu'il n'y a que lui qui pourrait me dire ...)



>> dans le but de garantir un ordre d'élaboration approprié, j'ai tenté un "pragma Elaborate_Body;"

Ça par contre c'était peut-être une bêtise : il se trouve probablement des cas où l'ordre d'élaboration requis est autre.


>> D'ailleurs, pourquoi ne pas faire un Pragma obligatoire, pour forcer via le compilateur à avoir un minimum d'écrit dans la spécification ?

D'ailleurs, il me semble que la norme autorise l'usage de tout Pragma non défini, donc si le compilateur en fait autant :
Peut-être qu'AdaControl pourrais faire ça ? ;-)


-- 
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/

_______________________________________________
Ada-france mailing list
[email protected]
https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france