Я хочу проанализировать CSV-файл, как показано ниже. Файл CSV содержит два разных типа: Планета и Астероид. Оба эти типа имеют некоторые уникальные свойства.
Я создал класс Planet и класс Asteroid, которые оба наследуют от абстрактного класса SpaceObject. Я создал класс Parser, который анализирует мой CSV-файл в списке объектов SpaceObject. К сожалению, мой класс содержит повторяющийся код, и это то, чего я пытаюсь избежать.
Мой код:
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 абсолютно одинаковы, кромеэта Планета содержит два уникальных свойства (имя и соседи). Я думал об использовании шаблона Factory или Builder, но я не хочу создавать функцию с девятью параметрами. Как я могу избежать этого повторяющегося кода элегантным способом?