C# 如何保持封装?

C# 如何保持封装?,c#,graph,architecture,encapsulation,C#,Graph,Architecture,Encapsulation,让我们想象一个图形结构。每个节点都有输入和输出,一个节点的输出可以通过连接连接到另一个节点输入。大概是这样的: public class Node { public IReadOnlyList<Input> Inputs { get { ... } } public IReadOnlyList<Output> Outputs { get { ... } } } public class C

让我们想象一个图形结构。每个节点都有输入和输出,一个节点的输出可以通过连接连接到另一个节点输入。大概是这样的:

public class Node
{
    public IReadOnlyList<Input> Inputs
    {
        get { ... }
    }

    public IReadOnlyList<Output> Outputs
    {
        get { ... }
    }
}

public class Connection
{
    public Connection(Input input, Output output)
    {
        ...
    }
}
公共类节点
{
公共IReadOnlyList输入
{
获取{…}
}
公共IReadOnlyList输出
{
获取{…}
}
}
公共类连接
{
公共连接(输入、输出)
{
...
}
}
我想把这个结构存储在某种文件中。如果我想存储连接,我必须获取信息,哪个节点是输入和输出的所有者,否则我以后就无法恢复

最简单的方法是将节点存储在输入和输出中。但IMO破坏了封装,因为输入和输出不应该知道使用它们的节点的任何信息。另一种解决方案是bruteforce—搜索所有节点以找到一个拥有这些元素的节点。但是它太脏了,我不喜欢这个解决方案


如何在不破坏封装的情况下解决此问题?

如果两个节点之间的连接与输入和输出之间的连接一样多,那么将两个节点以及输入和输出存储在连接对象中可能是合理的。即:

public class Connection
{
    public Connection(Node inNode, Input input, Node outNode, Output output)
    {
        ...
    }
}

这是比理想情况下更多的构造函数参数,但您描述Connection类的方式确实表明它应该知道连接的节点以及要使用的输入和输出。

查看您的代码,我想到的是:

(框表示连接对象)

如果您不想更改代码,这可能是文件的结构:

#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
#连接
部分:

node_id <inputs>*,<outputs>*
存储输入输出边的id。当然,您可以在这里添加更多关于边缘的信息(重量等)。差不多

10 11 0.4238 82 "weight"
#节点
部分:

node_id <inputs>*,<outputs>*
node_id**

要加载它,可以将边存储在字典中,以后可以将它们添加到相应的节点。

看起来很合理。我得考虑一下。