背景
我正处于编写“锦标赛包围”应用程序的早期阶段(C#,尽管任何面向对象的语言都是合适的)。理论上,此应用程序将为多种类型的锦标赛生成括号表:
对于每种类型的锦标赛,我都希望将“括号算法”实现为通用界面的实例。通过这种方式,我可以使系统可扩展,并在将来轻松添加对其他括号的支持。
鉴于“竞争对手”的变量列表 - 用户可以简单地选择他们想要的括号插件和 poof ,这就是生成的括号!
设计挑战
我目前正在努力想象一个包围设计;接口所需的API,更重要的是 - 我不确定如何一般和灵活地代表括号'模型'作为数据结构。我想是某种节点映射?
理想情况下,我需要接口:
问题
我希望我有更好的方式来表达这个问题;
我的初始违规
除非我将一些代码放在纸上,否则它不会是StackOverflow问题。这是我最初的想法;
// A plugin interface; generates a tournament bracket, given a list of competitors
public interface IBracketSheetGenerator
{
public IBracketSheet CreateBracket(IEnumerable<Competitor> competitors);
}
// Parent data structure, used to model a tournament bracket
public interface IBracketSheet
{
public IEnumerable<Competitor> Competitors { get; }
public IEnumerable<IBracketNode> Matches { get; }
}
// Node representing a single competitor match
public interface IBracketNode
{
public Competitor Left { get; }
public Competitor Right { get; }
public IBracketNode Winner { get; }
public IBracketNode Loser { get; }
// Advance the winner to the next winner's match,
// and the loser to the loser's match.
public Advance(Competitor winner, Competitor loser);
}
马上,我可以看到第一次尝试的一些缺点;
答案 0 :(得分:1)
在这里集思广益,但我想我也会模仿Round
的概念。对于消除系统轮次已经有意义,但你应该能够为其他系统模拟轮次。我认为可以预先确定所有轮次的总数。
每一轮都有比赛,每场比赛都有赢家和输家,支架系统的实施将能够在一轮完成后产生下一场比赛,并提供每场比赛的结果。
如果竞争对手在下一轮比赛中没有参加比赛,他们就会出现#34; out&#34;。也许支架系统可以返回代表当前状态的竞争者的有序列表,甚至是包含统计信息的自定义CompetitorAndScore
类?