我正在考虑重构一个开源项目Afterthought,使其使用起来更直观。基本思想是,在 Afterthought 中创建修改的开发人员将修改特定的 .NET 类型,并有机会修改类型本身以及属性、方法、事件、构造函数等列表(树)。我在内部使用的 API微软 CCI 元数据在他们的 API 中广泛使用了访问者模式,所以我在 Afterthought 中采用了类似的方法,如下所示:
public override void Amend()
{
// Amend the type here, add properties, add methods, etc.
}
public override void Amend<TProperty>(Property<TProperty> property)
{
// Amend properties here
if (property.Name == "Result")
{
// Modify Result property
}
}
public override void Amend(Method method)
{
// Amend methods here
if (method.Name == "Add")
{
// Modify Add method
method.Implement(TInstance instance, int x, int y) => x + y);
}
}
但是,我发现访问者模式实际上最终会将解决目标问题的代码(例如检测类库)重新分配到一系列不同的方法中,这些方法专注于树的各个方面。对于创建 API 的开发人员来说,这很容易实现,但消费者必须以某种不自然的方式将他们的代码分散开来。所以我提出了一个问题,与仅将树公开为列表并利用 LINQ 样式的方法相比,vistor 模式有什么好处?
这是我正在考虑的替代语法:
public override void Amend()
{
// Do everything here, possibly calling methods just to organize the code
// Modify Add method
Methods.Named("Add").WithParams<int, int>()
.Implement((instance, x, y) => x + y);
}
因此,在这种情况下,修正案的作者可以通过与公开 fluent/LINQ API 而不是覆盖方法的列表交互,将所有代码写在一个地方(或他们选择的地方)。显然这种方法的性能稍差(更多迭代等),但除此之外,还有什么缺点?