Sto scrivendo un semplice codice relativo agli scacchi con l'intenzione di scriverlo chiaramente (le prestazioni non contano affatto). E questo metodo che ho non mi sembra affatto pulito:
public static Piece GetClosestPiece(Square squareFrom, Direction direction)
{
//TODO: rework this mess
switch (direction)
{
case Direction.Top:
return
_pieces.Where(p => p.Square.OnVerticalWith(squareFrom))
.OrderBy(p => p.Square.Y)
.First(p => p.Square.Y > squareFrom.Y);
case Direction.Bottom:
return
_pieces.Where(p => p.Square.OnVerticalWith(squareFrom))
.OrderByDescending(p => p.Square.Y)
.First(p => p.Square.Y < squareFrom.Y);
case Direction.Right:
<...>
case Direction.TopLeft:
return
_pieces.Where(p => p.Square.OnBackslashWith(squareFrom))
.OrderByDescending(p => p.Square.X)
.First(p => p.Square.X < squareFrom.X);
default:
throw new InvalidEnumArgumentException();
}
}
Conservo i pezzi come lista, quindi, qui sto usando LINQ per trovare il pezzo più vicino a un dato quadrato in una determinata direzione.
- Le frasi switch / if di queste dimensioni (qui 8 casi totali) presentano sempre un odore di codice?
- C'è un modo per refactare questa parte solo, o dovrei prendere in considerazione la revisione della progettazione dell'intera soluzione?