Initialisation dans le corps d'un paquetage
Thomas De Contes via Ada-france <[email protected]> Sat, 17 Apr 2021 22:45:56 +0200
| Newsgroups | gmane.comp.lang.ada.france |
|---|---|
| Message-ID | <[email protected]> |
Bonjour :-) J'ai eu l'échange suivant avec le précédent mainteneur de RAPID à propos de ce code : http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/src/tki/mcc_tki/mcc-msg.adb?revision=224&view=markup (Je me permet parce que j'ai cru comprendre que l'anglais est permis.) >>> What do you think about Initialization via "begin" at package body level ? >> Usually not a good idea. >> In the past we had problems with elaboration order if this is used a lot. >> Some programmers write the whole program just using elaborations, and that is definitely very problematic for code maintenance. >> Even if the compiler manages to find a valid elaboration order, the poor human usually cannot understand it, especially when bugs happen. >> >>> I like it because it avoids to have to call it from Rapid_Main. >> No, this was a conscious and purposeful decision due to problems in the past (see above) > > Thank you for your opinion :-) > > I understand that: > - Ada permits writing the whole program just using elaborations (I like this idea :-) ), > - But in fact it's not sure that it was a good idea to permit it, since ada's design does not permit to make it readable and maintainable. > > So, I think that it's possible to use this "feature" of ada, under conditions: > - To not abuse of it, and to use it only when the program's design indicate it, > - When there is several use of it, that the different units are independent, without dependancies between them, including external dependancies like via some files, > - To document a lot what is done (comments). > > Do you think that, under these conditions, you could agree to integrate it in the trunk, or do you definitely not accept it ? Il n'a pas donné de suite à ça. Un peu plus tard il m'a simplement dit : "I am not finding the time to adequately answer your questions." Donc, est ce que certains d'entre vous auraient à la fois le savoir, et le temps, pour/de me donner leur avis ? :-) Depuis, je me suis aperçu que le créateur de RAPID avait déjà utilisé cette "fonctionnalité" d'Ada (est ce le bon terme ?), dans mcc.tki.Container.Window pour appeler Gtk.Main.Init : http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/src/peers/Gtk/mcc-tki-container-window.adb?revision=224&view=markup Je trouve ça logique, d'après mes explications ci dessus, et ce que je trouverais le plus logique ça serais même que GtkAda s'en serve aussi pour qu'on n'ait même plus besoin, nous usagers, d'appeler Gtk.Main.Init ... Le problème qui se pose, par rapport à une de mes suggestions pour ne pas risquer les problèmes, c'est que mcc.Msg dépend de mcc.tki.Container.Window (via mcc.Common_Dialogs) Selon l'avis que vous aurez indiqué avant, si vous trouvez que ce n'est pas trop en dehors des clous, pourriez vous m'indiquer quelles seraient d'après vous les bonnes pratiques dans le domaine ? Par exemple, dans le but de garantir un ordre d'élaboration approprié, j'ai tenté un "pragma Elaborate_Body;" : http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/src/tki/mcc_tki/mcc-msg.ads?revision=224&view=markup Mais je ne suis pas du tout sur que ce soit ça qui convienne. D'après mes connissances du moment, j'ai la conviction qu'il est possible de coder proprement en utilisant l'initialisation dans le corps d'un paquetage, avec parcimonie et en prenant soin de faire les choses "bien comme il faut", pour éviter le plus possible les problèmes qu'il m'a indiqué ci dessus. Mais si je ne me trompe pas, ça sera mieux de faire comme ça plutot que de faire des procédures d'initialisation du genre Gtk.Main.Init, puisque dans ce cas, les utilisateurs peuvent ne pas appeler la procédure d'initialisation avant d'utiliser le paquetage. (En fait, il me semble que ça ne poserais pas de problème, si on avait les moyens de faire vérifier par le compilateur que la procédure d'initialisation est appelée suffisamment mais pas trop. Mais on ne le peut pas ...) 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 ... Et j'imagine qu'au niveau de la doc, le grand minimum c'est de mettre un commentaire dans la spécification indiquant que le corps contient une initialisation. D'ailleurs, pourquoi ne pas faire un Pragma obligatoire, pour forcer via le compilateur à avoir un minimum d'écrit dans la spécification ? Mais ça n'est peut-être pas la seule doc requise pour avoir le code le plus lisible possible ... À vos avis :-) -- 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