2

我试图代表一个必须逐步绘制的地铁地图类型的东西(比如它的增长)。

我的代码一切正常,但不可读。基本上它是一个带有递归节点和子节点的树结构,我的测试代码如下所示:

        Children.Add(new TrackLine(800));
        Children[0].Children.Add(new TrackSpot());
        Children[0].Children[0].Children.Add(new TrackSplitter());

        Children[0].Children[0].Children[0].Children.Add(new TrackRotate(-45));
        Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackColorChange(Color.Red));
        Children[0].Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackLine(100));
        Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackRotate(45));
        Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackLine(200));

有没有人对如何解决这个烂摊子有任何建议?

4

2 回答 2

1

您正在寻找一种将其添加到没有自己的孩子的最深孩子的方法吗?

class Node
{
  List<Node> children ;

  public void addNode( Node newNode )
  {
    if( children.Count > 0 )
      children[0].addNode( newNode ) ; // recursive call
      // to ask first child to add newNode to it
    else
      children.Add( newNode ) ;        // just add it to the children list of THIS node
  }
}
于 2012-11-22T03:46:22.547 回答
0

为了使该代码更具可读性,我将使用具有适当名称的变量(因为我不知道您的主题域,所以我的可能不合适):

Children.Add(new TrackLine(800));
var lineA = Children[0];

lineA.Children.Add(new TrackSpot());
var spotA = lineA.Children[0];

spotA.Children.Add(new TrackSplitter());
var splitterA = spotA.Children[0];

splitterA.Children.Add(new TrackRotate(-45));
var rotateNeg45 = splitterA.Children[0];

rotateNeg45.Children.Add(new TrackColorChange(Color.Red));
var colorRed = rotateNeg45.Children[0];

colorRed.Add(new TrackLine(100));
var lineB = colorRed.Children[0];

lineB.Children.Add(new TrackRotate(45));
var rotatePos45 = lineB.Children[0];

rotatePos45.Children.Add(new TrackLine(200));
var lineC = rotatePos45.Children[0];

另一种方法是使用字符串作为索引,Children如下所示:

    Children.Add(new TrackLine(800));
    Children["lineA"].Children.Add(new TrackSpot());
    Children["lineA"].Children["spotA"].Children.Add(new TrackSplitter());

但是我可能不会这样做,因为管理字符串常量本身就是一团糟,而且可能需要更改Children实现。

于 2012-11-22T20:41:21.880 回答