Слишком много петель в рисунок приложение


У меня есть метод, который имеет много циклов:

private void update(double depth)
        {

            Console.WriteLine("update with level " + depth);

            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate()
                {


            List<Grid> grids = new List<Grid>();

            Dependencies.Children.Clear();

            Grid g = new Grid();
            //Canvas.SetZIndex(g, 100);
            g.Width = 50;
            g.Height = 50;
            g.Tag = focus;

            Ellipse e = new Ellipse();
            e.Width = 50;
            e.Height = 50;
            e.Fill = Brushes.Red;
            if (depth == 1)
            {
                Canvas.SetTop(g, 163);
            }
            else if (depth == 2)
            {
                Canvas.SetTop(g, 108);
            }
            else if (depth == 3)
            {
                Canvas.SetTop(g, 81);
            }
            else if (depth == 4)
            {
                Canvas.SetTop(g, 65);
            }
            else if (depth == 5)
            {
                Canvas.SetTop(g, 54);
            }
            else if (depth == 6)
            {
                Canvas.SetTop(g, 46);
            }
            Canvas.SetLeft(g, 500);

            g.Children.Add(e);

            Viewbox box = new Viewbox();
            box.Width = e.Width;
            box.Height = e.Height;


            TextBox txt = new TextBox();
            txt.Text = focus.getName();
            box.Child = txt;
            txt.Background = Brushes.Transparent;
            txt.BorderBrush = Brushes.Transparent;

            g.Children.Add(box);



            grids.Add(g);

            List<SourceFile> list = new List<SourceFile>();

            list = focus.getInvocations();

            int counter = 1;
            foreach (SourceFile sf in list)
            {
                Grid g1 = new Grid();
                //Canvas.SetZIndex(g, 101);
                g1.Width = 50;
                g1.Height = 50;
                g1.Tag = sf;

                Ellipse e1 = new Ellipse();
                //Dependencies.Children.Add(e1);
                sf.setGrid(g1);
                e1.Width = 50;
                e1.Height = 50;
                e1.Fill = Brushes.Red;

                g1.Children.Add(e1);

                if (depth == 1)
                {
                    Canvas.SetTop(g1, 488);
                }
                else if (depth == 2)
                {
                    Canvas.SetTop(g1, 324);
                }
                else if (depth == 3)
                {
                    Canvas.SetTop(g1, 244);
                }
                else if (depth == 4)
                {
                    Canvas.SetTop(g1, 195);
                }
                else if (depth == 5)
                {
                    Canvas.SetTop(g1, 163);
                }
                else if (depth == 6)
                {
                    Canvas.SetTop(g1, 139);
                }
                Canvas.SetLeft(g1, counter * (1000 / (list.Count + 1) ));

                Viewbox box1 = new Viewbox();
                box1.Width = g1.Width;
                box1.Height = g1.Height;

                TextBox txt1 = new TextBox();
                txt1.Text = sf.getName();
                txt1.Background = Brushes.Transparent;
                txt1.BorderBrush = Brushes.Transparent;

                box1.Child = txt1;
                g1.Children.Add(box1);

                Line l = new Line();
                //Canvas.SetZIndex(l, 1);
                l.Stroke = Brushes.Green;
                l.StrokeThickness = 10;
                Binding x1 = new Binding(); x1.Path = new PropertyPath(Canvas.LeftProperty);
                x1.Converter = new MyConverter();
                x1.ConverterParameter = g;
                Binding y1 = new Binding(); y1.Path = new PropertyPath(Canvas.TopProperty);
                y1.Converter = new MyConverter();
                y1.ConverterParameter = g;
                Binding x2 = new Binding(); x2.Path = new PropertyPath(Canvas.LeftProperty);
                x2.Converter = new MyConverter();
                x2.ConverterParameter = g1;
                Binding y2 = new Binding(); y2.Path = new PropertyPath(Canvas.TopProperty);
                y2.Converter = new MyConverter();
                y2.ConverterParameter = g1;
                x1.Source = y1.Source = g;
                x2.Source = y2.Source = g1;
                l.SetBinding(Line.X1Property, x1);
                l.SetBinding(Line.Y1Property, y1);
                l.SetBinding(Line.X2Property, x2);
                l.SetBinding(Line.Y2Property, y2);
                Dependencies.Children.Add(l);
                l.Tag = new Call(focus, sf);
                Contacts.AddPreviewContactDownHandler(l, OnLineDown);
                counter++;

                grids.Add(g1);

                SizeChangedEventHandler act = (Object s, SizeChangedEventArgs args) =>
                {
                    BindingOperations.GetBindingExpressionBase(l, Line.X1Property).UpdateTarget();
                    BindingOperations.GetBindingExpressionBase(l, Line.Y1Property).UpdateTarget();
                    BindingOperations.GetBindingExpressionBase(l, Line.X2Property).UpdateTarget();
                    BindingOperations.GetBindingExpressionBase(l, Line.Y2Property).UpdateTarget();
                };

                g.SizeChanged += act;
                g1.SizeChanged += act;
            }


            int counter2 = 1;
            if (depth >= 2)
            {

                int invocCount = 0;

                foreach (SourceFile s in list)
                {
                    foreach (SourceFile source in s.getInvocations())
                    {
                        invocCount = invocCount + s.getInvocations().Count;
                    }
                }

                Console.WriteLine(invocCount);

                foreach (SourceFile s in list)
                {
                    foreach (SourceFile source in s.getInvocations())
                    {

                        Console.WriteLine("`Found invocation of " + s.getName() + ": " + source.getName());

                        Grid g1 = new Grid();
                        g1.Width = 50;
                        g1.Height = 50;

                        Ellipse e1 = new Ellipse();
                       // Canvas.SetZIndex(g1, 102);
                        grids.Add(g1);
                        e1.Width = 50;
                        e1.Height = 50;
                        e1.Fill = Brushes.Red;
                        source.setGrid(g1);
                        g1.Tag = source;

                        g1.Children.Add(e1);

                        if (depth == 2)
                        {
                            Canvas.SetTop(g1, 540);
                        }
                        else if (depth == 3)
                        {
                            Canvas.SetTop(g1, 406);
                        }
                        else if (depth == 4)
                        {
                            Canvas.SetTop(g1, 325);
                        }
                        else if (depth == 5)
                        {
                            Canvas.SetTop(g1, 271);
                        }
                        else if (depth == 6)
                        {
                            Canvas.SetTop(g1, 232);
                        }

                        Canvas.SetLeft(g1, counter2 * (1000 / (invocCount + 1)));

                        Viewbox box1 = new Viewbox();
                        box1.Width = g1.Width;
                        box1.Height = g1.Height;

                        TextBox txt1 = new TextBox();
                        txt1.Text = source.getName();
                        txt1.Background = Brushes.Transparent;
                        txt1.BorderBrush = Brushes.Transparent;

                        box1.Child = txt1;
                        g1.Children.Add(box1);

                        Line l = new Line();
                        //Canvas.SetZIndex(l, 2);
                        l.Stroke = Brushes.Green;
                        l.StrokeThickness = 10;
                        Binding x1 = new Binding(); x1.Path = new PropertyPath(Canvas.LeftProperty);
                        x1.Converter = new MyConverter();
                        x1.ConverterParameter = s.getGrid();
                        Binding y1 = new Binding(); y1.Path = new PropertyPath(Canvas.TopProperty);
                        y1.Converter = new MyConverter();
                        y1.ConverterParameter = s.getGrid();
                        Binding x2 = new Binding(); x2.Path = new PropertyPath(Canvas.LeftProperty);
                        x2.Converter = new MyConverter();
                        x2.ConverterParameter = g1;
                        Binding y2 = new Binding(); y2.Path = new PropertyPath(Canvas.TopProperty);
                        y2.Converter = new MyConverter();
                        y2.ConverterParameter = g1;
                        x1.Source = y1.Source = findGrid(grids, s, source);
                        x2.Source = y2.Source = g1;
                        l.SetBinding(Line.X1Property, x1);
                        l.SetBinding(Line.Y1Property, y1);
                        l.SetBinding(Line.X2Property, x2);
                        l.SetBinding(Line.Y2Property, y2);
                        Dependencies.Children.Add(l);
                        l.Tag = new Call(s, source);
                        Contacts.AddPreviewContactDownHandler(l, OnLineDown);

                        counter2++;

                        SizeChangedEventHandler act = (Object o, SizeChangedEventArgs args) =>
                        {
                            BindingOperations.GetBindingExpressionBase(l, Line.X1Property).UpdateTarget();
                            BindingOperations.GetBindingExpressionBase(l, Line.Y1Property).UpdateTarget();
                            BindingOperations.GetBindingExpressionBase(l, Line.X2Property).UpdateTarget();
                            BindingOperations.GetBindingExpressionBase(l, Line.Y2Property).UpdateTarget();
                        };

                        source.getGrid().SizeChanged += act;
                        g1.SizeChanged += act;
                    }
                }
            }


            int counter3 = 1;
            if (depth >= 3)
            {

                int invocCount = 0;

                foreach (SourceFile s in list)
                {
                    foreach (SourceFile source in s.getInvocations())
                    {
                        foreach (SourceFile s1 in source.getInvocations())
                        {
                            invocCount = invocCount + source.getInvocations().Count;
                        }
                    }
                }

                foreach (SourceFile s in list)
                {
                    foreach (SourceFile source in s.getInvocations())
                    {
                        foreach (SourceFile s1 in source.getInvocations())
                        {
                            Grid g1 = new Grid();
                            grids.Add(g1);
                            g1.Width = 50;
                            g1.Height = 50;
                            g1.Tag = s1;
                            Ellipse e1 = new Ellipse();

                            e1.Width = 50;
                            e1.Height = 50;
                            e1.Fill = Brushes.Red;
                            s1.setGrid(g1);
                            g1.Children.Add(e1);

                            if (depth == 3)
                            {
                                Canvas.SetTop(g1, 569);
                            }
                            else if (depth == 4)
                            {
                                Canvas.SetTop(g1, 455);
                            }
                            else if (depth == 5)
                            {
                                Canvas.SetTop(g1, 379);
                            }
                            else if (depth == 6)
                            {
                                Canvas.SetTop(g1, 325);
                            }
                            Canvas.SetLeft(g1, counter3 * (1000 / (invocCount + 1)));

                            Viewbox box1 = new Viewbox();
                            box1.Width = g1.Width;
                            box1.Height = g1.Height;

                            TextBox txt1 = new TextBox();
                            txt1.Background = Brushes.Transparent;
                            txt1.BorderBrush = Brushes.Transparent;
                            txt1.Text = s1.getName();
                            box1.Child = txt1;
                            g1.Children.Add(box1);

                            Line l = new Line();
                            //Canvas.SetZIndex(l, 2);
                            l.Stroke = Brushes.Green;
                            l.StrokeThickness = 10;
                            Binding x1 = new Binding(); x1.Path = new PropertyPath(Canvas.LeftProperty);
                            x1.Converter = new MyConverter();
                            x1.ConverterParameter = source.getGrid();
                            Binding y1 = new Binding(); y1.Path = new PropertyPath(Canvas.TopProperty);
                            y1.Converter = new MyConverter();
                            y1.ConverterParameter = source.getGrid();
                            Binding x2 = new Binding(); x2.Path = new PropertyPath(Canvas.LeftProperty);
                            x2.Converter = new MyConverter();
                            x2.ConverterParameter = g1;
                            Binding y2 = new Binding(); y2.Path = new PropertyPath(Canvas.TopProperty);
                            y2.Converter = new MyConverter();
                            y2.ConverterParameter = g1;
                            x1.Source = y1.Source = findGrid(grids, source, s1);
                            x2.Source = y2.Source = g1;
                            l.SetBinding(Line.X1Property, x1);
                            l.SetBinding(Line.Y1Property, y1);
                            l.SetBinding(Line.X2Property, x2);
                            l.SetBinding(Line.Y2Property, y2);
                            Dependencies.Children.Add(l);
                            l.Tag = new Call(source, s1);
                            Contacts.AddPreviewContactDownHandler(l, OnLineDown);

                            counter3++;

                            SizeChangedEventHandler act = (Object o, SizeChangedEventArgs args) =>
                            {
                                BindingOperations.GetBindingExpressionBase(l, Line.X1Property).UpdateTarget();
                                BindingOperations.GetBindingExpressionBase(l, Line.Y1Property).UpdateTarget();
                                BindingOperations.GetBindingExpressionBase(l, Line.X2Property).UpdateTarget();
                                BindingOperations.GetBindingExpressionBase(l, Line.Y2Property).UpdateTarget();
                            };

                            s1.getGrid().SizeChanged += act;
                            g1.SizeChanged += act;
                        }
                    }
                }
            }


         int counter4 = 1;
         if (depth >= 4)
         {

             int invoCount = 0;
             foreach (SourceFile s in list)
             {
                 foreach (SourceFile source in s.getInvocations())
                 {
                     foreach (SourceFile s1 in source.getInvocations())
                     {
                         foreach (SourceFile s2 in s1.getInvocations())
                         {
                             invoCount = invoCount + s1.getInvocations().Count;
                         }
                     }
                 }
             }

             foreach (SourceFile s in list)
             {
                 foreach (SourceFile source in s.getInvocations())
                 {
                     foreach (SourceFile s1 in source.getInvocations())
                     {
                         foreach (SourceFile s2 in s1.getInvocations())
                         {

                             Grid g1 = new Grid();
                             grids.Add(g1);
                             g1.Width = 50;
                             g1.Height = 50;
                             g1.Tag = s2;
                             Ellipse e1 = new Ellipse();

                             e1.Width = 50;
                             e1.Height = 50;
                             e1.Fill = Brushes.Red;
                             s2.setGrid(g1);

                             g1.Children.Add(e1);

                             if (depth == 4)
                             {
                                 Canvas.SetTop(g1, 585);
                             }
                             else if (depth == 5)
                             {
                                 Canvas.SetTop(g1, 488);
                             }
                             else if (depth == 6)
                             {
                                 Canvas.SetTop(g1, 418);
                             }
                             Canvas.SetLeft(g1, counter4 * (1000 / (invoCount + 1)));

                             Viewbox box1 = new Viewbox();
                             box1.Width = g1.Width;
                             box1.Height = g1.Height;

                             TextBox txt1 = new TextBox();
                             txt1.Background = Brushes.Transparent;
                             txt1.BorderBrush = Brushes.Transparent;
                             txt1.Text = s2.getName();
                             box1.Child = txt1;
                             g1.Children.Add(box1);

                             Line l = new Line();
                             //Canvas.SetZIndex(l, 2);
                             l.Stroke = Brushes.Green;
                             l.StrokeThickness = 10;
                             Binding x1 = new Binding(); x1.Path = new PropertyPath(Canvas.LeftProperty);
                             x1.Converter = new MyConverter();
                             x1.ConverterParameter = s1.getGrid();
                             Binding y1 = new Binding(); y1.Path = new PropertyPath(Canvas.TopProperty);
                             y1.Converter = new MyConverter();
                             y1.ConverterParameter = s1.getGrid();
                             Binding x2 = new Binding(); x2.Path = new PropertyPath(Canvas.LeftProperty);
                             x2.Converter = new MyConverter();
                             x2.ConverterParameter = g1;
                             Binding y2 = new Binding(); y2.Path = new PropertyPath(Canvas.TopProperty);
                             y2.Converter = new MyConverter();
                             y2.ConverterParameter = g1;
                             x1.Source = y1.Source = findGrid(grids, s1, s2);
                             x2.Source = y2.Source = g1;
                             l.SetBinding(Line.X1Property, x1);
                             l.SetBinding(Line.Y1Property, y1);
                             l.SetBinding(Line.X2Property, x2);
                             l.SetBinding(Line.Y2Property, y2);
                             Dependencies.Children.Add(l);
                             l.Tag = new Call(s1, s2);
                             Contacts.AddPreviewContactDownHandler(l, OnLineDown);
                             counter4++;

                             SizeChangedEventHandler act = (Object o, SizeChangedEventArgs args) =>
                             {
                                 BindingOperations.GetBindingExpressionBase(l, Line.X1Property).UpdateTarget();
                                 BindingOperations.GetBindingExpressionBase(l, Line.Y1Property).UpdateTarget();
                                 BindingOperations.GetBindingExpressionBase(l, Line.X2Property).UpdateTarget();
                                 BindingOperations.GetBindingExpressionBase(l, Line.Y2Property).UpdateTarget();
                             };

                             s2.getGrid().SizeChanged += act;
                             g1.SizeChanged += act;
                         }
                     }
                 }
             }
         }



      int counter5 = 1;
      if (depth >= 5)
      {

          int invoCount = 0;

          foreach (SourceFile s in list)
          {
              foreach (SourceFile source in s.getInvocations())
              {
                  foreach (SourceFile s1 in source.getInvocations())
                  {
                      foreach (SourceFile s2 in s1.getInvocations())
                      {
                          foreach (SourceFile s3 in s2.getInvocations())
                          {
                              invoCount = invoCount + s2.getInvocations().Count;
                          }
                      }
                  }
              }
          }

          foreach (SourceFile s in list)
          {
              foreach (SourceFile source in s.getInvocations())
              {
                  foreach (SourceFile s1 in source.getInvocations())
                  {
                      foreach (SourceFile s2 in s1.getInvocations())
                      {
                          foreach (SourceFile s3 in s2.getInvocations())
                          {
                              Grid g1 = new Grid();
                              g1.Width = 50;
                              g1.Height = 50;
                              grids.Add(g1);
                              g1.Tag = s3;
                              Ellipse e1 = new Ellipse();
                              //Dependencies.Children.Add(e1);
                              e1.Width = 50;
                              e1.Height = 50;
                              e1.Fill = Brushes.Red;
                              s3.setGrid(g1);

                              g1.Children.Add(e1);

                              if (depth == 5)
                              {
                                  Canvas.SetTop(g1, 596);
                              }
                              else if (depth == 6)
                              {
                                  Canvas.SetTop(g1, 511);
                              }
                              Canvas.SetLeft(g1, counter5 * (1000 / (invoCount + 1)));

                              Viewbox box1 = new Viewbox();
                              box1.Width = g1.Width;
                              box1.Height = g1.Height;

                              TextBox txt1 = new TextBox();
                              txt1.Background = Brushes.Transparent;
                              txt1.BorderBrush = Brushes.Transparent;
                              txt1.Text = s3.getName();
                              box1.Child = txt1;
                              g1.Children.Add(box1);

                              Line l = new Line();
                              //Canvas.SetZIndex(l, 2);
                              l.Stroke = Brushes.Green;
                              l.StrokeThickness = 10;
                              Binding x1 = new Binding(); x1.Path = new PropertyPath(Canvas.LeftProperty);
                              x1.Converter = new MyConverter();
                              x1.ConverterParameter = s2.getGrid();
                              Binding y1 = new Binding(); y1.Path = new PropertyPath(Canvas.TopProperty);
                              y1.Converter = new MyConverter();
                              y1.ConverterParameter = s2.getGrid();
                              Binding x2 = new Binding(); x2.Path = new PropertyPath(Canvas.LeftProperty);
                              x2.Converter = new MyConverter();
                              x2.ConverterParameter = g1;
                              Binding y2 = new Binding(); y2.Path = new PropertyPath(Canvas.TopProperty);
                              y2.Converter = new MyConverter();
                              y2.ConverterParameter = g1;
                              x1.Source = y1.Source = findGrid(grids, s2, s3);
                              x2.Source = y2.Source = g1;
                              l.SetBinding(Line.X1Property, x1);
                              l.SetBinding(Line.Y1Property, y1);
                              l.SetBinding(Line.X2Property, x2);
                              l.SetBinding(Line.Y2Property, y2);
                              l.Tag = new Call(s2, s3);
                              Contacts.AddPreviewContactDownHandler(l, OnLineDown);
                              Dependencies.Children.Add(l);

                              counter5++;

                              SizeChangedEventHandler act = (Object o, SizeChangedEventArgs args) =>
                              {
                                  BindingOperations.GetBindingExpressionBase(l, Line.X1Property).UpdateTarget();
                                  BindingOperations.GetBindingExpressionBase(l, Line.Y1Property).UpdateTarget();
                                  BindingOperations.GetBindingExpressionBase(l, Line.X2Property).UpdateTarget();
                                  BindingOperations.GetBindingExpressionBase(l, Line.Y2Property).UpdateTarget();
                              };

                              s3.getGrid().SizeChanged += act;
                              g1.SizeChanged += act;
                          }
                      }
                  }
              }
          }
      }



            foreach (Grid grid in grids)
            {
                Dependencies.Children.Add(grid);
                Contacts.AddPreviewContactDownHandler(grid, DownOnSourceFile);
            }
                }
  ));
        }

Есть ли простой способ, чтобы улучшить это? И чтобы это работало не только на 6 шагов, но и за n шагов?



2582
31
задан 19 января 2011 в 09:01 Источник Поделиться
Комментарии
6 ответов

Разбить это на несколько методов - это очень долго, потому что это не легко читать.

61
ответ дан 19 января 2011 в 09:01 Источник Поделиться

Этот код...

if (depth == 1)
{
Canvas.SetTop(g1, 163);
}
else if (depth == 2)
{
Canvas.SetTop(g1, 108);
}
else if (depth == 3)
{
Canvas.SetTop(g1, 81);
}
else if (depth == 4)
{
Canvas.SetTop(g1, 65);
}
else if (depth == 5)
{
Canvas.SetTop(g1, 54);
}
else if (depth == 6)
{
Canvas.SetTop(g1, 46);
}

Может быть лучше реализованы с помощью массива...

int[] values = new [] { 0, 163, 108, 81, 65, 54, 46  }

Или Словарь...

var values = new Dictionary<int,int>() { { 1, 163 }, { 2, 108 }, { 3, 81 }, { 4, 65 }, { 5, 54 }, { 6, 46} };

Таким образом, вы могли бы просто сказать

Canvas.SetTop(g1, values[depth])

58
ответ дан 19 января 2011 в 10:01 Источник Поделиться

Дайте некоторую мысль к сокрытию решения по установке в верхней части холста (ср. МФ. все те, если заявления) в набор классов, или, возможно, одного класса с разными подходящие параметры в конструкторе. Много этот код отличается только по количеству применяется.

Простое правило-это "абстрактное понятие, которое изменяется".

17
ответ дан 19 января 2011 в 09:01 Источник Поделиться

Я могу рекомендовать использование операторов Switch и Пробел вместе с предложением ЖРД в нарушении этого на несколько методов. Кроме того, похоже, у вас довольно много повторяющегося кода может попытаться вскрыть, что это его собственные методы.

8
ответ дан 19 января 2011 в 09:01 Источник Поделиться

Для n разрядных шаги, рассмотрите возможность использования рекурсии - но осторожно.

5
ответ дан 19 января 2011 в 09:01 Источник Поделиться

Сломать ваш код в свои собственные методы, безусловно, есть и другие способы, но это, вероятно, будет самый простой и менее трудоемкий способ, чтобы сделать его легче читать и отлаживать вниз по дорожке для начала.

2
ответ дан 20 января 2011 в 12:01 Источник Поделиться