加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php – 如何描述3件物品之间的岩纸剪刀关系?

发布时间:2020-05-25 10:37:40 所属栏目:PHP 来源:互联网
导读:假设我有以下结构: abstract class Hand {}class Rock extends Hand {}class Paper extends Hand {}class Scissors extends Hand {} 目标是制作一个功能(或一个方法)Hand :: compareHands(Hand $hand1,Hand $hand2),这将以一张岩石剪刀的比赛返回获胜的手

假设我有以下结构:

abstract class Hand {}

class Rock extends Hand {}
class Paper extends Hand {}
class Scissors extends Hand {}

目标是制作一个功能(或一个方法)Hand :: compareHands(Hand $hand1,Hand $hand2),这将以一张岩石剪刀的比赛返回获胜的手.

这将是非常容易的一堆ifs,但关键是要有一个更强大的结构,这是依赖多态而不是程序代码.

附:这是在实际的生产代码中完成的,如果有人在问.这不是一些挑战或功课. (这不是真正的摇滚纸剪刀,但你得到点).

你手的唯一性质就在于打败另外一个人.

然后,您不需要重复代码,而每个手形具有一个具体类型,因此您需要参数化.根据您可以允许的自由度,这可以像受保护的成员一样简单:

abstract class Hand {

    protected $beats;

    final public function beats(Hand $opponent) {

        return $opponent instanceof $this->beats;
    }
}

class Rock extends Hand {

    protected beats = 'Scissors';
}

class Paper extends Hand {

    protected beats = 'Rock';
}

class Scissors extends Hand {

    protected beats = 'Paper';
}

我认为这是这里的标准模板方法模式,在一个非常简单的形式.

与Lusitanian’s answer比较,谁应该获得实际代码的学分,我只是重新排序了一点.但只有一点点.

此外,我需要给予信用@Leigh for the far better function and parameter naming.这应该减少评论的需要.

卢西斯坦建议的第二个选择可以用策略模式来表示.它也有点直截了当:

class EvaluateHands
{
    private $rules;

    public function __construct(array $rules)
    {
        $this->rules = $rules;
    }

    public function compareHands(Hand $hand1,Hand $hand2)
    {
        return $this->rules[get_class($hand1)] === get_class($hand2) ? $hand1 : $hand2;
    }
}

new EvaluateHands(
    array(
        'Rock' => 'Scissors','Paper' => 'Rock','Scissor' => 'Paper'
    )
);

两手之间的比较已经完全封装在EvaluateHands类型中,甚至可以配置(如果游戏规则改变),而双手将保持不变:

abstract class Hand {}

class Rock extends Hand {}

class Paper extends Hand {}

class Scissors extends Hand {}

此代码的学分转到gordon(在卢西斯坦语旁边).

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读