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

Langages de programmation Discussion :

Pourquoi dans les langages à Object ne peut on pas créer des classes à la volée?


Sujet :

Langages de programmation

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Points : 1 361
    Points
    1 361
    Par défaut Pourquoi dans les langages à Object ne peut on pas créer des classes à la volée?
    Bonjour,

    J'ai une question sur la POO et notamment la fabrication de classes à la volée. Je m'explique.

    En java, jaxb notamment, je prends un fichier XML qui contient des données, et jaxb génère des classes ainsi que de quoi lire le document. Java permet en revanche de lire les informations d'une classe, et d'appeler des méthodes existantes.

    En c++, c'est encore plus basique: introspection sans boost ou camp, que nenni. Pas de classe Class, pas d'équivalent d'object.

    Ce qui me parait pertinent, pour reprendre la problématique du jaxb XML, ce serait d'avoir, dans un langage OO, la possibilité d'écrire çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // je fabrique dans mon code une classe personne
    MetaClass metaClass("Personne");
    // j'ajoute deux champs, name et age
    metaClass.add("name",Types.String);
    metaClass.add("age",Types.Integer);
    // je fabrique la classe associée
    Class classPersonne = metaClass.make();
    // je peux créer une instance de cette classe
    Personne p = classPersonne.newInstance();
    Là, on ne fabrique qu'un conteneur un peu idiot. Mais c'est pour illustrer le principe. Mes questions:
    - existe t'il un langage OO qui permette de créer un type à la volée?
    - est ce que ce genre de possibilité vous paraitrait utile?
    - si oui, pourquoi, à votre avis, cela n'existe pas / n'est pas encore connu?

    J'ai des pistes:
    - utiliser et compiler du code généré comme çà, comment faire?

    Merci pour vos réponses
    les raisonnables ont duré, les passionné-e-s ont vécu

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 79
    Points : 152
    Points
    152
    Par défaut
    PHP le permet via la fonction eval(). C'est juste affreux et pas du tout recommandé, mais a priori ça fonctionne. Par contre la classe ainsi défini n'existera que dans le scope dans lequel est exécuté la fonction eval().

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Points : 1 361
    Points
    1 361
    Par défaut
    Citation Envoyé par OlgarK Voir le message
    PHP le permet via la fonction eval(). C'est juste affreux et pas du tout recommandé, mais a priori ça fonctionne.
    Merci de ta réponse. J'ai cru lire que le pb avec celle ci, c'est avant tout la sécurité. Pourrais tu développer le "c'est juste affreux", s'il te plait?
    les raisonnables ont duré, les passionné-e-s ont vécu

  4. #4
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 79
    Points : 152
    Points
    152
    Par défaut
    C'est affreux parce que ça revient à définir ta classe sous forme de texte et ensuite à en exécuter le code pour créer la classe.
    Ce n'est pas recommandé parce que de manière générale la fonction eval() ne l'est pas.
    Au niveau sécurité, ici ça ne pose pas réellement de problème parce que si j'ai bien compris ton besoin, rien de ce qui sera exécuté dans eval() ne provient de l'utilisateur.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Points : 1 361
    Points
    1 361
    Par défaut
    Citation Envoyé par OlgarK Voir le message
    C'est affreux parce que ça revient à définir ta classe sous forme de texte et ensuite à en exécuter le code pour créer la classe.
    Précisément, c'est cette partie qui m'échappe. Cà ne me parait pas affreux, ou en tous cas pas toujours. Dans le cas de PHP pour un projet web, je ne sais pas, je veux bien te croire. Je te donne deux exemples où je ne sais pas faire autrement (sauf à en chier avec un système ad hoc):

    Quand tu interprètes du code écrit dans un DSL:

    Genre un moteur de règles, mais çà marche pour tout langage plus haut niveau que ce en quoi tu codes ton appli:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    declare PERSONNE 
      name : string
      age : integer
    end
    
    rule "si tu es trop jeune pour boire, je te crie dessus"
    when
       Personne( age < 18)
    then
      print ("OH LALA, lache cette bouteille!!! Garnement");
    end
    Deuxième cas, voisin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml?>
    <personne>
      <name>Toto</name>
      <age>18</age>
    </personne>
    Ce serait super bien de disposer d'une classe Personne sans passer par:
    - définir un fichier de conf pour dire où tu vas générer tes sources
    - générer tes sources
    - lancer une compilation histoire de vérifier que tout est en ordre
    - en java, inclure tes sources dans ton classpath

    Est ce que tu vois ce que je veux dire?
    Penses tu toujours que ce soit abominable de prendre du texte pour en faire des classes?


    Merci
    les raisonnables ont duré, les passionné-e-s ont vécu

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    .Net permet de créer des classes, avec les classes du namespace System.Reflection.Emit.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Points : 1 361
    Points
    1 361
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    .Net permet de créer des classes, avec les classes du namespace System.Reflection.Emit.
    Merci beaucoup pour ta réponse

    Est ce que pour toi la pratique a un sens?
    Comme deux langages connus et réputés l'autorisent, peut on dire que c'est une idée utile?
    les raisonnables ont duré, les passionné-e-s ont vécu

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça a son avantage dans tout ce qui concerne les accès aux bases de données si on veut un minimum de performance: On utilise l'introspection et la génération une fois pour créer des classes qui font le mapping, plutôt que d'avoir à utiliser l'introspection sur chaque objet à chaque chargement.

    Bien sûr, certains langages n'ont pas d'introspection du tout, notamment C++ standard qui a seulement la RTTI.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Points : 1 361
    Points
    1 361
    Par défaut
    Merci. C'est résolu!
    les raisonnables ont duré, les passionné-e-s ont vécu

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 138
    Points : 120
    Points
    120
    Par défaut
    Il existe des langages qui permette de créer des "classes" à la volé. C'est des langages objets sans classe. Les plus connus sont les langages à prototypes (Self, Javascript).

    Dans ces langages, tu as une syntaxe de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet.appelDeMethode()
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet.valeur=MonObjet2.valeur
    Je problème de ces langages, c'est qu'il n'y a pas de typage fort, et qu'il est très facile de se tromper. Par exemple, :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    objet1.var=5
    objet2.attribut=objet1.vor
    Et la, sur la deuxieme ligne, le langage ne voie pas qu'il y a une erreur de syntaxe et que vor n'a pas été défini.

    Il existe d'autres langages un peu bizard comme cela (Python, smallTalk, etc...)

    Bon courage si tu veux te lancer dans ce périple.

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

Discussions similaires

  1. structures de données dans les langages
    Par wafiwafi dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 25/07/2013, 14h55
  2. Perdu dans les langages
    Par ßories dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 29/10/2010, 17h31
  3. Réponses: 3
    Dernier message: 24/04/2010, 12h29
  4. Implémentation d'OCL dans les langages de programmation
    Par Tristan Zwingelstein dans le forum UML
    Réponses: 8
    Dernier message: 18/01/2010, 21h02

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