2013-04-17 116 views
9

我的项目是在Java中实现一个超图在这种情况下如何避免重复代码?

我超图包含不同类型的超边的取决于我有

顶点类型顶点类型:图片,标签...

超边=均匀(涉及相同类型的顶点)/异构(涉及不同类型的顶点)

均相超边=图片图像超边/标签标签超边

氏s是一个快速绘制UML图

enter image description here

enter image description here 这是我的代码

public interface HomogenousHyperedge< T extends Vertex<L>, L> extends Hyperedge { 

    public abstract List<T> searchNearstNeighborsVertex(
     Hypergraph hypergraph, T vertex); 
} 


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

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

的问题是在ImageImageHyperEdge类我应该知道什么是基于它的特征类型我将搜索ImageVertex最近的邻居 我不能把它传递到超级接口的抽象方法,因为TagTagHyperEdge类不需要它

,如果我通过更换ImageImageHyperEdge类{featureOneHyperEdge类,... featureFiveHyperEdge类}(其中我知道特征类型) 这将是代码的复制,因为它是相同的最邻近搜索的算法


特征=(图像的低级别特征例如颜色直方图)
我有5型低级别的功能
我将使用每一个搜索最近的ne我目前的图像
所有功能ighbors被放养在一个简单的文本文件
相同的算法来搜索最近的邻居
只有文件被更改每次根据你写“功能是什么

+0

我不确定我是否正确理解你需要什么,所以这可能无论如何。你可以有一个基类BaseFeatureHyperEdge来实现搜索算法。并暴露一些将被FeatureOneHyperEdge,FeatureTwoHyperEdge等覆盖的模板方法。此模板方法应仅提供搜索所基于的功能类型。希望能帮助到你? –

+0

@DenisRosca我得到的第一个想法是使用战略模式 我认为它类似于模板模式 你能解释一下你的想法吗? – nawara

+0

我想我会添加一个答案 –

回答

0

时间“,我会说这将适合作为ImageImageHyperEdge类中的一个字段。您可以使用将定义它的任何各种成员创建一个FeatureType类。

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

    private FeatureType featureType; 

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

功能子类将继承concret实现,但它将如何知道功能类型? – nawara

+0

班级本身不会指出特征类型吗?如在中,不会FeatureOneHyperEdge指示要素类型是“FeatureOne”? –

+0

是的,但超类中的concret实现如何知道它? – nawara

0

尝试这样?

public abstract class BaseFeatureHyperEdge { 

    @Override 
    public List<ImageVertex> searchNearstNeighborsVertex(Hypergraph hypergraph, 
     ImageVertex vertex) { 
     // implement nearest neighbor search algorithm 
     // and call getFeatureType where you need it. 
     // This will allow you to have the search algorithm only in one place. 
     //But make the search based on the feature type; 
    } 

    protected FeatureType getFeatureType(); 
} 

public class FeatureOneHyperEdge extends BaseFeatureHyperEdge{ 

    @Override 
    protected FeatureType getFeatureType() { 
     return new FeatureTypeOne(); 
    } 
} 


public class FeatureTwoHyperEdge extends BaseFeatureHyperEdge{ 

    @Override 
    protected FeatureType getFeatureType() { 
     return new FeatureTypeTwo(); 
    } 
} 

也许你可以试试Template Method Pattern

+0

我不知道它 – nawara

1

您的UML设计不够好。跳过丑陋难懂的'造型',向我们展示'顶点'以及'边缘'和关联图;不是你的(可能过于复杂)继承的想法。

您的API,设计&的基本问题并不十分清楚。'超范畴'类可以代表一个Edge的单个实例,并将其关联起来;或者他们可以(如果命名更好)代表边缘类型,并从指定的端点参数全局搜索图形。

这些complelely不同的设计,你的问题是没有意义的,直到你看着办上面出来。

无论哪种方式,Edge.search()不具有正确的签名。当VS和VE的开始和结束顶点类型和TE是边缘类型,它的值应为:

public class EdgeType { 
    public List<EV> getEndpoints (SV startVertex); 
} 

public class Vertex { 
    public List<TE> Vertex.getEdges(); 
} 
public class Edge { 
    public EV Edge.getEndpoint(); 
} 

最近邻算法应使用通用类型来实现,然后根据需要(具有确切类型签名)由具体类调用。

顺便说一句,当你提到“最近邻居”;也不清楚“最近邻居”是指直接连接的顶点,这很平凡,或找到指定类型的最近距离(如何测量距离(您未指定))。

无论哪种方式,实用&正确性/需要实施的“边缘”的亚型,似乎都不清楚。许多图算法发现顶点/节点是有趣的并且是子类型,但是我并不知道子类型(或子类型的用途)导致这些的边缘。

最后提示:沟复杂的命名,KISS。 “顶点”和“边缘”将帮助您获得清晰,简单,易于理解的正确设计。在之后保存的额外文字。


为了应对进一步从Nawara信息:

然后,它就是你建模的EdgeType,并要求“最近的邻居”时,你应该采取一个开始顶点&在回报优势(S) - 如果您需要距离度量标准或顶点。

为“图”的参考应该是大概从顶点参数隐。至于你的EdgeType继承heirarchy:子类型&继承应该被定义为遵循行为特征,而不是它们引用的泛型类型(顶点类型)。 OO级平行设计的原理是模型,而不是

在这方面,您可能有一个KnnDistanceEdgeType & FlickrDistanceEdgeType类,或者作为祖先,或者如果没有其他方法行为需要与实际实现类不同,他们正在搜索的要素类型/类可以设置为属性 - 具有不同通用属性&以回答不同的顶点类型。

例如。

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); 

如果有太多其他行为(我们还没有定义的,并且无法想象多大)在EdgeType,你可以移动KNN-和Flickr距离算法关闭以单独的类。可能没必要。

记住:在OO中,行为的子类,不存在。并给我一个+1投票!

+0

我有一个复杂的hyperGraph G =(V,E),V是可能包含不同类型的顶点的顶点集(图像,标签,locaetion ...)和E是超边集还含有不同边缘类型(边缘betwenn图像,标签之间,图像和标签)之间 根据超边类型 用于找到每个超边的发生率顶点的方式是不同在起始点和结束点都是图像的hyperEdge的情况下的示例 顶点我在hypeEdge的情况下使用knn算法(使用欧几里得距离),其起点和终点都是标记我使用Flickr距离 – nawara

+0

这就是为什么我认为我应该使用一个抽象类'hyperedge'和多个子类继承它,每个代表一个不同的hyperEdge类型e – nawara

+0

在这种情况下,它是EdgeKind或EdgeType - 您要求它指定一个StartVertex,然后回答Edge或Vertex作为结果;边缘如果你需要的距离,顶点,如果你不。 –

相关问题