The design of your classes already has some duplication; your Line
class's definition of a Point
is duplicated in X1
, X2
, etc.
If your design looks something like this:
class Point
{
public int X { get; set; }
public int Y { get; set; }
}
class Line
{
public Point Start { get; set; }
public Point End { get; set; }
public IEnumerable<Point> Endpoints
{
get
{
return new[] { Start, End };
}
}
}
You could implement your calculation like this:
class ExtremetiesDeterminer
{
private IEnumerable<Point> endpoints;
public Line DetermineBoundaries(IEnumerable<Line> complicatedShapeLines)
{
endpoints = complicatedShapeLines.SelectMany(line => line.Endpoints);
return new Line
{
Start = FindExtremety(Enumerable.Min),
End = FindExtremety(Enumerable.Max)
};
}
private Point FindExtremety(
SingleAxisExtremetyDeterminer findSingleAxisExtremety)
{
return new Point
{
X = findSingleAxisExtremety(endpoints, point => point.X),
Y = findSingleAxisExtremety(endpoints, point => point.Y)
};
}
public delegate int SingleAxisExtremetyDeterminer(
IEnumerable<Point> points, Func<Point, int> getCoordinate);
}
Note that this reduces the duplication. You would probably want to adjust this depending on how this interacts with the rest of your code.