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 に答える