我正在设计一个应用程序,其中有链接和节点。链路的两端中的每一端都连接到一个节点,每个节点可以连接到多个链路。
自然有两种方法可以设计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的角度来看,您认为哪个更正确?
答案 0 :(得分:1)
我是否正确假设您正在尝试将图形存储在内存中?如果是这样,有三种方法可以存储它:
Link
的许多其他信息,我不建议这样做。最适合您的方法是合并这两种变体: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
{
public IList<Link> Links {get; set;}
//...
}
此实现的唯一问题是您应该仔细实施该算法,以避免在操作期间出现堆栈溢出异常。
更新: