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

Dotnet Discussion :

C# s'enrichit d'un safe navigator operator


Sujet :

Dotnet

  1. #21
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Points : 2 137
    Points
    2 137
    Par défaut
    Citation Envoyé par Derf59 Voir le message
    Ex : Est ce que l'opérateur fonctionne aussi avec des méthodes ?
    societe?.getSalarie(1)?.getNom() ou societe?.getSalarie(1)?.nom
    Dans la mesure où en C#, les propriétés abstraient l'implémentation des méthodes SetQuelquechose et GetQuelquechose, j'aurais tendance à dire oui.

    ton code java ressemblerait à ça en C# :
    societe?.Salarie[1]?.Nom (ou Nom est une propriété, et donc intrinsèquement, un appel de méthode).
    Le WIP de The last bastion, mon projet de jeu-vidéo (un TD en 3D)

    Mon portfolio / Ma page fb

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2010
    Messages : 39
    Points : 54
    Points
    54
    Par défaut
    Pour moi c'est une solution bancal pour un problème mal identifié.

    Le vrai problème n'est pas dans une chaine A.B.C.D.E qui peut provoquer une erreur liée à une référence nulle.
    Au delà du fait que si une ligne comme la précédente est vraiment nécessaire, faut peut être revoir l'architecture du projet, le vrai problème ce situe dans la gestion des instanciations en .Net qui est complètement insuffisante pour des projets complexes.

    Vu comme çà, la solution serait plutôt un opérateur de Cardinalité avec une modification de l'instanciation pour mieux gérer çà (avec des contrat de code par exemple)

    Exemple d'opérateurs de cardinalité:
    - Dim Nullable? as MonObject: Cardinalité = 0 ou 1 => Nullable
    - Dim NotNullable as MonObject: Cardinalité = 1 => Not Nullable (en .Net c'est l'inverse)
    - Dim Plusieurs* as MonObject: Cardinalité = 0 à l'infini
    - Dim 1Minimum+ as MonObject: Cardinalité = de 1 à l'infini

    On remarque tout de suite les contrats de code possible pour que le compilateur puisse géré çà tranquillement.
    On remarque aussi que l'instanciation par défaut du .Net ne convient plus.
    En bonus, on obtient une définition plus pratique des contrats sur les tableaux et notamment sur leurs dimensions avec les contrats qui vont bien.
    Si en plus ces opérateurs sont sur-chargeables, ont peut s'en servir pour créer des fabriques directement en code voir même des patterns de composition pour les regex ou autre idée folle du genre .

    Enfin moi je dis çà, je dis rien hein

  3. #23
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par OsoNet Voir le message
    Pour moi c'est une solution bancal pour un problème mal identifié.
    D'un côté je trouve le fond de ton commentaire pertinent, de l'autre je trouve sa formulation beaucoup trop légère.

    * A l'époque où Java et C# ont été introduits ils ajoutaient déjà beaucoup d'innovations. Difficile de leur reprocher de ne pas avoir été encore plus loin.

    * Le problème est loin d'être trivial (contrairement à l'impression que tu donnes) et je parie qu'un tel système de types n'est pas accompli sans compromis. Notamment je n'ai jamais travaillé avec un langage incluant l'information de nullité dans le système de types mais cela pose tout un tas de problèmes à résoudre, du marshalling jusqu'aux tableaux. J'aimerais en faire l'expérience mais je me demande si c'est vraiment appréciable au quotidien. Car toutes les initialisations par simple mise à zéro doivent être prohibées pour les types non-nullables et donc tout doit être explicite, ce qui peut peut-être devenir fastidieux. Peut-être pas plus que les tests de nullité en série, certes, mais pas forcément moins non plus.

    A priori ça m'a toujours semblé être une bonne idée. Mais de là à prendre les choses de haut à base de "y a qu'à"...

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2010
    Messages : 39
    Points : 54
    Points
    54
    Par défaut
    DonQuiche, je suis entièrement d'accord avec toi, seulement le sujet est vraiment complexe et donc très difficile à résumer dans un simple commentaire.

    Loin de moi l'idée de prendre les choses de haut, j'aime bien le .Net, mais j'aime bien aussi garder l'esprit critique.

    Le principal problème du .Net n'est pas son état actuel ou les raisons qui ont poussées à ce résultat, mais le manque de liberté et d'ouverture limitant son évolution (les mauvaises fermetures du .Net m'exaspère car elles empêchent les évolutions libres ou expérimentale de la plateforme). Quand on gratte un peu sur le sujet en .Net on se retrouve bloqué par le système de type fermé et non extensible du .Net (comme souvent en .Net, y a toujours un Friend ou Internal en C# qui bloque tout) et ce n'est qu'un exemple parmi tant d'autre.

    Tout cela mériterait un article à part entière tout comme le problème et la solution (si il s'agit vraiment d'une solution, ce qui reste à confirmer) soulever ici.

    Moi aussi j'aimerais expérimenter mes idées (celle présentée ici n'est qu'une idée parmi tant d'autres) hélas en .Net aucune n'est possible donc j'en suis arriver au point de faire mon propre langage pour les expérimenter et c'est vraiment dommage d'en arriver là pour d'obscure raison...
    Je m'arrête là je pourrais en écrire des tonnes sur ce sujet.

    Le côté trivial à toutefois du bon puisqu'il permet aux gens de prendre l'idée de cardinalité exprimée dans mon message comme une idée et non comme une solution miracle (du moins je crois).
    J'espère en passant que cela t'aura permis à toi et aux autres lecteurs de réfléchir au problème sous un autre angle, c'était le but principal.

    Sur ce ++ et bonne continuation.

  5. #25
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par OsoNet Voir le message
    J'espère en passant que cela t'aura permis à toi et aux autres lecteurs de réfléchir au problème sous un autre angle, c'était le but principal.
    Rassure-toi en ce qui me concerne ça fait un bail que j'explore ces problèmes. Tu n'es pas le seul à déplorer le système de types de C# et avoir tenté de le modifier, nous partageons une passion en commun.
    Au passage M#, le futur langage système de MS, intègrera la nullité dans son système de types.

  6. #26
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2010
    Messages : 39
    Points : 54
    Points
    54
    Par défaut
    Comme quoi les grands esprits se rencontrent

    Je me suis pris tellement la tête sur les trucs de MS et j'en ai tellement marre de leur baratin, que je ne compte plus sur eux pour trouver la solution aux problèmes qu'ils apportent.

    Sauf si ils se reprennent en main, pour moi l'avenir se fera sans eux.

    Mais bon c'est mon côté radical, je ne suis pas forcément un exemple à suivre

  7. #27
    Membre chevronné

    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2004
    Messages : 758
    Points : 2 084
    Points
    2 084
    Par défaut
    Citation Envoyé par OsoNet Voir le message
    Quand on gratte un peu sur le sujet en .Net on se retrouve bloqué par le système de type fermé et non extensible du .Net (comme souvent en .Net, y a toujours un Friend ou Internal en C# qui bloque tout) et ce n'est qu'un exemple parmi tant d'autre.
    Aaaah merci. Entièrement d'accord. Ce système d'Internal ou tout empêchement d'héritage m'a toujours semblé incroyable, à l'opposé complet des principes de POO et d'ouverture de code.
    Quand je l'avais signalé il y a de nombreuses années, venant de passer du Java au DotNet, on m'avait dit que c'était "normal" et "nécessaire".

    Bref, entièrement d'accord avec vous sur ce sujet.

    Par contre, la notion de surcharge d'opérateurs est pour moi quelque chose que j'éviterais le plus possible dans un langage, où on en arriverait rapidement à ne plus savoir ce qu'un "+" ou un "." font dans un code, sans des recherches approfondies...

  8. #28
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 122
    Points : 2 235
    Points
    2 235
    Par défaut
    Citation Envoyé par Derf59 Voir le message
    Pour moi c'est une abérration, je m'explique :

    Si l'on écrit
    var g1 = parent?.child1?.child2?.child3;

    et qu'on imagine fonctionnellement que la valeur [null] est une valeur possible de child3 mais une valeur qui ne devrait pas arriver sur les parent/child1/child2,
    ce type d'affectation masque complétement le problème.

    var g1 = parent?.child1?.child2?.child3;
    if (g1 != null)
    ...
    Non non, du tout, ce type d'affectation, comme tu dis, a été clairement annoncé comme inadapté à ce cas précis, qui reste à devoir être codé par
    if (parent==null){throw new exception("Erreur : parent nul");}
    if (child1==null){throw new exception("Erreur : child1 nul");}
    if (child2==null){throw new exception("Erreur : child2 nul");}
    var g1 = parent.child1.child2.child3;

    Mais c'est un parapluie supplémentaire, car ces contrôles devraient être faits dans les constructeurs.

    Un nouvel opérateur n'empêche pas de lire les docs : son utilisation est réservée au cas où parent, child1, child2, peuvent être nuls, pour détecter que c'est le cas de l'un d'eux indifféremment.

    Du moment qu'on réserve le nouvel opérateur à l'utilisation qui en a été présentée, plutôt qu'à faire des bêtises avec, il faut bien reconnaître qu'il apporte un progrès net en lisibilité du code, par rapport aux cinq lignes citées dans la présentation.

Discussions similaires

  1. Réponses: 17
    Dernier message: 13/10/2008, 10h45
  2. [C#] Bakckground Worker et operations Thread Safe
    Par xtream dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/09/2006, 01h20
  3. [JSP][Barre de navigation] Gestion du bouton precedent
    Par lando dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 09/09/2003, 16h18
  4. Bouton de navigation
    Par thierry sache dans le forum Flash
    Réponses: 2
    Dernier message: 17/12/2002, 11h43
  5. Source Safe -> VC++
    Par Emilio dans le forum MFC
    Réponses: 7
    Dernier message: 07/11/2002, 15h57

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