我有这个工厂类,它将 aFoo
转换为Bar
对象列表。Foo 是一个非常复杂的对象,我将其展平为一个简单Bar
对象的列表。大约有 60 种不同的数据位可以从 aFoo
转换为 a Bar
。以下实现有效,但这里有一定的改进空间。
public class FooToBarsConverter
{
public List<Bar> Convert(Foo foo)
{
return Enum.GetValues(typeof(BarTypeEnum))
.Cast<BarTypeEnum>()
.Select(barType => CreateBar(foo, barType))
.Where(newBar => newBar != null)
.ToList();
}
public Bar CreateBar(Foo foo, BarTypeEnum barType)
{
switch (barType)
{
case BarTypeEnum.TypeA:
return CreateTypeA(foo);
case BarTypeEnum.TypeB:
return CreateTypeB(foo);
}
return null;
}
private Bar CreateTypeA(Foo foo)
{
return new Bar(...);
}
private Bar CreateTypeB(Foo foo)
{
return new Bar(...);
}
}
理想情况下,我希望避免每次添加新的 BarType 时都必须向交换机编写新案例。也许是类型和委托函数的字典,但这仍然需要各种映射?我可以利用该语言的任何功能来避免这种切换情况使编译器选择创建创建功能吗?
假设您不介意工厂方法是静态的,这确实会稍微整理一下,而无需创建大约 60 个子类来让类型系统为我完成工作。我认为,如果您也与工厂一起制作它,则不需要静力学,func
但我还没有走那么远。静态数据并没有特别困扰我,它只是数据转置
private static readonly IDictionary<BarTypeEnum, Func<Foo, Bar>>
CreateLookup = new Dictionary<BarTypeEnum, Func<Foo, Bar>>
{
{ BarTypeEnum.TypeA, CreateTypeA },
{ BarTypeEnum.TypeB, CreateTypeB }
};
public Bar Create(Foo foo, BarTypeEnum barType)
{
Func<Foo, Bar> createDelegate;
CreateLookup.TryGetValue(barType, out createDelegate);
return createDelegate != null ? createDelegate(foo) : null;
}
private static Bar CreateTypeA(Foo foo) { ... }
private static Bar CreateTypeB(Foo foo) { ... }