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

avec Java Discussion :

Héritage ou create ?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut Héritage ou create ?
    Bonjour à tous,

    Je suis en train de coder une classe "Neighborhood" représentant un voisinage. Pour vous mettre dans le contexte voici à quoi elle ressemble:

    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
    63
    public class Neighborhood implements Iterable
    { 
      ArrayList<Position> relativePosition;
     
      public Neighborhood(ArrayList<Position> pos)
      {
        relativePosition = pos.clone();
      }
     
      // x is the mark of the Neighborhood.
      // @returns The absolute neighborhood with the mark x.
      public Neighborhood getAbsolute(Position x)
      {
        ArrayList<Position> pos = new ArrayList<Position>();
        for(Position p : relativePosition)
          pos.add(new Position(x.getx() + p.getx(), x.gety() + p.gety()));
        return new Neighborhood(pos);
      }
     
      public Neighborhood getAbsolute(Position x, Predicate<Position> p)
      {
        ArrayList<Position> absolutePos = new ArrayList<Position>();
        for(Position pos : relativePosition)
          if(p.evaluate(pos))
            absolutePos.add(new Position(x.getx() + pos.getx(), x.gety() + pos.gety()));
        return new Neighborhood(absolutePos);
      }
     
      @Override
      public Iterator iterator() 
      {
        return new NeighborhoodIterator();
      }
     
      private class NeighborhoodIterator implements Iterator
      {
        private Iterator iter;
     
        public NeighborhoodIterator()
        {
          iter = relativePosition.iterator();
        }
     
        @Override
        public boolean hasNext() 
        {
          return iter.hasNext();
        }
     
        @Override
        public Position next() 
        {
          return (Position) iter.next();
        }
     
        @Override
        public void remove() 
        {
          iter.remove();
        }
     
      }
    }
    Il existe certain type de voisinage super connu comme ceux de Moore et Von Neumann. En connaissance de cause, qu'est-ce qui est le mieux entre créer une méthode static createMooreNeighborhood() dans la classe Neighborhood ou un héritage comme celui-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class MooreNeighborhood extends Neighborhood
    {
      public MooreNeighborhood()
      {
        // Initialisation  ...
      }
    }
    Dans ce dernier cas, il faudrait un peu modifier la première classe pour pouvoir faire l'appel à super dès le début et pouvoir modifier ensuite.

    Pour moi un voisinage de Moore est un voisinage mais mon "intuition" me dit plutôt d'utiliser une méthode static create car on ne spécialise pas vraiment la classe Neighborhood.

    Qu'en pensez-vous ?

    Et plus généralement, dans quelles cas utilise t'on l'un plutôt que l'autre ? Et existe t'il des patterns qui vont bien dans ce genre de situation ?

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Quel est la différence entre un voisinage et un voisinage de moore?

    Suivant la réponse, la solution sera soit l'héritage, soit la création de plusieurs constructeur.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Par défaut
    Personnellement, dans la logique de ce que j'ai compris je verrai bien de l'héritage ici.
    Après il faut bien sûr qu'il y ait une différence entre le voisinage Moore et le voisinage en général, que Moore ait une particularité. Sinon je ne vois pas l'intérêt.

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Ce que j'appelle un voisinage, c'est un ensemble de coordonnées. Si on veut calculer les coordonnées des voisins d'une coordonnées (x,y), alors il suffit d'additionner x et y à chacune des coordonnées du voisinage pour obtenir autant de nouveaux points.

    Le voisinage de Moore, c'est simplement ça: http://en.wikipedia.org/wiki/File:Moore_d.gif

    On pourrait imaginer des voisinages qui ne sont pas "logique" c'est à dire, juste le nord, ou encore l'est mais où la distance entre le centre et le voisin est de 4, etc.

    Donc, à priori, un voisinage de Moore n'ajoute pas de membre à la classe, c'est juste une configuration spécifique.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Par défaut
    Je pense dans ce cas là que j'irai plus vers la construction de plusieurs constructeurs.

  6. #6
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Je ne vois pas comment faire ça en Java. J'ai juste une simple idée de faire comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      public Neighborhood(ArrayList<Position> pos){
    //...
    }
     
    // Si type = "Moore" alors un voisinage de Moore est créé
    // Si type = "...
    public Neighborhood(String type)
    Mais je ne trouve pas ça très élégant, comment faire ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Par défaut
    Bonjour,

    Quelle est la différence entre Neighborhood et une liste de Position ?

    Si tu comptes exposer Neighborhood en iterable c'est que le comportement va être en dehors de ta classe, non ?

    Dans ce cas pourquoi ne pas simplement faire des méthodes utilitaires qui créent ta liste de points :
    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
    public class Utils {
     
    	Iterable<Position> getMoor(Position p){
    		List<Position> l = new ArrayList<Position> ();
    		l.add(new Position(p.getx()+1,p.gety()+1));
    		// ...
    		return l;
    	}
     
    	Iterable<Position> getVonNeumann(Position p){
    		List<Position> l = new ArrayList<Position> ();
    		l.add(new Position(p.getx()+1,p.gety()+1));
    		// ...
    		return l;
    	}
     
    	// autre
     
    }

    Si tu tiens absolument à faire un objet Neighborhood, c'est peut être que tu veux qu'il ait un comportement particulier. Dans ce cas il vaut mieux ne pas le faire itérable.

    Pour décider si tu fais un héritage ou des méthode utilitaire de construction.
    Il faut se poser la question est ce que je vais redéfinir un comportement dans le cas de mon voisinage de More ?

    Par exemple,si tu as une méthode voisinageDuVoisinage dans Neighborhood.
    Est ce que ce voisinage sera de même type que celui sur le quel tu l'appel ?
    Si oui => héritage.

    Ceci ne reste que mon humble opinion... et est parfaitement discutable

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

Discussions similaires

  1. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  2. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55
  3. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  4. TXMLModule.create - name = resource not found
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 04/03/2003, 10h54
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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