递归类的最佳实践

时间:2014-10-24 12:27:52

标签: c# class recursion self-reference dice

问题:

我想为自定义dice构建一个类。但它也应该提供以下内容:

  1. 每个side都可以包含其他dice
  2. sides的数量应该是动态可扩展的,但必须至少包含一个
    • 逻辑上dice需要currentSide
  3. 每个side都有一个property,它提供此方的内容(在D6上,它将是"4"
  4. 到目前为止,我去了两个班diceside并给了他们我认为他们需要的属性。

    public class Side
    {
        //public bool HasDice { get { return Dice != null; } } - Removed not needed
        public Dice Dice { get; set; }
        public string Value { get; set; }
    }
    
    public class Dice
    {
        public ObservableCollection<Side> Sides { get; set; }
        public string Name { get; set; }
        public Side CurrentSide { get; set; }
    }
    

    这是对的吗,我从来没有做过任何递归课程,所以我不确定?

    另外,我怎么能够发现同一个骰子和一方是否“无休止地”指自己。

    喜欢:

    D1.CurrentSide = Side1; Side1.Dice = D1;
    

    构建对象时我应该检查一下吗?

    编辑:

    Example Dice Image

    • 如果D1滚动S2,则不应滚动D2。还D2.Dice = Null

    • 如果D1滚动S1,则应滚动D2。

    • 如果D2滚动S1则应滚动D3。

    • 如果D2滚动S2,则应滚动D4。

    D3和D4不应触发任何滚动。

2 个答案:

答案 0 :(得分:1)

根据你所说的,我建议你创建一个骰子的对象图,其中一个骰子连接到其他骰子,然后运行拓扑排序算法来揭示循环依赖。

为此,我建议您自己编写,使用QuickGraph工具。

现在,我自己曾经使用它并编写了一个IEnumerable内容的扩展名,它以某种方式返回排序IList,其中返回的第一个项目是其他项目从未引用过的项目。后者是最被引用的。 (或者可能反过来。)在循环依赖的情况下抛出异常。我的扩展程序使用QuickGraph库。

public static IList<T> OrderTopologically<T>(this IEnumerable<T> e, Func<T, IEnumerable<T>> dependenciesSelector)
{
    var graph = new AdjacencyGraph<T, Edge<T>>();

    foreach (T item in e)
    {
        graph.AddVertex(item);

        foreach (T dependecy in dependenciesSelector(item))
        {
            graph.AddEdge(new Edge<T>(item, dependecy));
        }
    }

    var topSort = new TopologicalSortAlgorithm<T, Edge<T>>(graph);

    try
    {
        topSort.Compute();
    }
    catch (NonAcyclicGraphException cyclicException)
    {
        throw new ElQueueException("Circular reference detected while processing javascript dependency order.", cyclicException);
    }
    catch (KeyNotFoundException keyNotFoundException)
    {
        throw new ElQueueException("Dependency could not be found.", keyNotFoundException);
    }

    return topSort.SortedVertices;
}

答案 1 :(得分:1)

您所做的是state machine。您的程序(&#34;机器&#34;)始终处于某种状态,但可以通过执行某些操作来更改状态。根据逻辑,机器可以多次处于相同状态是完全可以接受的。所以,我不会过多地关注机器逻辑中的循环。如果用户想要循环,那么让他拥有它,只要机器可以达到最终状态并且程序到达执行结束。