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 :

Implémentation implicite d'interface


Sujet :

Dotnet

  1. #21
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par maa Voir le message
    Merci pour ces réponses lysiandad !

    J'espère quand même que les interfaces implicites seront dans le framework 4. Est-ce que la vidéo que vous avez vue présente toutes les nouveauté de ce framework ou est-ce que la liste n'est pas encore arrêtée ?
    [...]
    Hehe.. vous y tenez a vos interfaces implicites ! Mais... n'avez vous pas trouvé vous-même (et d'autres vous l'ont confirmé) des problèmes conceptuels / des ambiguités à votre souhait ?

    Je n'ai malheureusement pas d'info sur le framework 4 (si vous en trouvez, je suis interessé), mais... si vous-même pouvez proposer une solution a ces problèmes, il est possible qu'Anders soit interessé par votre idée... Contrairement a ce qu'on pourrait penser, ils sont peu a avoir la grosse tête a ce niveau chez MS, plateforme .NET... n'hesitez pas a tenter votre chance, alors.

    Mais bon... c'est pas des debutants, non plus, je suppose que si nous ne voyons toujours rien a ce propos, meme dans C omega, c'est que ce n'est pas exactement simple a implementer comme genre de fonctionnalité, a supposer que ce soit vraiment utile et orthogonal au reste du langage qui en est deja a sa version 4 (ou presque).

    My 2 cents... and 1/2

  2. #22
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Hehe.. vous y tenez a vos interfaces implicites ! Mais... n'avez vous pas trouvé vous-même (et d'autres vous l'ont confirmé) des problèmes conceptuels / des ambiguités à votre souhait ?
    Oui j'y tiens assez. C'est bien souvent que je suis obligé d'utiliser des dp adaptateur pour pallier à ce manque et je trouve cela lourd.
    Tu pense à des problèmes ou des ambiguïtés ? Je n'y ai pas énormément réfléchis encore.
    Je serais très heureux de discuter de tout cela. Ca serait encore mieux en direct, sur le chat (si tu as le temps et quand tu veux, j'y suis en ce moment).
    http://chat.developpez.com/

  3. #23
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Sauf erreur de ma part, vu que tu l'indiques dans ta signature, ce n'est pas justement une des fonctionnalités qu'apporte PostSharp ?

    Sinon tu peux aussi regarder LinFu :
    Injection d'interface

    Pour le fonds, je trouve que les interfaces explicites sont plutôts pratiques et que les interfaces implicites sont si pas inutiles très dangereuses.

    Le problème des interfaces est plutôt que comme il s'agit de définitions triviales, elles sont souvent créées à tort alors qu'à priori, dans la conception, elles sont avec l'héritage les deux points vitaux de la conception objet.

    En plus IMHO que sur la plupart des gros projets (grosse volumétrie de code); les interfaces explicites sont bien plus maintenables que les interfaces implicites. (Un peu comme le var d'ailleurs : l'idée est sympa, dans la réalité, on se retrouve souvent à pointer le var pour identifier le type...)

    L'avenir va vraiment être aux profilers...lol

  4. #24
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Je ne dis pas que les interfaces implicites devraient remplacer les interfaces explicites. Elles devraient être là en plus et ne devraient d'ailleurs jamais les remplacer. Leurs rôles seraient d'apporter au développeur toute la flexibilité d'un langage dynamique mais en ayant l'intellisens et éventuellement une vérification sur les types au moment de la compilation. C'est en cela qu'elle aurait, à mon sens, toute leur place dans le framework 4.
    Une interface implicite ne devrait jamais faire partie du framework. Il faut la voir plus comme un outil pour le développeur plutôt qu'un qualificatif pour une classe.
    J'ai repris un exemple de cet article en imaginant ce qu'on pourrait en faire avec des interfaces implicites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    public static void Main()
    {
        ExempleDynamic();
     
        Console.Read();
    }
     
    public implicit interface IResponsable //ne peut hériter que d'une ou plusieurs interfaces implicites et doit contenir au moins un membre. Aucune classe ne peut explicitement implémenter une interface implicite.
    {
    	string Nom { get; set; }
    	int Age { get; set; }
    	string Fonction { get; set; }
    }
     
    public class MembreDvp
    {
        public string Nom { get; set; }
        public int Age { get; set; }
    }
     
    public class ResponsableDvp : MembreDvp
    {
        public string Nom { get; set; }
        public int Age { get; set; }
        public string Fonction { get; set; }
    }
     
    public static void ExempleDynamic()
    {
        ResponsableDvp membreResponsableDvp = new ResponsableDvp() { Nom = "Jérôme", Age = 24, Fonction = "Responsable .NET" }; //implémente implicitement IResponsable
        Responsable membreResponsableDvp2 = new ResponsableDvp() { Nom = "Jérôme", Age = 22, Fonction = "Responsable C#" }; //n'implémente pas implicitement IResponsable mais l'implémentera à l'execution.
    	MembreDvp membreDvp = new MembreDvp() { Nom = "Benjamin", Age = 21 }; //n'implémente pas implicitement IResponsable
        dynamic membreDvpDynamic = new MembreDvp() { Nom = "Laurent", Age = 25, Fonction = "Responsable PHP" }; //implémente implicitement IResponsable
        var membreAutre = new { Sexe = 'M', Nom = "Louis", Age = 12, Fonction = "Responsable Java" }; // Objet anonyme - implémente implicitement IResponsable
     
        AfficherMembre(membreResponsableDvp); //compile
        AfficherMembre(membreResponsableDvp2); //ne compile pas
        AfficherMembre(membreDvp); //ne compile pas
        AfficherMembre(membreDvpDynamic);//compile
        AfficherMembre(membreAutre);//compile
     
    	//tout compile
        AfficherMembreDynamic(membreResponsableDvp); //s'exécutera correctement (early binding)
        AfficherMembreDynamic(membreResponsableDvp2); //s'exécutera correctement (late binding)
        AfficherMembreDynamic(membreDvp); //plantera
        AfficherMembreDynamic(membreDvpDynamic);//s'exécutera correctement (early binding)
        AfficherMembreDynamic(membreAutre);//s'exécutera correctement (early binding)
    }
     
    //accèpte tout types d'arguments et considère qu'ils sastisfont l'interface implicite donc propose l'intellisens.
    //le compilateur essaie d'abord de résoudre le type à la compilation. Si l'argument passé en paramètre ne satisfait pas l'interface alors le  binding est fait tardivement (comme n'importe quel objet dynamique).
    public static void AfficherMembreDynamic(dynamic IResponsable membre) 
    {
        Console.WriteLine("Le membre " + membre.Nom + " (" + membre.Fonction + ") est âgé de " + membre.Age + " ans");
    }
     
     //n'accèpte que les arguments qui sastisfont l'interface implicite.
    public static void AfficherMembre(IResponsable membre)
    {
        Console.WriteLine("Le membre " + membre.Nom + " (" + membre.Fonction + ") est âgé de " + membre.Age + " ans");
    }
    Pour ce qui est d'utiliser PostSharp, ça reste du bricolage et ça ne se marie pas avec le mot clé dynamic...

  5. #25
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    je vais prendre un coup mais ...

    Ca ne fait qu'être permissif au niveau de la conception objet.

    Je préfére 100 fois que le projet ne compile plus (notamment en collaboratif, ça empêche de 'checkiner' nawak)

    Je veux dire que si je dois développer dans un projet en utilisant le modèle de ton exemple, le problème n'est pas dans le framework, ni dans le langage, il est chez le concepteur.

    Est il ne prend pas en compte la cas où explicitement il n'aurai pas fallu justement être implicite.

    C'est une fois de plus un gain de productivité pour un développeur isolé, mais pour une logique collaborative, il vaut 100 fois "bricoler" en postsharp avec une personne qui maitrise éventuellement le tisseur que d'avoir 2 comportements complêtements différents pouvant être à loisir implémentés.

    Après ca reste mon avis, mais déjà que var nous a posé suffisamment de problème (ainsi que la fabuleuse ré introduction du goto..)

  6. #26
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Je rate peut etre quelque chose, mais pourquoi ne fais tu pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static void AfficherMembreDynamic(dynamic object membre) 
    {
        Console.WriteLine("Le membre " + membre.Nom + " (" + membre.Fonction + ") est âgé de " + membre.Age + " ans");
    }
    Parce que si l'interface ne te sert pas a typer tes objets, a quoi elle sert ?

    Et j'ai l'impression que les projets sur lesquels tu travailles t'imposent d'utiliser des objets qui se ressemblent mais sur lesquels tu n'as pas la main. Me trompe-je ?

    Ce que je crains, avec les avancées de DotNet telles que celles-ci, c'est que bien qu'elles se justifient complètement d'un point de vue pratique (cf l'interrop Office), c'est un travers de plus dans lequel vont s'engouffrer des wagons de juniors / mauvais developpeurs, qui risquent de ne pas l'utiliser a bon escient. Le refactoring s'annonce de plus en plus difficile

  7. #27
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Je rate peut etre quelque chose, mais pourquoi ne fais tu pas
    Code :

    public static void AfficherMembreDynamic(dynamic object membre)
    {
    Console.WriteLine("Le membre " + membre.Nom + " (" + membre.Fonction + ") est âgé de " + membre.Age + " ans");
    }
    Ce que je propose permet la même souplesse, mais est plus rigoureux car il permet de se passer du mot clé dynamic dans le cas ou l'instance passée en paramètre a été déclarée dans un type qui implémente effectivement l'interface. Dans le cas où l'implémentation ne peut être déduite à la compilation, la résolution devra être faite à l'exécution comme dans l'exemple que tu donne, mais on aura toujours l'intellisens dans l'IDE.
    En bref, l'interface implicite apporte toute la flexibilité de ton exemple dynamique mais en restant au maximum dans le early binding et en offrant en plus l'intellisens.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/09/2008, 14h48
  2. Réponses: 3
    Dernier message: 08/06/2007, 09h50
  3. Deux implémentations pour une interface
    Par apqmwnqmap dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 09/05/2007, 15h21
  4. Liste des implémentations d'une interface
    Par YokoSop dans le forum Langage
    Réponses: 12
    Dernier message: 07/07/2006, 23h37
  5. Réponses: 5
    Dernier message: 23/02/2006, 00h34

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