2016-11-07 7 views
1

기사를 작성하는 시스템이 있다고 가정 해 봅니다. 이러한없이다양한 구성 요소/모듈에 대한 공장 패턴 사용

$title = 'title'; 
    $description = 'Description in html'; 

    //Cleaner just clean some things from each field. 
    $cleaner = new Cleaner(); 

    //Validator throw exception if something is not correct 
    $validator = new Validator(); 

    // Storage save files and article itself 
    $storage = new Storage(); 

    //Dom Class get some files from description field 
    $dom = new Dom(); 
    $files = $dom->getFiles($description); 

    $storage->files($files); 

    $article = new ArticleBuilder(); 
    $article->addTitle($validator->title($cleaner->title($title))); 
    $article->addDescription($validator->description($cleaner->description($description))); 
    $article->add.... 

이 기사를 구축하는 것은 불가능 :이 기사는 내가 각 구성 요소를 인스턴스화해야 기사를 구축하기 위해 클라이언트에서 .... 일부 구성 요소 검사기, 청소기, 저장있다.

내 질문은 :

: 클라이언트의

  class ArticleFactory 
     { 
      private $article; 

      public function __construct() 
      { 
       $this->article = new ArticleBuilder(); 
      } 

      public function setTitle(string $title) 
      { 
       $title = ($this->validator())->title($title); 
       $title = ($this->cleaner())->title($title); 
       $this->article->addTitle($title); 
      } 

      public function setDescription(string $des) 
      { 
       $des = ($this->validator())->title($des); 
       $des = ($this->cleaner())->title($des); 
       $this->article->addDescription($des); 
      } 

      public function getArticle(): ArticleBuilder 
      { 
       return $this->article; 
      } 

      public function getFiles($description) 
      { 
       return ($this->dom())->getFiles($description); 
      } 

      public function storeFile($files) 
      { 
       ($this->storage())->files($files); 
      } 

      public function validator(): ValidatorInterface 
      { 
       return new Validator(); 
      } 

      public function cleaner(): CleanerInterface 
      { 
       return new Cleaner(); 
      } 

      public function storage(): StorageInterface 
      { 
       return new Storage(); 
      } 

      public function dom(): DomInterface 
      { 
       return new Dom(); 
      } 
     } 

위 공장 기사를 작성하는 것이 더 편리하다 :가 내가 이런 식으로이 모두를 만들기 위해 공장 패턴을 사용할 수

 $myTitle = 'my title'; 
     $myDes = 'mty description'; 
     $article = new ArticleFactory(); 
     $article->setTitle($myTitle); 
     $article->setDescription($myDes); 
     $files = $article->getFiles($description); 
     $article->storeFile($files); 

이것은 단단한 원칙에 위배됩니까?

더 좋은 방법이 있습니까?

+1

** 공장 패턴을 사용하여이 모든 것을 만들 수 있습니까 ** 물론 할 수 있습니다. 문제는 얼마나 유용 할 것인가입니다. 그리고 우리는 당신이 제로 컨텍스트를 제공했기 때문에 수정 구슬을 물어볼 필요가 있습니다. – Euphoric

+0

나는 이것을 너무 잘 이해하지 못한다. 'ArticleFactory'가 있지만'Validator','Cleaner' 및'Storage' 유형을 반환합니다. 이러한 '파생물'의 파생물이나 의존성은 있습니까? –

+0

나는 내 대답을 업데이 트했습니다. 네가 뭔가 더 원하면 알려줘. 고마워요 –

답변

-1

ArticleFactoryArticleFactory이 (건물을 짓고, 저장하고, 확인하고, 청소하는) 기사와 관련되어 있기 때문에 SRP을 위반하는 것으로 보입니다.

Factory 패턴과 Builder 패턴 사이에 혼동이있는 것으로 보입니다. 클래스 ArticleFactory도 기사를 작성하면 빌더를 작성한 다음 (빌드) 빌드 프로세스를 위임 한 경우에는 더 깨끗합니다. 당신은 정말로 건축업자가 필요합니까? 빌더 패턴이 가치를 더할만큼 복잡하고 값 비싼 새로운 기사를 만드는 과정이 있습니까?

함수 이름 (function Validator, Cleaner, Storage)에 명사를 사용하면 코드를 이해하기 어려워집니다. 거기에 당신의 의도는 무엇입니까?

클래스의 함수와 명사에 동사를 사용하십시오.