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

Java Discussion :

[POO] implémenter des interfaces, la bonne pratique


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2022
    Messages : 10
    Points : 9
    Points
    9
    Par défaut [POO] implémenter des interfaces, la bonne pratique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    interfaceA {
       f1()
       f2()
    }
     
    class service1 implements interfaceA<modelX> {
       @override
       f1() { ... }
     
       @override
       f2() { ... }
    }
    plusieurs classes (service1, service2...) existe sur la meme classe avec divers model


    disons que je veux uniquement pour service1 ajouter une fonction f3, j'hesite entre 2 façons car les 2 fonctionnent :

    (1)

    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
     
    interfaceA {
       f1()
       f2()
    }
     
    class service1 implements interfaceA<modelX> {
       @override
       f1() { ... }
     
       @override
       f2() { ... }
     
       f3() { ... }      // pas d'override
    }
    (2)

    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
     
    interfaceA {
       f1()
       f2()
    }
     
    interfaceF3 {
       f3()   
    }
     
    class service1 implements interfaceA<modelX>, interfaceF3  {
       @override
       f1() { ... }
     
       @override
       f2() { ... }
     
       @override
       f3() { ... }     
    }


    en terme de bonne pratique (1) ou (2) ?

    plusieurs avis si possible !

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ben là on entre dans les cas où les avis divergent.

    En principe (1) n'est pas spécialement mauvais.


    Mais on pourra préférer le principe de toujours programmer par interface. Du coup, (2) ? Beeeeen, (2) peut aller dans certains cas, mais dans le cas général :

    tu vas l'assigner à quelle variable, ton objet de classe service1 ? Il faut que ce soit une variable sur laquelle on peut appeler f1(), f2(), et f3(). Du coup elle sera de quel type ? service1 ? C'est pas programmer par interface, ça.
    Les solutions dépendent d'un peu tout :

    - f3() a-t-elle vraiment besoin, ou est-ce vraiment très logique, de faire partie du même service que f1() et f2() ? (Si non, un autre service semble plus logique)
    - Tu pourrais avoir besoin de définir une nouvelle interface, InterfaceAF3, qui hérite de interfaceA et de interfaceF3.
    - Tu pourrais enlever interfaceF3 et créer directement InterfaceAF3 qui hérite de interfaceA et qui ajoute f3().
    - Pas impossible que programmer par interface ne soit pas vraiment utile dans ton cas, il faut voir.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 89
    Points : 102
    Points
    102
    Par défaut
    et dans ce cas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    interfaceA {
       speed()
       conso()
    }
     
    class service1 implements interfaceA<Car> {
       @override
       speed() { ... }
     
       @override
       conso() { ... }
    }
    par exemple service1 on implémente avec plusieurs type de vehicule: car,airplane, boat
    pour car on veut ajouter une fonction capacity() pour la batterie

    (1) ou (2) ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    On ne peut pas utiliser les génériques pour un cas de ce genre.

    Ou alors il faut gruger de manière assez sale, genre avec des UnsupportedOperationException quand le programmeur appelle des combinaisons qui ne marchent pas. Vu qu'on parle de meilleures pratiques, c'est à éviter.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    ok et sans les génériques ?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    ....... Ben sans les génériques ça peut pas être <Car>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Il y a aussi la possibilité de créer une InterfaceB qui étend InterfaceA, y ajouter la méthode f3() et dire que la classe service1 étend cette nouvelle interface.
    Du coup, service1 pourra être "vu" comme une InterfaceA ou comme une InterfaceB

    Mais bon, tout dépend de ce qu'on veut faire.
    Faire des interfaces pour le plaisir n'a pas vraiment de sens, il faut une raison ou une contrainte.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Si vous voulez garder un système propre, regardez du côté de la composition également.
    Quelques "design patterns" comme facade ou proxy mais aussi adapter, composite et decorator peuvent vous aider à implémenter proprement votre solution.

Discussions similaires

  1. [Reflection] Obtenir toutes les classes implémentant une interface
    Par Pill_S dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 20/04/2005, 16h48
  2. [classe anonyme] implementant une interface
    Par stanilas dans le forum Langage
    Réponses: 4
    Dernier message: 30/11/2004, 00h18
  3. [Logiciel]Cherche graphisme pour des interfaces visuelles
    Par smyley dans le forum Autres Logiciels
    Réponses: 9
    Dernier message: 14/11/2004, 02h13
  4. [Reflection] Classes implémentant une interface
    Par thibaut dans le forum API standards et tierces
    Réponses: 17
    Dernier message: 29/07/2004, 14h57
  5. Implementation et Interface
    Par Bleys dans le forum Débuter
    Réponses: 5
    Dernier message: 21/06/2004, 14h00

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