2014-10-24 2 views
2

Проблема:Лучшая практика для рекурсивного класса

Я хочу построить класс для пользовательских dice. Но он также должен обеспечить следующее:

  1. Каждый side может содержать другие dice
  2. Число sides должно быть динамически расширяемый, но должен содержать по меньшей мере один
    • Логически dice нужно иметь a currentSide
  3. Каждый side имеет property, что обеспечивает е содержание этой стороны (на D6, было бы "4")

До сих пор так хорошо, я пошел и сделал два класса dice и side и дал им свойства, я думаю, что они необходимы.

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 не должны запускать ни один рулон.

+5

Хорошая практика программирования в сторону, кто предложил этот дизайн? Публичное свойство говорит, если у стороны есть кости? Это ли для вас смысл? – walther

+0

@walther Я планирую использовать это в WP-приложении вместе с WPF, и я думал, что bool в классе будет лучше связываться, а затем Dice Property of the Side и конвертер, чтобы получить булевское значение. Для простоты я вырезал реализацию INotifyPropertyChanged, потому что это не нужно, чтобы ответить на вопрос :) – Firen

+1

http://memegenerator.net/instance/55596564 –

ответ

1

Что вы делаете, называется state machine. Ваша программа («машина») всегда находится в определенном состоянии, но может изменять состояние в результате выполнения какого-либо действия. В зависимости от логики вполне допустимо, что машина может находиться в одном и том же состоянии более одного раза. Поэтому я не стал бы слишком беспокоиться о циклах в логике машины. Если пользователь хочет цикл, то пусть он имеет его, пока машина может достичь некоторого конечного состояния, и программа достигает конца выполнения.

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

Я обновил сообщение с изображением о том, как я хочу, чтобы кости играли, может ли это быть достигнуто с помощью графа объектов? Если так, я буду читать в нем больше. :) – Firen

Смежные вопросы