问题描述
我有一个名为 Binary
的对象,它包含一个只是字符串的引用数组。在解析过程之后,这些引用将产生其他 Binary
对象,当然这些二进制文件可能包含引用等。
看来我正在处理复合模式(复合 Binary
包含另一个复合 Binary
或叶 Binary
)。
但是,我对如何以更简洁的方式构建这种复合材料感到困惑。我有以下方法,它将 Binary
作为输入并执行深度优先遍历。
[NotNull] public Binary ResolveReferences([NotNull] Binary entryPointBinary)
{
var compositeBuilder = new CompositeBuilder();
compositeBuilder.AddBinary(entryPointBinary);
stack.Push(entryPointBinary);
while (stack.Any())
{
stack.TryPop(out var currentBinary);
if (!visited.Contains(currentBinary)) visited.Add(currentBinary);
if (currentBinary.References != null)
{
foreach (var reference in currentBinary.References)
{
var resolvedBinary = GetResolvedReference(reference);
if (!visited.Contains(resolved))
stack.Push(resolved);
compositeBuilder.AddBinary(currentBinary,resolved);
}
}
}
return compositeBuilder.GetResult();
如您所见,这种方法远未尊重单一职责主体。它执行引用解析和构建组合,并在二进制文件上使用 DFS 进行迭代。
我尝试做的:
为了清理这个方法,我想,我会使用迭代器对二进制文件和访问者执行 DFS 来解析每个依赖项的引用。因此,我可以解耦解析逻辑并使用另一个访问者构建每个 Binary
的组合,其中包含一个 Binary
(根)和一个由解析引用产生的二进制文件。
您可以使用 Visitor 和 Iterator 来遍历复杂的数据 构造并对其元素执行一些操作,即使它们 都有不同的班级。
但是,我发现这与以下引用所述的访问者模式不对应
如果你对每个元素应用相同的操作,或者所有的 元素属于同一类型,您不需要访问者。你需要一个 当您想根据访问者选择不同的操作时 元素类型。
我的问题是:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)