Wie vermeidet man die Duplizierung von Code in diesem Fall?

9

In meinem Projekt geht es darum, einen HyperGraph in Java zu implementieren

Mein hyperGraph enthält verschiedene Arten von hyperEdge, abhängig vom Scheiteltyp, den ich habe

Scheitelpunkttyp: Bild, Tags ...

HyperEdge = Homogen (Bezugspunkt gleichen Typs) / Heterogen (Bezugspunkt unterschiedlichen Typs)

Homogene HyperEdge = Bild-Image HyperEdge / Tag-Tag hyperEdge

Dies ist ein schnell zeichnen UML-Diagramm

das ist mein Code

%Vor%


%Vor%

Das Problem ist in der ImageImageHyperEdge-Klasse Ich sollte wissen, welche Art von Feature darauf basiert Ich werde die nächsten Nachbarn von ImageVertex suchen Ich kann es nicht in die abstrakte Methode der Super-Schnittstelle übergeben, da die TagTagHyperEdge-Klasse es nicht benötigt

und wenn ich die ImageImageHyperEdge-Klasse durch die {featureOneHyperEdge-Klasse, ... featureFiveHyperEdge-Klasse} (in der ich den Feature-Typ kenne) ersetze es wird eine Duplizierung von Code sein, da es der Suchalgorithmus für die nächsten Nachbarn ist

feature = Low-Level-Feature eines Bildes (z. B. Farbhistogramm)
Ich habe 5 Arten von Low-Level-Funktion Ich werde jeden benutzen, um die nächsten Nachbarn meines aktuellen Bildes zu suchen Alle Funktionen sind in einer einfachen Textdatei gespeichert derselbe Algorithmus wird verwendet, um die nächsten Nachbarn zu suchen nur die Datei wird jedes Mal geändert

    
nawara 17.04.2013, 19:03
quelle

3 Antworten

1

Ihr UML-Design ist nicht gut genug. Skip the hässliche & amp; schwer zu lesen "Styling", zeigen Sie uns "Vertex" sowie "Edge" und ein Assoziationsdiagramm; nicht Ihre (möglicherweise zu komplizierte) Idee der Vererbung.

Ihre APIs, Design & amp; Grundlegende Frage ist nicht wirklich klar. "Hypergedge" -Klassen könnten eine einzelne Instanz eines Edge darstellen und die beiden Enden davon verbinden; oder sie könnten (wenn besser benannt) einen Kantentyp darstellen und das Diagramm global von einem angegebenen Endpunktparameter aus durchsuchen.

Dies sind völlig verschiedene Designs, Ihre Frage ist bedeutungslos, bis Sie die oben genannten herausfinden.

Wie auch immer, Edge.search () hat nicht die richtige Signatur. Wo VS und VE Anfangs- und Endknoten sind und TE Kantenarten sind, sollte es entweder:

sein %Vor%

oder

%Vor%

Der Nearest-Neighbor-Algorithmus sollte mit generischen Typen implementiert werden und dann von den konkreten Klassen wie erforderlich (mit genauen Typ-Signaturen) aufgerufen werden.

BTW, wenn Sie "nächster Nachbar" erwähnen; Es ist auch nicht klar, ob "nächster Nachbar" direkt verbundener Scheitelpunkt bedeutet, was trivial ist, oder um den nächsten entfernten Punkt (wie wird Abstand gemessen? Sie geben keinen an) Scheitelpunkt eines angegebenen Typs.

Wie auch immer, das Dienstprogramm & amp; Korrektheit / Notwendigkeit, Subtypen von 'Edge' zu implementieren, scheint unklar. Viele Graphalgorithmen finden Vertices / Nodes interessant und unterteilen diese, aber ich bin mir nicht bewusst, dass die Kanten, die zu diesen führen, untergeordnet werden (oder die Nützlichkeit der Subtypisierung).

Letzter Tipp: Graben Sie die komplexe Namensgebung, KISS. "Vertex" und "Edge" werden Ihnen helfen, eine klare, einfache, verständliche & amp; richtiges Design. Speichere das zusätzliche Wort für nachdem du das hast.

Als Antwort auf weitere Informationen von Nawara:

Dann ist es ein EdgeType, den Sie modelliert haben, und wenn Sie den nächsten Nachbarn fragen, sollten Sie einen Start Vertex & amp; gib entweder Edge (s) zurück - wenn du die Distanzmetriken benötigst - oder Vertices.

Der Verweis auf 'Graph' sollte wahrscheinlich vom Vertex-Parameter impliziert sein.

Soweit Ihre EdgeType-Vererbungshierarchie: subtypes & amp; Vererbung sollte so definiert werden, dass sie Verhaltensmerkmalen folgt, nicht den generischen Typen (Vertex-Typen), auf die sie verweisen. Das Prinzip für das OO-Klassenhierarchie-Design besteht darin, tun zu modellieren, nicht zu sein.

In diesem Zusammenhang könnten Sie einen KnnDistanceEdgeType & amp; FlickrDistanceEdgeType-Klassen entweder als Vorfahren oder, wenn kein anderes Methodenverhalten erforderlich ist, als tatsächliche Implementierungsklassen. Die Feature-Typen / Klassen, nach denen sie suchen, können als Eigenschaften festgelegt werden - mit den Eigenschaften & amp; Generiert anders, um verschiedene Vertex-Typen zu beantworten.

zB

%Vor%

Wenn es in EdgeType viele andere Verhaltensweisen gibt (wir haben keine definiert und können sich nicht viel vorstellen), könnten Sie die KNN- und Flickr-Abstands-Algorithmen in separate Klassen verschieben. Wahrscheinlich keine Notwendigkeit.

Denken Sie daran: in OO, Unterklasse für Verhalten, nicht für Existenz. Und gib mir eine +1 Stimme!

    
Thomas W 02.05.2013 09:02
quelle
0

Versuchen Sie so etwas?

%Vor%

Vielleicht können Sie das Vorlagenmethodenmuster ausprobieren?

    
Denis Rosca 17.04.2013 19:53
quelle
0

Basierend auf dem, was Sie über "Feature" geschrieben haben, würde ich sagen, dass dies als ein Feld in Ihrer ImageImageHyperEdge-Klasse geeignet wäre. Sie können eine FeatureType-Klasse mit den verschiedenen Elementen erstellen, die sie definieren.

%Vor%     
Zack Macomber 17.04.2013 19:40
quelle

Tags und Links