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; }
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; }