让我们想象一个图结构。每个节点都有输入和输出,一个节点的输出可以通过连接连接到另一个节点输入。如下所示:
public class Node
{
public IReadOnlyList<Input> Inputs
{
get { ... }
}
public IReadOnlyList<Output> Outputs
{
get { ... }
}
}
public class Connection
{
public Connection(Input input, Output output)
{
...
}
}我想将这个结构存储在某种文件中。如果我想存储连接,我必须获取信息,哪个节点是输入和输出的所有者-否则我以后将无法恢复它。
最简单的方法是将节点存储在输入和输出中。但是IMO破坏了封装,因为输入和输出不应该知道使用它们的节点的任何信息。另一种解决方案是强制搜索所有节点,以找到一个拥有这些元素的节点。但是它太脏了,我不喜欢这个解决方案。
我如何才能在不破坏封装的情况下解决这个问题?
发布于 2014-03-16 00:50:48
假设两个节点之间的连接与输入和输出之间的连接一样多,那么将这两个节点以及输入和输出存储在connection对象中可能是合理的。这就是:
public class Connection
{
public Connection(Node inNode, Input input, Node outNode, Output output)
{
...
}
}这是比理想情况下更多的构造函数参数,但是您描述Connection类的方式确实表明它应该知道它正在连接哪些节点以及要使用哪些输入和输出。
发布于 2014-03-16 01:29:34
查看你的代码,这是我想到的:

(方框表示连接对象)
如果你不想改变你的代码,这是一个可能的文件结构:
#CONNECTIONS
0 16
1 21
2 20
3 17
4 18
5 19
6 12
7 14
8 15
9 13
10 11
#NODES
0 16 12 14,9 10
1 11 13,8 2 7
3 17 21, 6
4 18,0
5 15,5 3
6 19 20,1 4#CONNECTIONS部分:
存储输入输出边的id。当然,您可以添加有关边的更多信息(weight...etc)。就像这样
10 11 0.4238 82 "weight"#NODES部分:
node_id <inputs>*,<outputs>*为了加载它,您可以将边存储在字典中,并可以稍后将它们添加到相应的节点。
https://stackoverflow.com/questions/22426056
复制相似问题