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

Logging Java Discussion :

[design] ou et comment dois je ecrire ma methode?


Sujet :

Logging Java

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 19
    Par défaut [design] ou et comment dois je ecrire ma methode?
    bonjour a tous,
    j'ai un petit soucis au niveau de la conception des classes en java qui me revient souvent, et je souhaitais avoir votre avis la dessus. En plus de ca on m'a posé cette colle un jour lors d'un entretiens d'embauche et j'ai pas su repondre.

    Par exemple, j'ai une super classe qui s'appelle "vehicule".
    3 classes heritent de cette classe, a savoir "moto", "voiture", "bateau".
    D'autre part:
    "kawazaki","yamaha", "honda" herite de "moto".
    "peugeot", "renault" herite de "voiture".
    "Mariner","Riamar" herite de "bateau".

    le probleme est le suivant :
    j'ai une methode tres tres longue a ecrire, que je retrouve dans la classe "Kawazaki", "renault" et "Mariner" mais pas dans les autres.
    OU dois je ecrire cette methode??????

    Suis je obligé de l'ecrire 3 fois (une fois dans la classe "kawazaki", une fois dans la classe "renault" et une fois dans la classe "Mariner"), ou existe t il une astuce pour que je n'ai a l'ecrire qu'une fois et que je puisse l'utiliser dans chacune des classes interressées?

    C'est un probleme tres general et je suis sur que nombreux sont ceux qui ont rencontré ce genre de dilemme, alors j'espere que quelqu'un a une solution élegante.

    merci beaucoup par avance.

  2. #2
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Si ce sont toutes des classes, pour ne pas avoir à définir ta méthode tu dois la définir au niveau de vehicule et la rédéfinir dans les autres cas où elle autres cas où elle ne doit pas être appelée.

    Ou intercaler une classe commune entre Moto et Kawasaki, entre Voiture et Renault ...

    A+

  3. #3
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Tu utilises une interface. Cela semble le choix le plus judissieux dans ton cas. Tu définis ta méthode dans l'interface que tu implemantes. Mais je suis pas sur car si tu veux la même dans toutes les classes, l'interface devient un peu inutile car tu dois redéfinir la méthode à chaque fois.

  4. #4
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 19
    Par défaut
    Si ce sont toutes des classes, pour ne pas avoir à définir ta méthode tu dois la définir au niveau de vehicule et la rédéfinir dans les autres cas où elle autres cas où elle ne doit pas être appelée.
    Je ne pense pas que cela soit satisfaisant, car cela revient a redefinir la methode pour toute les classes qui n'utilise pas la methode, ce qui est tout aussi contraignant.
    Ou intercaler une classe commune entre Moto et Kawasaki, entre Voiture et Renault
    Vu que le multi heritage est impossible en java, je vois pas comment.

    Tu utilises une interface [...] Mais je suis pas sur car si tu veux la même dans toutes les classes, l'interface devient un peu inutile car tu dois redéfinir la méthode à chaque fois.
    En effet, je ne souhaite pas redefinir la methode a chaque fois

  5. #5
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Oui c'est vrai désolé.

    Mais à part utiliser une interface comme je t'ai dit, pas d'autre solution.

    Mais rien ne t'empêche dans la définition concréte de ton interface, de faire appel à une méthode d'une classe déléguée qui contient ta grande méthode. Ou quelquechose comme un pattern visiteur.

    A+

  6. #6
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    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
    public class Vehicule {
    ...
    }
     
    public class Bateau extends Vehicule {
    ...
    }
     
    public class Voiture extends Vehicule {
    ...
    }
     
    public class Moto extends Vehicule {
    ...
    }
     
    public class Honda extends Moto {
    ...
    }
     
    public class Yamaha extends Moto {
    ...
    }
     
    public class Peugeot extends Voiture {
    ...
    }
     
    public class Riamar extends Bateau {
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface Visited {
        public void visit(Visitor visitor);
        public void visit();
    }
    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
    public class Renault extends Voiture implements Visited {
     
        public void visit(Visitor visitor) {
            visitor.execute(this);
        }
     
        public void visit() {
            Visitor visitor = new Visitor();
            visitor.execute(this);
        }
    }
     
    public class Mariner extends Bateau implements Visited {
     
        public void visit(Visitor visitor) {
            visitor.execute(this);
        }
     
        public void visit() {
            Visitor visitor = new Visitor();
            visitor.execute(this);
         }
    }
     
    public class Kawasaki extends Moto implements Visited {
     
        public void visit(Visitor visitor) {
            visitor.execute(this);
        }
     
        public void visit() {
            Visitor visitor = new Visitor();
            visitor.execute(this);
         }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Visitor {
        public void execute(Visited visited) {
            // Tu codes ta grosse méthode ici
     
            // "visited" est passé en paramètre si jamais
            // tu as besoin dans cette méthode des données
            // de la classe appelante.
        }
    }

  7. #7
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 19
    Par défaut
    cela me semble tout a fait correct, merci beaucoup thibaut.

    Du coup je pense qu'on peut faire encore plus simple, vu que l'algorithme est identique pour toute les classes concernées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Kawazaki extends Moto implement VehiculeSpe{...}
    class Renault extends Voiture implement VehiculeSpe{...}
     
    interface VehiculeSpe{}//cette interface peut à la limite être vide ou bien alors contenir des champs si besoin
     
    class A {
     
      public static void traitement(VehiculeSpe vs){
         //gros algorithme
      }
    }
    si j'ai besoin d'effectuer l'algo j'appelle A.traitement(this).

    L'avantage est que je n'ai besoin d'ecrire aucune methode en plus dans Kawazaki et Renault.
    Qu'est ce que tu en penses?

  8. #8
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Ouais ça me semble pas mal.

    Mais ou vas tu appeler : A.traitement(this). ? Tu es obligé(e) de l'appler dans Kawasaki, Renault ?

  9. #9
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 19
    Par défaut
    oui c vrai. C'est plutot A.traitement(machin), avec machin une instance de Kawazaki ou Renault.

  10. #10
    Membre expérimenté Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Par défaut
    Si ce sont toutes des classes, pour ne pas avoir à définir ta méthode tu dois la définir au niveau de vehicule et la rédéfinir dans les autres cas où elle autres cas où elle ne doit pas être appelée.
    Citation Envoyé par Malo
    Je ne pense pas que cela soit satisfaisant, car cela revient a redefinir la methode pour toute les classes qui n'utilise pas la methode, ce qui est tout aussi contraignant.
    Pourquoi?. Rien ne vous oblige de redéfinir une methode d'une super classe héritée meme si vous n'appelez pas cette methode dans les sous classe.

  11. #11
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Citation Envoyé par Amine_sas
    Pourquoi?. Rien ne vous oblige de redéfinir une methode d'une super classe héritée meme si vous n'appelez pas cette methode dans les sous classe.
    Certes mais je suppose que c'est piour éviter tout appel inopprotun de la méthode sur un autre objet que ceux désirés.

  12. #12
    Membre éprouvé
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Par défaut
    Plutot que d'utiliser une interface, j'utiliserais une abstract classe qui permet donc de définir la méthode.

  13. #13
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par moritan
    Plutot que d'utiliser une interface, j'utiliserais une abstract classe qui permet donc de définir la méthode.
    T'as pas dû tout bien lire...
    On n'a pas d'héritage multiple en java et ces classes héritent déjà d'autres classes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Projet en C, comment dois je m'organiser?
    Par condor_01 dans le forum C
    Réponses: 18
    Dernier message: 17/09/2007, 15h56
  2. [VB.NET]Comment autoriser a ecrire le caractère ":" dans un XML?
    Par mustang-f27 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/11/2006, 20h39
  3. Réponses: 2
    Dernier message: 26/08/2006, 12h56
  4. changement de tarif - comment dois je faire ?
    Par Luc01 dans le forum Access
    Réponses: 11
    Dernier message: 06/08/2006, 09h10
  5. [VBA-E]Comment faire pour écrire dans une page excel existante ?
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/05/2006, 13h54

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