背景
我正处于编写“锦标赛包围”应用程序的早期阶段(C#,尽管任何面向对象的语言都适用)。这个应用程序理论上会为多种类型的锦标赛生成括号表:
- 单淘汰
- 双重淘汰
- “真秒”双淘汰
- 循环赛
- 瑞士制
- ...而且可能还有更多我以前从未听说过的东西。
对于每种类型的锦标赛,我想将“括号算法”实现为通用接口的实例。通过这种方式,我可以使系统具有可扩展性,并且将来可以轻松添加对附加括号的支持。
给定一个可变的“竞争对手”列表 - 用户可以简单地选择他们想要的括号插件和poof,生成括号!
设计挑战
我目前正在努力想象一个包围设计;接口所需的 API,以及 - 更重要的是 - 我不确定如何将括号“模型”通用和灵活地表示为数据结构。我猜是某种节点图?
理想情况下,我需要以下接口:
- 接受可变大小的竞争对手列表作为输入
- 生成一个图形(或其他)结构作为输出,表示括号的“流”。
- 图形结构需要支持某种“赢/输”API,以通过括号“推进”各种竞争对手,并随时填写。
问题
我希望我有更好的方式来表达这个问题;
- 我怎么做'dis?
- 你觉得呢?你有没有什么想法?
- 什么接口结构最有意义?
- 我如何在代码中对其进行一般建模?
我最初的鞭打
除非我在纸上写一些代码,否则这不会是 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);
}
马上,我第一次尝试就发现了一些缺点;
- 我如何代表整个支架的“赢家”?
- 我如何代表从括号中“淘汰”的失败者?
- 我如何表示支架已完成/解决?已解决的括号是什么样的?
- 这个框架是否支持不属于简单“消除”模式的“奇怪”括号(例如循环赛)?