MSDN.WhiteKnight - Stack Overflow answers
Ответ на "c# Как правильно реализовать исключение"
Answer 1035112
Пожалуйста скажите правильно ли я всё делаю?
Если я правильно понимаю смысл кода - нет, неправильно. Вы собираетесь бросать исключение ArgumentException, когда пользователь пытается выполнить ход, не соответствующий тому, как ходит фигура по правилам шахмат. Это не выглядит исключительной ситуацией. Зачем выполнять достаточно тяжелую для CLR операцию проброса исключения для того, что можно решить простым возвратом значения? Я понимаю проброс ArgumentException, когда координаты за пределами доски, так как это обычно означает баг в коде, в этом случае можно бросать исключение.
Другое замечание: CheckMove - неудачное наименование для метода проверки, неясно, что именно означает true - корректность или некорректность.
По мне должно быть как-то так:
class MoveResult { public bool IsValid { get; set; } public string Message { get; set; } } abstract class ChessPiece { protected int x, y; public virtual MoveResult MakeMove(int x, int y) { AssertCoordinatesValid(x, y); if (!IsMoveValid(x, y)) { return new MoveResult { IsValid = false, Message = "This move is not allowed for " + this.GetType().ToString() }; } this.x = x; this.y = y; return new MoveResult { IsValid = true, Message = "" }; } static void AssertCoordinatesValid(int x, int y) { if (!(x >= 0 && x <= 8 && y >= 0 && y <= 8)) { throw new ArgumentException("Coordinates cannot be less than 0 or greater than 8"); } } protected abstract bool IsMoveValid(int x, int y); } class Rock : ChessPiece { protected override bool IsMoveValid(int x, int y) { return (this.x == x || this.y == y); } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.