손의 유일한 성격은 하나의 다른 하나를 때리고 있다는 것입니다.
그런 다음 코드를 반복하지 않으려면 손 모양마다 구체적인 유형이 필요하므로 매개 변수화가 필요합니다. 당신은 할 수 있습니다 자유의 수준에 따라,이 보호 구성원으로 간단 할 수 있습니다
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이 제안하는 두 번째 대안은 전략 패턴으로 나타낼 수 있습니다. 또한 다소 정직 :
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 : 흥미 롭다면, '뇌'와 관련된 해결책이 있습니까? –