消除彼此之间具有强烈概念联系的类的耦合

wil*_*ell 6 language-agnostic

我有类型的Rock,PaperScissors.这些是Rock,Paper,Scissors游戏的组件或"手".鉴于两名球员的手,比赛必须决定谁获胜.如何解决存储此链表的问题

岩石,纸,剪刀图表

没有将各种手相互耦合?目标是允许在游戏中添加新手(例如Jon Skeet)而不更改任何其他游戏.

我对代理的任何想法持开放态度,但不对大型switch语句或代码重复持开放态度.例如,引入一个管理链的比较的新类型是好的,只要我不需要为我添加的每个新手更改它.再说一遍,如果你可以合理地拥有一个必须为每一个新手或一只手改变的代理,那也是受欢迎的.

这是一个设计101问题,但我很好奇人们可以为此提出什么解决方案.显然,这个问题很容易扩展到更大的系统,有更多的组件,它们之间有任意复杂的关系.这就是为什么我要提出一个非常简单而具体的例子来解决.任何使用的范例,OOP或其他方式都是受欢迎的.

tva*_*son 4

有一个实现 Win 方法的 GameStrategy 类。win 方法采用 Hands 列表,并返回 Hands(如果有获胜者)或 null(如果游戏平局)。我认为获胜策略实际上并不是手牌的属性,而是游戏的属性。将一手牌获胜者的判定纳入到 GameStrategy 类中。

编辑:潜在策略

public enum RPSEnum { Rock, Paper, Scissors }

private RPSEnum FirtRPS = RPSEnum.Rock;
private RPSEnum LastRPS = RPSEnum.Scissors;

public Hand Win( Hand firstPlayer, Hand secondPlayer )
{
    if (firstPlayer.Value == FirstRPS
        && secondPlayer.Value == LastRPS)
    {
       return firstPlayer;
    }
    else if (secondPlayer.Value == FirstRPS
             && firstPlayer.Value == LastRPS)
       return secondPlayer;
    }
    else
    {
       int compare = (int)firstPlayer.Value - (int)secondPlayer.Value;
       if (compare > 0)
       {
          return firstPlayer;
       }
       else if (compare < 0)
       {
          return secondPlayer;
       }
       else
       {
          return null;
       }       
    }
}
Run Code Online (Sandbox Code Playgroud)

要添加新的手牌值,只需按正确的顺序将该值添加到 RPSEnum 即可。如果是新的“最低”手牌,则更新 FirstRPS。如果是新的“最高”手牌,则更新 LastRPS。您根本不需要更改实际的算法。

注意:这比仅三个值所需的更复杂,但要求是能够在不更新太多代码的情况下添加其他值。