Discussion:
au sujet des types à échelle de classe
(trop ancien pour répondre)
Mehdi Saada
2018-03-18 01:32:50 UTC
Permalink
Il y a quelque chose que j'ai mal compris au sujet des types à échelle de classe.
Je pensais qu'ils pouvaient s'employer comme paramètres formels dans deux cas:
avec procedure FOO (objet: in objet_type);
dans ce cas il y a dispatching,
et procedure FOO(Objet: objet_type'Class);
et dans ce cas il n'y a pas de dispatching, mais ça n'acceptera que les objets dont le type est OBJET_TYPE'CLass.

Mais dans Ada 95 the craft of object oriented programming:
Je vois ces exemples:
voilà le profil d'un sous-programme:
procedure PARSE (SYNTAX: in EXPRESSION_TYPE; EXPR: in STRING; FROM: in out POSITIVE; PRIO: in PRIORITY_TYPE; RESULT: out INTEGER; NEXT: in out TOKEN_POINTER);

Mais il est appelé ainsi:
Parse (Expression_Type'Class (Syntax), Expr, From, Priority_Type'Last, Result, Next);

Le type de Syntax est EXPRESSION_TYPE.
Quelle différence cela fait-il sans cette conversion ?
J-P. Rosen
2018-03-18 09:40:41 UTC
Permalink
Post by Mehdi Saada
Il y a quelque chose que j'ai mal compris au sujet des types à échelle de classe.
avec procedure FOO (objet: in objet_type);
dans ce cas il y a dispatching,
et procedure FOO(Objet: objet_type'Class);
et dans ce cas il n'y a pas de dispatching, mais ça n'acceptera que les objets dont le type est OBJET_TYPE'CLass.
procedure PARSE (SYNTAX: in EXPRESSION_TYPE; EXPR: in STRING; FROM: in out POSITIVE; PRIO: in PRIORITY_TYPE; RESULT: out INTEGER; NEXT: in out TOKEN_POINTER);
Parse (Expression_Type'Class (Syntax), Expr, From, Priority_Type'Last, Result, Next);
Le type de Syntax est EXPRESSION_TYPE.
Quelle différence cela fait-il sans cette conversion ?
1) Il faut bien comprendre que T'Class est un type différent de T, mais
dont les valeurs sont les valeurs de T et de tous les types dérivés de T.

2) Dans un appel, c'est le type de la valeur qui détermine (en cas de
surcharge) quel est le sous-programme appelé. Si ce type est
déterminable statiquement, c'est une simple résolution de surcharge. Si
le type n'est pas connu statiquement (cas d'une valeur de T'Class),
alors on va voir le tag qui détermine le type, donc le sous-programme
appelé: il y a liaison dynamique.

Convertir une valeur vers T'class a donc comme effet de forcer une
liaison dynamique => redispatching. C'est utile par exemple dans une
opération héritée, où le type vu statiquement peut être un ancètre du
type de l'objet effectivement passé.
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
Mehdi Saada
2018-03-18 12:27:35 UTC
Permalink
Convertir une valeur vers T'class a donc comme effet de forcer une liaison dynamique => redispatching. C'est utile par exemple dans une opération héritée, où le type vu statiquement peut être un ancètre du type de l'objet effectivement passé.
En effet, le type de SYNTAX est statique. Donc le convertir en 'Class, permet à tout enfant de sa classe, d'être tout de même passer à un sous-programme de son parent, quand le type lui-même n'a pas supplanter (traduction d'"overriding") de sous-programme abstrait hérité ?

Dans mon cas concret, je ne vois que ça.
Imaginons que je défini
type SYNTAXE_POLYNOME is new EXPRESSION_TYPE with null record;
et POLYNOME: SYNTAXE_POLYNOME;
SYNTAXE_POLYNOME va hériter de Parse, méthode concrète, alors quel intérêt de forcer un redispatching en passant EXPRESSION_TYPE'Class(POLYNOME) au lieu de POLYNOME ?
Le seul intérêt que je vois, si j'ai bien compris, est si Parse serait abstrait et n'aurait pas été supplanté (trad. littérale de "overriding"), alors appelé Parse avec un objet de type Expression_Type'Class aurait pour effet d'appeler Expression_Type.Parse.
Mehdi Saada
2018-03-18 12:34:58 UTC
Permalink
Je m'en vais bûcher https://en.wikibooks.org/wiki/Ada_Programming/Object_Orientation et je reviendrai (probablement à la charge après).
J'ai l'impression vague que ce passage
type Root is tagged private;
procedure Op1 (This: Root);
procedure Op2 (This: Root);
type Derived is new Root with private;
-- Derived inherits Op1
overriding procedure Op2 (This: Derived);

procedure Op1 (This: Root) is
begin
...
Op2 (This); -- not redispatching
Op2 (Root'Class (This)); -- redispatching
This.Op2; -- not redispatching (new syntax since Ada 2005)
(Root'Class (This)).Op2; -- redispatching (new syntax since Ada 2005)
...
end Op1;

a un rapport avec ma question... Bon, je connaissais la syntaxe de l'OO en Ada, mais j'ignore encore largement les PRATIQUES de l'OO. Lecture en perspective.
Mehdi Saada
2018-03-18 16:29:31 UTC
Permalink
J'ai compris. La documentation du wikibook a été extrêmement utile. Et celle d'Adahome, pour ce qui est des pratiques. ce serait une bonne chose de la mettre à jour pour couvrir les nouvelles interfaces limited, synchronized, task et protected. J'ai lu que la POO n'est toujours pas très utilisée (relativement) avec les types protégés/tâche, mais ça vient peut-être parce que peu d'exemples avancés et réels sont disponibles. En tout cas si ils existent ils ne sont apparemment pas référencés aux endroits les plus évidents à chercher.
J'ai appris l'utilisation du Rosen trick aussi... on a du vous le dire très souvent, je vais le répéter: très élégant, surtout avec Implicit_Dereference.
J-P. Rosen
2018-03-19 06:56:13 UTC
Permalink
Post by Mehdi Saada
Et celle d'Adahome, pour ce qui est des pratiques. ce serait une
bonne chose de la mettre à jour pour couvrir les nouvelles interfaces
limited, synchronized, task et protected.
Il faut absolument éviter AdaHome. Kempe (le propriétaire du site) n'y a
pas touché depuis des dizaines d'années, mais il renouvelle
régulièrement le domaine. Il a refusé toutes les offres qui lui ont été
faites de l'aider à mettre son site à jour (il reste bloqué à Ada95, et
la plupart de ses infos sont obsolètes), plus quelques bagarres sur des
copyrights qui ont été très mal vus par la communauté du libre...

Donc ne pas contribuer à son score google.
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
Mehdi Saada
2018-03-19 10:56:02 UTC
Permalink
Ah ?! C'est la meilleure ça ! Franchement, comme si on avait besoin de târés comme celui-là qui nous tire dans les pattes dans le petit monde des Ada-istes.
Et AdaPower, même problème ? Il est tout autant dépassé... Et tous les autres tutoriels qu'on peut trouver. Je sais que c'est du boulot, mais on pourrait en choisir un, puis le compléter. Il n'y a que l'embarras du choix.
J-P. Rosen
2018-03-19 11:55:53 UTC
Permalink
Post by Mehdi Saada
Et AdaPower, même problème ?
Non, AdaPower est tenu par David Botton, mais il est très occupé par
Gnoga, donc peut-être que son site est un peu en retard... Mais je suis
sûr qu'il serait très heureux d'avoir des contributions.
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
Continuer la lecture sur narkive:
Loading...