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

JavaScript Discussion :

Utilisation des getter/setter ES5 pour des tests null-safe et de la validation de type à la volée


Sujet :

JavaScript

  1. #21
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Ça a aussi été ma première idée, mais ça ne valide que les paramètres settés... S'il y a des paramètres obligatoires qui ne sont pas passés, comme joe.address.work.city, il n'y aura pas d'erreur déclenchée. Je suis donc obligé de valider tout mon modèle récursivement...

    N'hésite pas à bidouiller sur mon code, j'ai ouvert ce topic justement pour ça. Je pense que les getter/setter ont un potentiel encore non utilisé, et je suis très curieux de savoir ce qu'on est capable d'en faire.
    One Web to rule them all

  2. #22
    Invité
    Invité(e)
    Par défaut
    salut,

    il y a vows qui utilisent get pour créer une api plus 'expressive'.

    J'ai pas trop suivi la discussion, mais je trouve dommage de mêler null-safe et validation de données (ca fait un peu effet usine à gaz)

    et j'ajoute aussi que je trouve ca byzarre d'avoir un set qui peut créer un arbre dont le noeud parent au noeud setté est potentiellement invalide.

  3. #23
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Dans quel cas un noeud parent serait invalide ? Avec les exemples sur lesquels je travaille, valider un noeud parent revient à valider le type de ses propriétés, autrement dit ses noeuds enfants. Par exemple, le champ adresse.work est valide seulement s'il contient une propriété city de type String. Donc ces deux fonctionnalités ne viennent pas interférer a priori. Après je peux enlever le null-safe mais étant donné que c'était mon besoin initial...
    One Web to rule them all

  4. #24
    Invité
    Invité(e)
    Par défaut
    valider un noeud parent revient à valider le type de ses propriétés, autrement dit ses noeuds enfants
    tu n'avais pas la validation au début, du coup on pouvait avoir un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    address.[[null]].city = 'somestring'
    ou [[null]] est la valeur de work.

    effectivement, si tu mets une validation sur tout l'arbre alors on est assuré que le set laisse le résultat dans un état valide. (l'impression d'enfoncer une porte ouverte )

    Après je peux enlever le null-safe mais étant donné que c'était mon besoin initial..
    je dis pas de l'enlever, je dirais plutot de les découpler du genre qu'on puisse utiliser une validation sans avoir besoin d'un null safe.
    De toute façon, c'est un peu dommage, à chaque set, de faire une validation, et on devrait (enfin je préfère du moins) avoir controle de quand je fais ma validation.
    En ce sens, je m'amuse pas à redéfinir 'set' mais appel explicitement la validation.

    Le contraire est pas trop gênant vu que syntaxiquement ca change pas grand chose mais pour l'utilisateur qui fait $$$ comme moi, et qui veut utiliser null safe mais pas la validation parce qu'il aime pas comment elle est définie, ben c'est mieux si il peut utiliser null safe sans avoir l'autre composant.

    après rien n'empêche de proposer un interfacage entre null safe et validation
    un truc genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model = defineModel({}, Validation)
    où bien,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model = validateModel({}, NullSafe)

  5. #25
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Je pense que tu n'as pas compris le fonctionnement mis en place. Je ne valide pas les types sur tout l'arbre, je valide uniquement les feuilles. C'est pour ça que je ne vois pas comment un noeud parent pourrait être "invalide", puisqu'il n'y a pas de validation sur ces noeuds. Je pars du principe que lorsque des objets avec des propriétés typées sont utilisées dans le modèle, alors ces objets ont uniquement un rôle de namespace. On pourrait avoir address.work = ["machin","truc"], du moment que c'est un objet sur lequel on peut mettre nos propriétés typées. Ça serait complètement tordu, mais ça respecterait le modèle. Si tu veux empêcher ça, alors il faut typer address.work avec un modèle Address comme l'avait proposé lysandro.

    Le null-safe correspond à une seule ligne dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var wrapper = obj instanceof Object ? obj : Object.create(null);
    Si tu n'en veux pas, retire-la Je ne suis pas en train d'essayer de vous vendre un produit, je partage du code et chacun est libre d'expérimenter dessus et de l'adapter à sa façon.
    One Web to rule them all

  6. #26
    Invité
    Invité(e)
    Par défaut
    Je pars du principe que lorsque des objets avec des propriétés typées sont utilisées dans le modèle, alors ces objets ont uniquement un rôle de namespace.
    oook, au temps pour moi

    Je ne suis pas en train d'essayer de vous vendre un produit, je partage du code et chacun est libre d'expérimenter dessus et de l'adapter à sa façon.
    c'est pas une question de vendre, c'est juste que tu mets un effort dessus, et que ce que tu fais pourrais être utile à d'autre, du coup c'est un peu dommage que ce que tu fais ait un périmètre réduit parce que trop spécifique.
    Mais de toute façon, oui, chacun est libre, il n'y a pas de license

  7. #27
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    J'ai pas tout suivi, mais le problème de base m'a fait penser à cette lib

    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var myURL;
    if (app && app.config && app.config.environment && app.config.environment.buildURL) {
        myURL = app.config.environment.buildURL('dev');
    }
    La lib propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var myURL;
    if (Bro(app).doYouEven('config.environment.buildURL')) {
        myURL = app.config.environment.buildURL('dev');
    }
    Et pour la gestion d'exception, c'est énorme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Bro(object)
        .braceYourself('method.name')
        .hereComeTheErrors(function(e) {
            console.log('error ' + e + ' happened.');
        });

  8. #28
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Oui je me rappelle de cette lib, une bonne blague Mais ça souligne un problème de fond, que les autres langages n'ont pas totalement résolu selon moi (je pense à Groovy et son opérateur .?)
    One Web to rule them all

  9. #29
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    J'ai jamais compris l'existence d'un tel opérateur. Pour moi c'est un hack pour contourner la levée des NPE (NullPointerException)

  10. #30
    Invité
    Invité(e)
    Par défaut
    en coffee ca s'écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app?.config?.environment?.buildURL
    c'est pas tellement en hack lorsque tu considères que tu as des options (c'est plus du sucre syntaxique)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function serve(options){
      sugar = options?.withSugar || 'no'
      doubleDose = options?.withSugar?.quantity || 1
    }

  11. #31
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Oui CoffeeScript a repris la syntaxe de Groovy. Je partage le scepticisme de Kaamo: si on a besoin d'introduire un nouvel opérateur, alors c'est plutôt la levée d'exception qui serait à remettre en cause. Avec cette approche, il y a deux extrêmes qui apparaissent: ceux qui remplacent partout le "." par un "?." , et ceux qui utilisent try/catch pour prévenir ce type d'erreurs. D'après moi, ça aurait plus de sens que undefined soit un objet dont toutes les propriétés valent undefined. Enfin, on ne va pas réinventer un langage ici.

    Ça m'a donné une nouvelle idée de feature pour mes modèles, les paramètres par défaut. Je vais réfléchir à une syntaxe qui permettrait ça.
    One Web to rule them all

  12. #32
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Hello,

    J'ai continué à travailler sur ces expérimentations pour produire une bibliothèque grand public.
    Après un peu moins de deux mois de taf, voilà enfin le résultat : http://syllab.fr/projets/web/ObjectModel/

    Tous les problèmes précédemment évoqués ont été résolus, et plusieurs fonctionnalités ont été rajoutées.
    N'hésitez pas à la tester et à me dire ce que vous en pensez
    One Web to rule them all

  13. #33
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    super clair, et mention spéciale pour le site très clean et bien documenté.
    Mes remarques :
    - pourquoi avoir attaché Model à Object ? Je pense aux possibles risques de collisions plus tard. (même si les risques sont infimes.)
    - penses-tu publier cette lib sur bower / npm ?
    - remarque sur la forme : on ne dirait pas plutôt "Which browsers are supported ?" plutôt que "What" ?

    C'est vraiment intéressant pour ceux, comme moi, qui se passent d'un langage comme Coffee/TypeScript etc pour générer le JS. Je compte bien l'utiliser dans mes futurs projets

    edit : ok j'ai ma réponse à la remarque 1 ... pour l'héritage Function.Model

  14. #34
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Pour ta 1ère remarque, j'y ai réfléchi pas mal et je pense que rajouter des propriétés à Object, Function et Array présente un risque de collision suffisamment minime pour être négligé. Il n'existe aucune propriété commençant par une majuscule dans ces objets et rien ne présage que ça puisse changer. Et je trouve ça moins risqué que d'ajouter des variables globales. Au pire si ça dérange vraiment certains, ça peut être très simplement modifié dans le code et je compte de toute manière proposer une version modulaire UMD par la suite.

    Pour bower/npm, pourquoi pas si la lib a du succès.

    Si tu vois d'autres fautes d'anglais, n'hésitez pas à me les envoyer par MP. Il doit y en avoir un paquet
    One Web to rule them all

  15. #35
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Pour la gestion de types, tu auras un jour de la concurrence : Google SoundScript: faster OOP for JavaScript

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  16. #36
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Dart, AtScript et maintenant SoundScript. Un seul langage ne suffit pas à Google !

    Comme concurrents pour du JavaScript type-safe, je pense surtout à Flow et bien évidemment TypeScript.
    One Web to rule them all

  17. #37
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Ces concurrents font du type checking au moment de la compilation.
    Toi c'est au runtime, perso je préfère et ta syntaxe est beaucoup plus JavaScript friendly. J'ai l'impression de + maîtriser ce que je fais.

    J'ai vraiment du mal avec ces nouveaux langages qui transpilent en JS

  18. #38
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Tu vas être content, pour la prochaine version j'ai changé l'API en Model.Object au lieu de Object.Model. Ça fait un namespace global, mais j'ai prévu une version UMD pour ceux que ça dérange.
    One Web to rule them all

  19. #39
    Rédacteur/Modérateur

    Avatar de yahiko
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2013
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 1 423
    Points : 8 699
    Points
    8 699
    Billets dans le blog
    43
    Par défaut
    Je viens de découvrir ta lib SylvainPV. Pas mal

    Il ne manque plus qu'un linter pour faire de la validation statique et tu pourras concurrencer Google, Facebook et Microsoft
    Tutoriels et FAQ TypeScript

Discussions similaires

  1. Utilisation de l'api criteria pour des join
    Par hugo123 dans le forum JPA
    Réponses: 0
    Dernier message: 04/02/2011, 11h46
  2. Réponses: 1
    Dernier message: 31/12/2009, 14h31
  3. Inlining des getters / setters auto avec GCC?
    Par _skip dans le forum Débuter
    Réponses: 45
    Dernier message: 17/08/2009, 12h51
  4. [Template] Changer la génération des getter/setter
    Par anthyme dans le forum NetBeans
    Réponses: 2
    Dernier message: 05/07/2007, 09h26
  5. Réponses: 1
    Dernier message: 31/05/2007, 11h57

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