2016-11-15 4 views
0

나는이 클래스를 가지고있다. 콘텐츠는 html + css로 스타일을 지정할 수 있습니다. 전송하기 전에 다른 수정이있을 수 있습니다. 내가 사용할 수있는 다양한 메일 제공 업체가 있습니다.더 나은 캡슐화 기술

$mail = new Mail(/* Parameters */); 
$mail->send(new Mailjet()); 

을하거나 할 다음 클래스를 메일로 게터를 추가 : 다음

class Mail 
{ 
    // ... 

    public function mail(MailProvider $provider) 
    { 
     $provider->send($content, $subject, $to, $from); 
    } 
} 

과 : 어떤 옵션이 더 나은 것

$mail = new Mail(/* Parameters */); 
$mailProvider = new Mailjet(); 
$mailProvider->send($mail->getContent(), $mail->getFrom /* etc */); 

답변

1

어떤 다른 메시지에 대해? 콘텐츠 및 주제를 텍스트로 보내려면 어떻게해야합니까?

oop의 지침 원칙으로 SOLID을 사용하려고합니다. 유지 보수 가능한 코드를 작성하는 데 도움이되는 5 가지 지침 원칙을 제공합니다.

원칙은 "응용 프로그램이 어떻게 바뀌는 지, 그리고 바뀌면 어떤 코드가 바뀌어야하는지"에 대한 생각을 조장하는 데 도움이됩니다. 가능한 한 적게 변화시키고인지 능력이 거의 없음을 목표로합니다. 가능하면 변경을 수행하는 데 필요한로드.

일반적으로 첫 번째 옵션은 불필요한 결합과 같습니다. 메일 개체는 공급자를 사용하는 방법을 이해해야합니다. 그게 꼭 필요한가요? 공급자를 추가하려면 Mail 개체 mail 메서드를 변경해야 할 수 있습니다. (즉, 제공자 send에 추가 매개 변수가 필요한 경우

반면에 두 번째 옵션은 1도 결합을 제거하고 공급자 만 메시지를 조작 할 수 있어야합니다. 메시지 필드를 추가하거나 공급자가 메소드를 전송하는 방법은 다음과 같습니다.

어떤 옵션을 사용하면 클라이언트에서 쉽게 할 수 있습니다 (클라이언트는 자신이 될 수 있습니다 :). 주관적으로 두 번째 옵션은 "메일" 팀이 통합 팀과 독립적으로 일할 수 있도록하고, 메일 젯 팀이 "메일"인터페이스를 수신해야한다는 사실을 알고 있어야합니다.

1

자신에게 질문하십시오 : 각 대상의 책임은 무엇입니까? 그렇다면 그 대답은 어느 정도 자명합니다.

  • Mail : 메일 메시지를 나타냅니다
  • Mailjet (에 중점을 대표) :에 코드를 보유해야이 설명에서 외부 서비스

로도 클래스를 통신에 특정 코드를 포함 메일을 보내십시오.

  • MailSender : 당신이 아마 원하는 것은 세 번째 클래스 인 Mail을 받아 특정 서비스 대략 스케치

사용하여 전송 :

interface Mail { 
    public function getContent(); 
    ... 
} 

interface MailServiceAdapter { 
    public function send($content, $from, ...); 
} 

interface MailSender { 
    public function send(Mail $mail); 
} 

class MailSenderImplementation implements MailSender { 
    public function __construct(MailServiceAdapter $adapter) { ... } 
    ... 
}