公共链路是应该拥有两个节点还是应该每个节点都拥有一个公共链路?

时间:2015-05-28 16:39:58

标签: c# oop graph orm

我正在设计一个应用程序,其中有链接和节点。链路的两端中的每一端都连接到一个节点,每个节点可以连接到多个链路。

自然有两种方法可以设计Link和Node类。第一个:链接自己的节点。节点将不知道链接。

class Link
{
    public Node First {get; set;}
    public Node Second {get; set;}
    public string Name {get; set;}
    public double Length {get; set;}
    public double Strength {get; set;}
}

class Node
{
    // ...
}

第二个:Node拥有Links。链接将不知道点头。

class Link
{
    public string Name {get; set;}
    public double Length {get; set;}
    public double Strength {get; set;}
}

class Node
{  
    public IList<Link> Links {get; set;}
    //...
}

我不赞成第二种设计,因为它意味着可能有两个以上的节点连接到同一条链路。此外,它不允许节点实例查找其链接的伙伴。如果是这种情况,取消链接将很困难(想象一下将节点的Link属性设置为null - 其合作伙伴仍将保留对Link的引用)

另一方面,第一个设计意味着需要跟踪Link个实例。删除例如链接的节点将导致需要显式删除相应的Link实例(除非我们允许对链接中的节点的引用为null - 但我也想避免这种情况)。 / p>

从OOP的角度来看,您认为哪个更正确?

1 个答案:

答案 0 :(得分:1)

我是否正确假设您正在尝试将图形存储在内存中?如果是这样,有三种方法可以存储它:

  1. 链接(边缘)列表:您正在使用第一种方法,但无法检查两个节点是否可以快速连接。
  2. Matrix:您正在为地图存储二维数组(或字典),但由于您有Link的许多其他信息,我不建议这样做。
  3. 最适合您的方法是合并这两种变体:LinkNode了解彼此:

    class Link
    {
        public Node First {get; set;}
        public Node Second {get; set;}
        public string Name {get; set;}
        public double Length {get; set;}
        public double Strength {get; set;}
    }
    
    class Node
    {
        public IList<Link> Links {get; set;}
        //...
    }
    
  4. 此实现的唯一问题是您应该仔细实施该算法,以避免在操作期间出现堆栈溢出异常。

    更新: