首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下,如何避免代码的重复?

在这种情况下,如何避免代码的重复?
EN

Stack Overflow用户
提问于 2013-04-17 19:03:22
回答 3查看 463关注 0票数 9

我的项目是关于在java中实现hyperGraph。

根据我所拥有的顶点类型,我的hyperGraph包含各种类型的hyperEdge。

顶点类型:图像,标签..。

HyperEdge =齐次(同类型的相关顶点)/Heterogeneous(不同类型的相关顶点)

同质HyperEdge=图像-图像超边缘/标签标记hyperEdge

这是一个快速绘制UML图。

这是我的密码

代码语言:javascript
复制
public interface HomogenousHyperedge< T extends Vertex<L>, L> extends Hyperedge {

   public abstract List<T> searchNearstNeighborsVertex(
      Hypergraph hypergraph, T vertex);
}
代码语言:javascript
复制
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类}(其中我知道特征类型),这将是代码的重复,因为它是相同的最近邻搜索算法。

图像的feature=低层特征(例如颜色直方图)

我有5种低级别功能

我将使用每一个搜索当前图像的最近邻居。

所有功能都存储在一个简单的文本文件中。

同样的算法用于搜索最近的邻居。

每次只有文件被更改

EN

回答 3

Stack Overflow用户

发布于 2013-05-02 09:02:17

您的UML设计不够好。跳过丑陋和难读的‘样式’,向我们展示‘顶点’和‘边缘’,以及一个关联图,而不是你(可能过于复杂)的继承概念。

您的API、设计和基本问题并不十分清楚。“‘Hyperedge”类可以表示Edge的单个实例,并将其两端关联起来;或者它们可以(如果更好地命名)表示边缘类型,并从指定的端点参数全局搜索图形。

这些都是完全不同的设计,你的问题是毫无意义的,除非你弄清楚上面的答案。

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

代码语言:javascript
复制
public class EdgeType {
    public List<EV> getEndpoints (SV startVertex);
}

代码语言:javascript
复制
public class Vertex {
    public List<TE> Vertex.getEdges();
}
public class Edge {
    public EV Edge.getEndpoint();
}

最近邻算法应该使用泛型类型来实现,然后由具体的类根据需要(带有精确的类型签名)进行调用。

顺便说一句,当你提到“最近的邻居”时,也不清楚“最近的邻居”是否意味着直接连接的顶点,这是琐碎的,或者是寻找最近的距离(距离是如何测量的?指定类型的顶点。

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

最后提示:放弃复杂的命名,亲吻。‘顶点’和‘边缘’将帮助你得到一个清晰,简单,可理解和正确的设计。把多余的字句留到你拿到后再说。

针对纳瓦拉提供的进一步资料:

然后,它是您所建模的EdgeType,当询问‘最近的邻居’时,您应该取一个起始点&返回边(S) --如果您需要距离度量--或者顶点。

对“图”的引用可能是从顶点参数中隐含的。

至于您的EdgeType继承继承:子类型&继承应该定义为遵循行为特征,而不是它们引用的泛型类型(顶点类型)。OO类继承设计的原则是建模,而不是存在。

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

例如:

代码语言:javascript
复制
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票!

票数 1
EN

Stack Overflow用户

发布于 2013-04-17 19:40:38

基于您所写的关于“特性”的内容,我认为这将适合作为您的ImageImageHyperEdge类中的一个字段。您可以使用定义它的任何不同成员创建一个FeatureType类。

代码语言:javascript
复制
public class ImageImageHyperedge implements
   HomogenousHyperedge<ImageVertex, Map<String,Instance>> {

   private FeatureType featureType;

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

Stack Overflow用户

发布于 2013-04-17 19:53:51

试试这样的东西?

代码语言:javascript
复制
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();
    }
}

也许你可以试试模板法模式

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16068061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档