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

Spring Java Discussion :

Créer des inner classes dans une interface pour les petites portions de code


Sujet :

Spring Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    février 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut Créer des inner classes dans une interface pour les petites portions de code
    Bonjour

    Dans le projet actuel un développeur écrit des interfaces avec des inner classes qu'il implémente directement et en fait des components spring. Selon lui, les classes sont trop petites (ce qui est vrai) pour avoir besoin d'une réelle classe dédiée et sont liées avec leur interface de façon très proche. Je me demande si c'est une bonne pratique, car j'avoue que j'aime l'idée mais je ne l'ai jamais vue.

    Si c'est une pratique acceptée, elle a le mérite d'éviter la multiplication de petites classes avec des noms à rallonge pour des concepts très précis dans le code. Je voulais avoir votre avis.

    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
     
     
    public interface InterfaceParente {
        void uneMethode();
     
     
    @Component
    class InnerClass1 implements InterfaceParente {
      @Override
      public void uneMethode() {
          // des actions
      }
    }
     
    @Component
    class InnerClass2 implements InterfaceParente {
      @Override
      public void uneMethode() {
          // des actions
      }
    }
     
    @Component
    class InnerClass3 implements InterfaceParente {
      @Override
      public void uneMethode() {
          // des actions
      }
    }
    }

  2. #2
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 425
    Points : 4 475
    Points
    4 475
    Par défaut
    Je ne vais pas donner mon avis (après tout, tout le monde en a un) mais exposer une liste de pour et contre:

    Pour:
    - Reduit le nombre de classe.

    Contre:
    - Couple les implémentations et l'interface
    - Refactoring compliqué dans le cas où l'interface est déplacée dans une bibliothèque séparée.
    - Complique le code (est-ce que la inner classe est static ou pas vu qu'elle est dans une interface? pas clair pour tout le monde au premier coup d'oeil).
    - Pratique inhabituelle, le prochain dev qui passera sur le code se demandera pourquoi on a fait comme ça et voudra tout changer.
    - Depuis java 8, les inner class avec une seule fonction implementant une interface peuvent être des lambda.(java8+)
    - Expose d'office l'implémentation dans un module alors que ce n'est souvent pas souhaitable(java9+)
    - Disgracieux au niveau du commit history, un fichier d'interface n'est typiquement modifié que pour des nouvelles fonctionnalités ou un changement d'architecture, dans le cas présent, un bug fix l'affecterait aussi, ce qui n'est pas naturel.
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  3. #3
    Membre expérimenté Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2010
    Messages
    742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : octobre 2010
    Messages : 742
    Points : 1 595
    Points
    1 595
    Par défaut
    C'est pas propre à mon avis !

    Si on veut interfacer un composant c'est qu'on souhaite modifier son comportement sans modifier son contrat. La ils sont liés dans le même fichier.


    Pour:
    - Reduit le nombre de classe.
    Plutôt réduit le nombre de fichier source Il y a deux fichiers class compilés quand même
    Pensez à marquer vos tickets comme résolus.
    Pensez aussi aux pour les réponses pertinantes

    Quand une discution est résolue depuis un moment pour revenir dessus, il est mieux d'en crée une nouvelle avec un lien vers l'autre car :
    • Elle sera en haut du forum, elle sera donc plus visible
    • Une discussion résolue, on ne passe pas dessus pour aider, on passe dessus si on a le même problème
    • Tu demandes surement à tes clients de faire le même

  4. #4
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 425
    Points : 4 475
    Points
    4 475
    Par défaut
    Citation Envoyé par supergeoffrey Voir le message
    Plutôt réduit le nombre de fichier source Il y a deux fichiers class compilés quand même
    Effectivement, merci pour la correction.
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    février 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par yildiz-online Voir le message
    Je ne vais pas donner mon avis (après tout, tout le monde en a un) mais exposer une liste de pour et contre:

    Pour:
    - Reduit le nombre de classe.

    Contre:
    - Couple les implémentations et l'interface
    - Refactoring compliqué dans le cas où l'interface est déplacée dans une bibliothèque séparée.
    - Complique le code (est-ce que la inner classe est static ou pas vu qu'elle est dans une interface? pas clair pour tout le monde au premier coup d'oeil).
    - Pratique inhabituelle, le prochain dev qui passera sur le code se demandera pourquoi on a fait comme ça et voudra tout changer.
    - Depuis java 8, les inner class avec une seule fonction implementant une interface peuvent être des lambda.(java8+)
    - Expose d'office l'implémentation dans un module alors que ce n'est souvent pas souhaitable(java9+)
    - Disgracieux au niveau du commit history, un fichier d'interface n'est typiquement modifié que pour des nouvelles fonctionnalités ou un changement d'architecture, dans le cas présent, un bug fix l'affecterait aussi, ce qui n'est pas naturel.

    Je comprends ton point de vue et perso, je ne jamais vue ça non plus. A présent, ça présente aussi l'avantage de lier fortement l'interface avec la classe interne mais aussi et surtout d'éviter d'avoir des noms à rallonge (dans les projets assez techniques, on a vite des notions qui s'entrecroisent et les noms deviennent rapidement trompeurs eux-mêmes) qui a terme ne veulent plus rien dire et qui risquent là aussi de perdre le développeur.

    Là, un dev qui arriverait sait que InnerClass1 appartient au domaine de "InterfaceParente".

    Merci pour ta réponse !

  6. #6
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 425
    Points : 4 475
    Points
    4 475
    Par défaut
    Justement, le couplage interface - implémentation est une mauvaise pratique car

    1) le risque de dépendance cyclique est élevé
    2) impossible d' utiliser l'interface sans embarquer les composants et pire, lib tierces
    3) aucune encapsulation modulaire
    4) pas de gestion propre des packages et responsabilités

    Si la nomenclature est pourrie, c'est ca qu'il faut revoir, pas utiliser un design douteux comme cache-misère.
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/05/2021, 12h17
  2. NoClassDefFound pour une inner classe dans une méthode de la classe
    Par joel.drigo dans le forum Général Java
    Réponses: 4
    Dernier message: 19/07/2013, 14h40
  3. Réponses: 5
    Dernier message: 15/04/2009, 15h38
  4. Réponses: 4
    Dernier message: 01/06/2007, 19h15
  5. Popup calendrier dans une interface pour remplir textfield
    Par Gasimoto dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 24/05/2007, 10h37

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