9
votes

Comment éviter la duplication du code dans ce cas?

Mon projet consiste à mettre en œuvre une hypergraphes dans Java

Mon hypergraphe contient divers types d'hypereding en fonction du type de sommet que j'ai

type Vertex: image, balises ... < p> Hyperedge = homogène (relier le sommet du même type) / hétérogène (relier le sommet de type différent)

HyperEdge homogène = image-image HyperEdge / tag hypergedge

Ceci est un Dessinez rapidement UML diagramme

Entrez la description de l'image ici

Entrez la description de l'image ici Ceci est mon code xxx


xxx

Le problème est dans la classe imageImagehyperEdge, je devrais savoir ce qui est Le type de fonctionnalité basé sur elle, je rechercherai les voisins de Imagevertex les plus proches Je ne peux pas le transmettre dans la méthode abstrait de la Super Interface car la classe TagTaghyperEdge n'en a pas besoin

et si je remplace ImageImagehyperEdge Class par {FeineNehyperEdge Classe, ... FeaturefivehyperEdge Classe} (dans lequel je connaître le type de fonctionnalité) Ce sera une duplication du code, car il s'agit du même algorithme de recherche les plus proches voisins


Fonction = fonctionnalité de faible niveau d'une image (histogramme de couleur par exemple)
J'ai 5 type de fonctionnalité de faible niveau
Je vais utiliser chacun pour rechercher les voisins les plus proches de mon image actuelle
Toutes les fonctionnalités sont stockées dans un simple fichier textuel de
Le même algorithme est utilisé pour rechercher les voisins les plus proches de
Seul le fichier est changé à chaque fois


3 commentaires

Je ne suis pas sûr d'avoir correctement compris ce dont vous avez besoin, cela pourrait donc aller de toute façon. Pouvez-vous avoir une base de base de la catégorie de base qui impliquerait l'algorithme de recherche. Et exposer une sorte de type o une méthode de modèle qui sera remplacée par FeatureonhyperEdge, Featuretwohyperedge, etc. Cette méthode de modèle ne doit fournir que le type de fonctionnalité que la recherche est basée sur. J'espère que ça aide?


@Denisrosa La première idée que j'ai obtenue est d'utiliser le modèle de stratégie, je pense qu'il est similaire au modèle de modèle, vous pouvez expliquer plus votre idée s'il vous plaît?


Je suppose que je vais ajouter une réponse


3 Réponses :


0
votes

Sur la base de ce que vous avez écrit sur "Feature", je dirais que cela serait approprié comme un champ de votre classe imageImagehyperEdge. Vous pouvez créer une classe FeatureType avec tous les différents membres qui le définiront.

public class ImageImageHyperedge implements
   HomogenousHyperedge<ImageVertex, Map<String,Instance>> {

   private FeatureType featureType;

   @Override
   public List<ImageVertex> searchNearstNeighborsVertex(Hypergraph hypergraph,
        ImageVertex vertex) {
      return null;
   }
}


4 commentaires

La sous-classe de caractéristiques héritera de la mise en œuvre concrète, mais comment savoir le type de fonctionnalité?


La classe elle-même n'aurait-il pas indiqué le type de fonctionnalité? Comme dans, n'indiquerait-il que le type de fonctionnalité est "Fonction"?


Oui, mais comment la mise en œuvre concrète dans la super classe le saura-t-elle?


Je suppose que je ne suis pas totalement suivant ce qu'une "fonctionnalité" est dans le contexte de votre problème ... il serait probablement utile si vous clarifiez cela dans votre question.



0
votes

Essayez quelque chose comme ça? XXX

Peut-être que vous pouvez essayer le Modèle Modèle de méthode ?


0 commentaires

1
votes

Votre design UML n'est pas assez bon. Passer le "style" laid et difficile à lire, montrez-nous sur "Vertex" ainsi que "Edge" et un diagramme d'association; Pas votre idée (potentiellement compliquée) d'héritage.

Vos API, la conception et la question fondamentale ne sont pas vraiment claires. Les classes 'HyperEdge' pourraient représenter une seule instance d'un bord et associer les deux extrémités de cela; ou ils pourraient (si mieux nommé) représentent un type d'Edge et recherchez le graphique globalement à partir d'un paramètre de point d'extrémité spécifié. P>

Ce sont des conceptions complémentaires, votre question n'a pas de sens jusqu'à ce que vous puissiez comprendre ce qui précise. p>

de toute façon, bord.Search () n'a pas la bonne signature. Où vs et ve sont des types de sommet de démarrage et d'extrémité, et TE est des types de bord, il devrait soit être: p> xxx pré>

ou p> xxx Pré>

L'algorithme de voisin le plus proche doit être mis en œuvre à l'aide de types génériques, puis appelé comme requis (avec des signatures exactes) par les classes de béton. P>

BTW, lorsque vous mentionnez "voisin le plus proche" ; Il n'existe pas non plus si "voisin le plus proche" signifie directement connecté au sommet em>, qui est trivial ou de trouver le distant le plus proche (comment la distance est mesurée? Vous ne spécifiez pas) sommet d'un type spécifié.

De toute façon, l'utilité et l'exactitude / besoin d'implémenter des sous-types de "bord" ne semble pas claire. De nombreux algorithmes de graphes trouvent des sommets / nœuds à être intéressants et sous-types, mais je suis moins que conscient du sous-typing (ou de l'utilité du sous-typing) les bords qui ont conduit à celles-ci. P>

Dernier conseil: Ditch the complexe Naming, EMBRASSER. 'Vertex' et 'Edge' vous aideront à obtenir un design clair, simple, compréhensible et correct. Enregistrez le wordage supplémentaire pour après em> vous avez cela. P>


en réponse à d'autres informations de Nawara: P>

alors c'est un edgetype vous ' VE modélisé et lorsque vous demandez «voisin le plus proche», vous devez prendre un sommet Vertex et renvoyer un (s) bord (s) - si vous avez besoin des métriques de distance - ou des sommets. P>

La référence au "graphique" devrait Soyez probablement implicite du paramètre Vertex. P>

En ce qui concerne votre héritage d'héritage Edgetype: les sous-types et l'héritage doivent être définis pour suivre les caractéristiques comportementales et non les types génériques (types de sommet) qu'ils font référence. Le principe de la conception de l'héritière de la classe OO est de modéliser faire em>, pas étant em>. P>

À cet égard, vous pourriez avoir des classes KnndistanéGetypeyType & FlickrdistancedGetype, soit comme les ancêtres, ou, si aucun autre comportement de méthode n'a besoin d'être différent, comme les classes de mise en œuvre réelles. Les types de caractéristiques / classes qu'ils recherchent peuvent être définis comme propriétés - avec des propriétés et généralisées différemment, pour répondre à différents types de vertex. P>

IMAGE_IMAGE_EDGES = new KnnDistanceEdgeType<ImageVertex,ImageVertex>( ImageVertex.class, ImageVertex.class);
TAG_TAG_EDGES = new FlickrDistanceEdgeType<TagVertex,TagVertex>( TagVertex.class, TagVertex.class);
ANY_EDGES = new KnnDistanceEdgeType<Vertex,Vertex>( Vertex.class, Vertex.class);


4 commentaires

J'ai un hypergraph g complexe g = (v, e), v est le jeu de vertex qui peut contenir différents types de sommets (image, étiquette, locationion ...) et E est le jeu hyperget qui contient également un type de bord différent (bord entre entre images, entre étiquettes, entre image et étiquette) La manière de trouver un sommet d'incidence de chaque hyperedge est différente selon le type d'hyperedge, par exemple en cas d'hyperedge dont le point de départ et d'extrémité est un sommet d'image, j'utilise l'algorithme de Knn (avec une distance de l'euclidien) En cas d'hypedge dont le point de départ et de fin sont des balises, j'utilise la distance Flickr


C'est pourquoi je pense que je devrais utiliser une classe abstraite HyperEdge et plusieurs sous-classes hériter de celui-ci et chacun représente un type d'hypereding différent


Dans ce cas, c'est un EDGEkind ou Edgetype - et vous le demandez spécifier un STARTVERTEX, et répondre à un bord ou à un sommet comme résultat; Bord si vous avez besoin de la distance, du sommet si vous ne le faites pas.


Il y a un malentendu, je ne veux pas dire par edgetype si elle est dirigée ou non, je veux dire EDGEkind ---------------- En effet une hyperedge connect plus d'un sommet c'est la différence d'homme du graphique Simlpe