어떻게 제거합니까? 이 문제를 해결하는 패턴이나 무언가가 있는지 궁금합니다. 기본적으로 다른 클래스의 type 속성을 기반으로 구체적인 자식 클래스를 인스턴스화해야합니다. 즉 type = 1이면 new A이고, else type = 2이면 new B 등입니다. type 속성을 가진 클래스 :공장에서 중복 된 조건문
/**
* Get a ticket decorator based on the ticket type
* @return ReferralService\TicketDecorator
* @throws Exception
*/
public function getTicketDecorator(): ReferralService\TicketDecorator
{
if (!$this->code) {
throw new Exception("Couldn't create a ticket wrapper based on the type without a code");
}
/**
* The debug service
* @var Debug\Service $debugService
*/
$debugService = app(Debug\Service::class);
$debugService->setDebug(config('referral.debug'));
switch ($this->code) {
case self::TYPE_FEEDBACK:
return new ReferralService\TicketDecorator\FeedbackTicketDecorator($debugService);
break;
case self::TYPE_BIRTHDAY:
return new ReferralService\TicketDecorator\BirthdayTicketDecorator($debugService);
break;
case self::TYPE_NEW_PARTNER:
return new ReferralService\TicketDecorator\PartnerTicketDecorator($debugService);
break;
default:
throw new Exception(sprintf("Couldn't instantiate a ticket decorator based on the %s type", $this->code));
}
}
/**
* Instantiate a private page based on the ticket type
* @param ReferralService\Service $service
* @param Referrer $referrer
* @param Ticket $ticket
* @return ReferralService\Page\PrivatePage
* @throws Exception
*/
public function getPrivatePage(ReferralService\Service $service, Referrer $referrer, Ticket $ticket): ReferralService\Page\PrivatePage
{
if (!$this->code) {
throw new Exception("Couldn't create a private page based on the type without a code");
}
switch ($this->code) {
case self::TYPE_FEEDBACK:
return new ReferralService\Page\PrivatePage\EmailReference($this->service, $referrer, $ticket);
break;
case self::TYPE_BIRTHDAY:
return new ReferralService\Page\PrivatePage\Birthday($this->service, $referrer, $ticket);
break;
case self::TYPE_NEW_PARTNER:
return new ReferralService\Page\PrivatePage\Partner($this->service, $referrer, $ticket);
break;
default:
throw new Exception(sprintf("Could't find a page for the type", $this->code));
}
}
공장의 모든 메소드는 유형 필드를 테스트합니다.이 필드는 나를 위해 서투르게 보입니다. 모든 유형에 대해 별도의 하위 클래스가 있고 조건문없이 팩터 리 메서드를 사용한다고 생각했지만 Laravel 모델에서는 사용할 수 없습니다.
예쁜 것은 아니지만 문제는 없습니다. 공장을 가지고있는 것은 꽤 읽기 쉽고 합법적 인 방법입니다. 나는 너무 많이 걱정하지 않을 것이다. – Andrew
당신은 이미 쓸모없는'break;'('return's 다음에)를 모두 제거 할 수있다. –
@Casimir 맞아요, 전 항상 break 문을 항상 사용하는 데 익숙해 져 있습니다. – Sergey