【发布时间】:2019-10-17 22:23:35
【问题描述】:
我想解析一个如下所示的 csv 文件。 CSV 文件包含两种不同的类型:行星和小行星。这两种类型都有一些独特的属性。
我创建了一个 Planet 类和一个 Asteroid 类,它们都继承自抽象 SpaceObject 类。我创建了一个解析器类,它将我的 csv 文件解析为一个 SpaceObjects 列表。不幸的是,我的课程包含重复的代码,而这正是我要避免的。
我的代码:
switch (ReadStringFromCellBasedOnHeader("type"))
{
case "Asteroid":
var asteroid = new Asteroid();
asteroid.Position = new Vector2D(ReadDoubleFromCellBasedOnHeader("x"), ReadDoubleFromCellBasedOnHeader("y"));
asteroid.Speed = new Vector2D(ReadDoubleFromCellBasedOnHeader("vx"), ReadDoubleFromCellBasedOnHeader("vy"));
asteroid.Radius = ReadDoubleFromCellBasedOnHeader("radius");
asteroid.Color =
(Color?)ColorConverter.ConvertFromString(ReadStringFromCellBasedOnHeader("color")) ?? Color.FromRgb(0, 0, 0);
break;
case "Planet":
var planet = new Planet();
planet.Name = ReadStringFromCellBasedOnHeader("name");
planet.Position = new Vector2D(ReadDoubleFromCellBasedOnHeader("x"), ReadDoubleFromCellBasedOnHeader("y"));
planet.Speed = new Vector2D(ReadDoubleFromCellBasedOnHeader("vx"), ReadDoubleFromCellBasedOnHeader("vy"));
planet.Neighbours.AddRange(ReadStringFromCellBasedOnHeader("neighbours").Split(','));
planet.Radius = ReadDoubleFromCellBasedOnHeader("radius");
planet.Color =
(Color?)ColorConverter.ConvertFromString(ReadStringFromCellBasedOnHeader("color")) ?? Color.FromRgb(0, 0, 0);
break;
default:
throw new Exception("Unknown SpaceObject Type");
}
string ReadStringFromCellBasedOnHeader(string header)
{
return fields[columnDictionary[header]];
}
double ReadDoubleFromCellBasedOnHeader(string header)
{
return StringConverter.ToDouble(ReadStringFromCellBasedOnHeader(header));
}
正如您所见,我的 Planet 和 Asteroid 对象完全相同,除了 Planet 包含两个独特的属性(名称和邻居)。我在考虑使用 Factory 或 Builder 模式,但我不想创建一个有九个参数的函数。如何以优雅的方式避免重复代码?
【问题讨论】:
标签: c# design-patterns