IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ada Discussion :

Comment faire un constructeur paramétré ?


Sujet :

Ada

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Comment faire un constructeur paramétré ?
    Bonjour, j'apprends doucement l'Ada, et j'ai un petit problèmes avec les constructeurs des classes.

    Enfin, d'après ce que j'ai compris, il n'y a pas de destructeur/destructeur en Ada.
    J'ai aussi vu qu'on pouvais avoir un constructeur et destructeur par defaut en utilisant Ada.Finalization.Controlled.

    Mais comment faire pour les classes ou je n'ai pas besoin d'un constructeur par défaut, mais d'un constructeur paramétré et obligatoire ?

    je pourrais faire une méthode init par exemple qui servirait à passer les paramètres obligatoires, mais je ne vois pas ce qui empêchera quelqu'un d'utiliser ma classe sans faire un init en premier, et donc d'avoir des résultats tout à fait incohérents, voir des erreurs, en utilisant une autre méthode en premier.

    Quelqu'un pour me guider ? Merci !

    edit: j'ai changé le titre, je m'étais planté.

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    J'ai aussi vu qu'on pouvais avoir un constructeur et destructeur par defaut en utilisant Ada.Finalization.Controlled.
    Oui, c'est ce qu'on appelle des types contrôlés. Ca permet d'avoir des fonctions appelée au moment de la création/destruction/affectation d'objets.

    Mais comment faire pour les classes ou je n'ai pas besoin d'un constructeur par défaut, mais d'un constructeur paramétré et obligatoire ?
    En fait, tu ne pourras pas avoir ce comportement. Ensuite tu peux le forcer à utiliser une de tes procédures pour initialiser un objet (en en faisant un type limité). De même si l'objet est une structure privée l'utilisateur ne peut pas y avoir accès et donc il sera obligé de passer par tes fonctions.

    Mais tu ne pourras pas forcer l'utilisation d'une méthode pour un objet au moment de sa construction (enfin si via les types controllés mais pas aussi finement que tu veux).

    Tu as le même problème en C, en Java, ... . C'est à l'utilisateur d'adopter les bonnes techniques de programmation : toujours utiliser un type qu'on a initialisé.

    Dans ce cas tu peux toujours faire un type controllé qui mettra un flag initialisé à faux au moment de la création du type. Ce flag sera mis à true dès que l'une des fonctions que tu voudras aura été appelée. Ensuite dans tes autres fonctions tu peux tester si l'objet a été initialisé, dans la négative tu plantes le programme en envoyant un message à l'utilisateur. Ca obligera donc l'utilisateur à faire appel à tes fonctions mais c'est quand même plutôt lourd à mettre en place.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par PRomu@ld Voir le message
    Tu as le même problème en C, en Java, ... . C'est à l'utilisateur d'adopter les bonnes techniques de programmation : toujours utiliser un type qu'on a initialisé.
    Effectivement il a le même problème en C. D'ailleurs du coup on se retrouve à utiliser le même style : on créé une structure, on l'initialise avec une méthode, on fait d'autres trucs dessus avec d'autres méthodes. Par contre je vois pas pourquoi tu dis ça pour le Java ? En java comme dans les autres langages objets que je connais (à part Ada, du coup) on peut definir un constructeur paramétré obligatoire, ce qui fait que quand on créé un objet, il est initialisé automatiquement, vu que c'est le seul moyen de créer l'objet ; et c'est la façon standard de créer des objets, donc ça n'effraie personne. En Ada, je me retrouve à devoir l'initialiser après coup, et je trouve ça un peu dangereux.

    Citation Envoyé par PRomu@ld Voir le message
    Dans ce cas tu peux toujours faire un type controllé qui mettra un flag initialisé à faux au moment de la création du type. Ce flag sera mis à true dès que l'une des fonctions que tu voudras aura été appelée. Ensuite dans tes autres fonctions tu peux tester si l'objet a été initialisé, dans la négative tu plantes le programme en envoyant un message à l'utilisateur. Ca obligera donc l'utilisateur à faire appel à tes fonctions mais c'est quand même plutôt lourd à mettre en place.
    Effectivement, ça va pour une ou deux classes, mais je trouve ça lourd pour toute une application.
    En fait, je retranscrit une de mes applis Java en Ada pour me faire la main avec la syntaxe. Bien sûr, je ne m'attends pas et je n'essaye pas d'avoir une correspondance parfaite du code, il faut bien tenir des spécificités du langage. Mais j'utilise énormément les constructeurs en java pour initialiser mes objets, et donc je me retrouve un peu perturbé en Ada...

    En fait, c'est quoi la bonne pratique pour initialiser ses objets en Ada? J'ai l'impression de passer à coté de quelque chose. Si il n'y a pas de constructeur, les gens font autrement sans se prendre le chou avec des techniques tordues j'imagine.
    Je pourrais très bien me faire ma méthode init pour tout mes objets, mais un codeur qui va passer dernière moi va t'il comprendre ma logique ? Y'a t'il des bonnes pratiques générales pour l'initialisation des objets ? Vous faites comment vous ?

    Merci

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Effectivement il a le même problème en C. D'ailleurs du coup on se retrouve à utiliser le même style : on créé une structure, on l'initialise avec une méthode, on fait d'autres trucs dessus avec d'autres méthodes. Par contre je vois pas pourquoi tu dis ça pour le Java ?
    C'est la même chose qu'en C++. Tu peux très bien déclarer un objet, ne pas faire de new dessus et quand même vouloir l'utiliser. C'est faux ça ne marche pas mais le langage te le permet. En ada/c/c++ c'est strictement pareil.

    Mais j'utilise énormément les constructeurs en java pour initialiser mes objets, et donc je me retrouve un peu perturbé en Ada...
    J'ai pour habitude d'avoir toujours des fonctions que j'appelle init qui me servent de constructeur, du coup, on retrouve le comportement des constructeurs.

    En gros au lieu d'avoir un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjet obj = new MonObjet() ;
    Tu écrits ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    obj : MonObjet := Init( ) ;
    C'est une pratique de programmation, à partir du moment où tu donnes un manuel pour utiliser ton code les utilisateurs le suivront.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par PRomu@ld Voir le message
    C'est la même chose qu'en C++. Tu peux très bien déclarer un objet, ne pas faire de new dessus et quand même vouloir l'utiliser. C'est faux ça ne marche pas mais le langage te le permet. En ada/c/c++ c'est strictement pareil.
    Hum je ne suis pas sûr de comprendre ce que tu veux dire ? En C++, si tu déclare un objet sans new comme :
    Ça appelle bien le constructeur par defaut, et tu peux l'utiliser tout de suite. On peut aussi faire
    Et ça appelle le (ou un des) constructeur paramétré, donc ta classe est bien initialisée dès la déclaration, automatiquement.

    Citation Envoyé par PRomu@ld Voir le message
    J'ai pour habitude d'avoir toujours des fonctions que j'appelle init qui me servent de constructeur, du coup, on retrouve le comportement des constructeurs.

    En gros au lieu d'avoir un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjet obj = new MonObjet() ;
    Tu écrits ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    obj : MonObjet := Init( ) ;
    C'est une pratique de programmation, à partir du moment où tu donnes un manuel pour utiliser ton code les utilisateurs le suivront.
    Ok merci, je crois que je vais faire comme ça

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Hum je ne suis pas sûr de comprendre ce que tu veux dire ? En C++, si tu déclare un objet sans new comme :
    En fait, je parlais plutôt de constructions de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MonObjet * obj ;
     
    obj->UneMethode() ;
    Ici on a pas construit obj et le langage te le permet. En fait il faut voir le problème dans l'utilisation d'objets sur la pile. (qui suivant les langages te permettent plus ou moins de contrôle).

    Pour résoudre un problème il te faudrait un langage qui t'oblige à construire et faire un appel au constructeur au moment de la déclaration.

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Ah ok, mais c'est un peu de la triche

    Le mec qui déclare un pointeur non initialisé et qui l'utilise directement ensuite, c'est forcement un débutant qui ne connais pas le langage, donc ça ne compte pas. Alors que le mec qui déclare un objet comme dans mes exemples, il peux s'attendre à ce que la classe soit utilisable tout de suite, vu qu'il sait que le constructeur a été appelé.
    Alors qu'en Ada, quand tu déclare un nouvel objet, il peut avoir été initialisé par un constructeur par defaut au besoin, mais si l'objet à besoin d'autre objets pour finir son utilisation, tu n'en sais rien.

    Enfin je vais faire de la même façon que toi je pense, c'était ma première idée, ça reste clair si on définit un constructeur du même nom sur toutes les classes.

    Je passe le sujet en résolu, mais si d'autres personnes veulent témoigner sur leurs façons de faire, n'hésitez pas

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Le mec qui déclare un pointeur non initialisé et qui l'utilise directement ensuite, c'est forcement un débutant qui ne connais pas le langage
    En fait pas forcément un débutant, ici tu as l'exemple simple d'un objet directement utilisé après être déclaré. Tu peux toujours imaginer qu'à force de passages en arguments de fonctions tu ne peux pas forcément savoir si l'objet a été initialisé. On est d'accord ça reste un extrême (quoique). Ce que je veux mettre en exergue, c'est que le langage ne prévoit rien pour pallier ce genre de problème.

    Alors qu'en Ada, quand tu déclare un nouvel objet, il peut avoir été initialisé par un constructeur par defaut au besoin, mais si l'objet à besoin d'autre objets pour finir son utilisation, tu n'en sais rien.
    En fait, tout utilisateur ada fait comme si le type était un type non contrôlé donc il sait qu'il doit faire appel à un constructeur ou une fonction qui fait office de constructeur. De toutes façons il suffit d'indiquer le comportement de ta classe dans un manuel et ça résout forcément le problème.

    Enfin je vais faire de la même façon que toi je pense, c'était ma première idée, ça reste clair si on définit un constructeur du même nom sur toutes les classes.
    Avec l'avantage d'ada sur C++ que le type de retour d'une fonction fait aussi parti de la signature de la fonction ce qui te permet de faire des trucs sympa du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function Init( X,Y,Z : float ) return T_Point ;
    function Init( X,Y,Z : float ) return T_Vector ;
     
    --
    pt : T_Point := Init( 0.0 , 1.0 , 2.0 ) ;
    ve : T_Vector := Init( 2.0 , 3.0 , 4.0 ) ;

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par PRomu@ld Voir le message
    En fait, tout utilisateur ada fait comme si le type était un type non contrôlé donc il sait qu'il doit faire appel à un constructeur ou une fonction qui fait office de constructeur. De toutes façons il suffit d'indiquer le comportement de ta classe dans un manuel et ça résout forcément le problème.
    Ouais c'est vrai... Je dois me prendre un peu trop la tête pour pas grand chose ^^
    Citation Envoyé par PRomu@ld Voir le message
    Avec l'avantage d'ada sur C++ que le type de retour d'une fonction fait aussi parti de la signature de la fonction ce qui te permet de faire des trucs sympa du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function Init( X,Y,Z : float ) return T_Point ;
    function Init( X,Y,Z : float ) return T_Vector ;
     
    --
    pt : T_Point := Init( 0.0 , 1.0 , 2.0 ) ;
    ve : T_Vector := Init( 2.0 , 3.0 , 4.0 ) ;
    Oui mais ça je dois renvoyer un pointeur (enfin, un access) pour ça non ? J'ai pas envie de jouer avec les pointeurs tant que je peux m'en passer, et surtout pas les rendre obligatoire sur toutes les classes !

  10. #10
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Oui mais ça je dois renvoyer un pointeur (enfin, un access) pour ça non ? J'ai pas envie de jouer avec les pointeurs tant que je peux m'en passer, et surtout pas les rendre obligatoire sur toutes les classes !
    Ben pourquoi ? T'es pas obligé de retourner un pointeur sauf si l'objet est tellement gros qu'il ne tient pas sur la pile mais c'est quand même pas toujours le cas, surtout dans le cas d'un vecteur.

  11. #11
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Oui mais ça je dois renvoyer un pointeur (enfin, un access) pour ça non ?
    Non, pas du tout.

    T'es pas obligé de retourner un pointeur sauf si l'objet est tellement gros qu'il ne tient pas sur la pile mais c'est quand même pas toujours le cas
    C'est pas le seul cas d'utilisation de pointeurs

  12. #12
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Ah mais je fais comment alors ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function Init( X,Y,Z : float ) return T_Point is
        Var: T_Point;
    begin
        Var.X := X;
        Var.Y := Y;
        Var.Z := Z;
        return Var;
    end Init;
    Un truc comme ça suffit ?

    Et si j'ai declaré le Var en tagged private, init va quand même connaitre les Var.X, y et Y parce que c'est dans le même package c'est ça ?

  13. #13
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Un truc comme ça suffit ?
    Et bien oui, je ne vois pas ce qui te pose problème . C'est une fonction comme une autre.

  14. #14
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Ouaip, mais c'est que je bosse sur tellement de langages en même temps que je m'y perd un peu à force C'est logique en y réfléchissant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/05/2012, 10h13
  2. Comment faire un delete paramétré ?
    Par leonidas34 dans le forum Développement de jobs
    Réponses: 13
    Dernier message: 04/05/2012, 09h57
  3. Comment faire un style paramétrable ?
    Par zoaax dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 15/01/2011, 18h52
  4. Réponses: 0
    Dernier message: 03/12/2007, 12h28
  5. [Rave] comment faire un état paramétré ?
    Par HRAICHI dans le forum Rave
    Réponses: 2
    Dernier message: 02/10/2003, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo