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