あなたの手の唯一の性質は、他の1つを打っているということです。
次に、ハンドフォームごとに1つの具体的なタイプを持つ間にコードを繰り返さないようにしたいので、パラメータ化する必要があります。あなたが許可することができます自由のレベルに応じて、これは保護されたメンバーのように簡単になります
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にクレジットを与える必要があります。これはコメントの必要性を減らすはずです。
Lusistanianが提案する第2の代替案は、戦略パターンで表すことができます。また、やや単純です:
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(Lusistanianの隣)です。
「ハンド」のインスタンスは、自分自身を比較しません。だから私たちは '脳 'を持っている。 –
@tereko:興味深いことに、「脳」を含む解決策がありますか? –