gpt4 book ai didi

java - 在这种情况下如何避免代码重复?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:47 25 4
gpt4 key购买 nike

我的项目是关于在 java 中实现超图

我的 hyperGraph 包含各种类型的 hyperEdge,具体取决于我拥有的顶点类型

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

HyperEdge =Homogeneous(关联相同类型的顶点)/Heterogeneous(关联不同类型的顶点)

Homogeneous HyperEdge= Image-image HyperEdge/Tag-tag hyperEdge

这是一个快速绘制的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 最近的邻居我不能将它传递给 super 接口(interface)的抽象方法,因为 TagTagHyperEdge 类不需要它

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


feature=图像的低级特征(例如颜色直方图)
我有 5 种低级功能
我将使用每一个来搜索我当前图像的最近邻居
所有功能都存储在一个简单的文本文件中
同样的算法用于搜索最近的邻居
每次只改变文件

最佳答案

您的 UML 设计不够好。跳过丑陋且难以阅读的“样式”,向我们展示“顶点”和“边”,以及关联图;不是您的(可能过于复杂的)继承概念。

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

这些是完全不同的设计,你的问题在你弄清楚上面的内容之前是没有意义的。

无论哪种方式,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();
}

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

顺便说一句,当你提到“最近的邻居”时;也不清楚“最近邻”是指直接连接的顶点,这是微不足道的,还是找到最近的距离(距离如何测量?你没有指定)指定类型的顶点。

无论哪种方式,实现“Edge”子类型的实用性和正确性/需要似乎都不清楚。许多图形算法发现顶点/节点很有趣并对其进行子类型化,但我不太了解导致这些的边缘的子类型化(或子类型化的实用程序)。

最后提示:放弃复杂的命名,KISS。 “顶点”和“边缘”将帮助您获得清晰、简单、易于理解和正确的设计。为 准备好多余的字词。


回应来自 Nawara 的进一步信息:

那么它就是您建模的 EdgeType,当询问“最近邻居”时,您应该采用起始顶点并返回边(如果您需要距离度量)或顶点。

对“Graph”的引用应该从 Vertex 参数中隐含。

就您的 EdgeType 继承层次结构而言:子类型和继承应定义为遵循行为特征,而不是它们引用的通用类型(顶点类型)。 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 票!

关于java - 在这种情况下如何避免代码重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com