private bool _TryParseDistance(string[] argsText, out AbstractCommand cmd) { // здесь может некорректный формат команды cmd = new BadCommand(this.currCmdText); if (argsText.Length != 4) return false; // на каждую точку по две координаты Point[] points = new Point[argsText.Length / 2]; for (int i = 0; i < points.Length; ++i) if (!_TryParsePoint(argsText[2 * i], argsText[2 * i + 1], ref points[i])) return false; cmd = new DistanceCommand(points[0], points[1]); return true; }
private bool _TryParseTriangle(CommandKind cmdKind, string[] argsText, out AbstractCommand cmd) { // здесь может некорректный формат команды cmd = new BadCommand(this.currCmdText); // команда работы с треугольником принимает лидо длины строн (3 аргумента), // либо координаты вершин (6 аргументов) if (argsText.Length != 3 && argsText.Length != 6) return false; TriangleCommand trnglCmd = null; // создаём конкретную команду switch (cmdKind) { case CommandKind.TRIANGLE_AREA: trnglCmd = new TriangleAreaCommand(); break; case CommandKind.TRIANGLE_PERIM: trnglCmd = new TrianglePerimCommand(); break; case CommandKind.TRIANGLE_IS_RIGHT: trnglCmd = new TriangleIsRightCommand(); break; case CommandKind.TRIANGLE_IS_EQUIL: trnglCmd = new TriangleIsRightCommand(); break; default: Debug.Assert(false, "_TryParseTriangle must be called only for triangle commands"); break; } // инициализируем данными треугольника if (argsText.Length == 3) { double[] sides; if (!_TryParseTriangleSides(argsText, out sides)) return false; trnglCmd.Init(sides); } else { Debug.Assert(argsText.Length == 6, "This case only for 6 args-coordinates"); Point[] vertices; if (!_TryParseTriangleVertices(argsText, out vertices)) return false; trnglCmd.Init(vertices); } cmd = trnglCmd; return true; }
public bool Parse(string cmdText, out AbstractCommand cmd) { Debug.Assert(cmdText == PrepareCommand(cmdText), "Parse method must be called after preparing of command"); currCmdText = cmdText; if (cmdText == "quit") { cmd = new QuitCommand(); return true; } else if (cmdText == "help") { cmd = new HelpCommand(); return true; } // разбиваем всю команду на составляющие элементы string[] allParts = cmdText.Split(new char[] { DELIM }, StringSplitOptions.RemoveEmptyEntries); Debug.Assert(allParts.Length > 0, "Empty command must not be here"); // по умолчанию результат -- неизвестная команда cmd = new UnknownCommand(cmdText); // название команды string cmdName = allParts[0]; CommandKind cmdType; // команда может быть неизвестна if (!_TryParseCommand(cmdName, out cmdType)) return false; Debug.Assert(cmdType != CommandKind.UNDEFINED, "CommandKind.UNDEFINED must be cought by _TryParseCommand (it should returns false)"); // оставшиеся кусочки команды string[] args = allParts.Skip(1).ToArray(); switch (cmdType) { case CommandKind.DISTANCE: return _TryParseDistance(args, out cmd); // остались только команды треугольника default: return _TryParseTriangle(cmdType, args, out cmd); } }