Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 公共链接应该拥有两个节点,还是每个节点都应该拥有一个公共链接?_C#_Oop_Graph_Orm - Fatal编程技术网

C# 公共链接应该拥有两个节点,还是每个节点都应该拥有一个公共链接?

C# 公共链接应该拥有两个节点,还是每个节点都应该拥有一个公共链接?,c#,oop,graph,orm,C#,Oop,Graph,Orm,我正在设计一个有链接和节点的应用程序。链路两端的每一端连接到一个节点,每个节点可以连接到多个链路 设计链接类和节点类自然有两种方法。第一:链接自己的节点。节点将不知道链接 class Link { public Node First {get; set;} public Node Second {get; set;} public string Name {get; set;} public double Length {get; set;} public

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

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

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
{
    // ...
}
第二:节点拥有链接。链接将没有点头的知识

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;}
    //...
}
类链接
{
公共字符串名称{get;set;}
公共双长度{get;set;}
公共双强度{get;set;}
}
类节点
{  
公共IList链接{get;set;}
//...
}
我不赞成第二种设计,因为它意味着可能有两个以上的节点连接到同一条链路。此外,它不允许节点实例找到其链接的伙伴。如果是这种情况,则很难取消链接(想象一下,将节点的
链接
属性设置为空-其伙伴仍将持有对
链接的引用

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


从面向对象的角度来看,您认为哪一个更正确?

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

  • 链接(边缘)列表:您使用的是第一种方法,但无法检查两个节点是否快速连接
  • 矩阵:您正在为地图存储二维数组(或字典),但由于您有许多关于
    链接的附加信息,我不建议这样做
  • 最适合您的方法是将两种变体结合起来:要么是
    链接
    要么是
    节点
    相互了解:

    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;}
        //...
    }
    
    类链接
    {
    公共节点第一个{get;set;}
    第二个公共节点{get;set;}
    公共字符串名称{get;set;}
    公共双长度{get;set;}
    公共双强度{get;set;}
    }
    类节点
    {
    公共IList链接{get;set;}
    //...
    }
    
  • 此实现的唯一问题是,您应该小心地实现该算法,以避免在操作期间出现stackoverflow异常

    更新:

    • 关于堆栈溢出

    我不认为这两种方法都是“不正确的”——选择一种更符合您的问题的方法。请记住,在第二个示例中,节点可以有多个链接,因此应该有一个
    列表或任何其他集合作为其属性之一。我同意@AlexeiLevenkov的观点:这两种方法都不正确。还有第三个选项:顶级
    映射
    对象“拥有”链接
    s和节点
    s,并处理所有操作。
    链接
    的责任是什么?如果它只提供节点之间的连接,那么您可以在节点中使用
    List
    。@RoadieRich这不是他的要求。他询问如何使用第一个选项或第二个选项实现
    链接
    节点
    类。在这两种情况下,都可以实现
    Map
    类。事实上,我正在尝试使用ORM将图形存储在关系数据库中:)更新了答案,希望这有帮助