"빌더 패턴(Builder pattern)이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다." 라고 하는데 무슨말인지 잘 모르겠다.
쉽게 설명해볼께요.
php를 이용한 크롤링(파싱) 을 거의 15년 이상 개발하는 동안 코드를 좀 더 편하게 / 좀 더 모듈로 만들면 어떨까 라는 생각이 시작점입니다.
예를 들어볼께요
파싱할때에 꼭 필요한 부분이 아래 3개 입니다.
추가적으로 로그인 해야 하는 사이트는 쿠키 / 헤더 가 포함됩니다.
그렇다면 아래와 같은 정보를 생성자에게 넘겨주려고하면 인자가 많아집니다.
- url / agent / referer
보통 아래와 같이 코드를 생성합니다.
<?php class Parsing { private $url; private $refer; private $agent; public function __construct($url, $refer, $agent) { $this->url = $url; $this->refer = $refer; $this->agent = $agent; } }
만약 여기에 쿠키, 헤더 등등 더 추가해야 된다고 한다면 아래와 같이 인자값이 늘어나겠죠.
<?php class Parsing { private $url; private $refer; private $agent; private $cookie; private $headers; public function __construct($url, $refer, $agent, $cookie, $headers) { $this->url = $url; $this->refer = $refer; $this->agent = $agent; $this->cookie = $cookie; $this->headers = $headers; } }
Builder pattern 을 모를때에는 인자를 배열 또는 객체에 몽땅 때려놓고 인자로 넘겼습니다.
<?php $par = new Parsing(new Config());
<?php class Config { private $url; private $refer; private $agent; private $cookie; private $headers; public function __construct() { $this->url = "http://~~~"; $this->refer = "http://~~~"; $this->agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"; $this->cookie = $cookie; $this->headers = [ 'Content-Type' => 'application/x-www-form-urlencoded', 'Upgrade-Insecure-Requests' => '1' ]; } .... }
이렇게 하다보니 뭔가 어색한 설정파일을 하나 더 만들어야 된다는 번거로움이 생기게 되더군요.
더 좋은 코드가 없나 찾아보는 도중 Builder pattern 이란것을 발견했습니다.
Builder pattern 에 대해서는 여기를 참고하시면 됩니다.
그러면 위 코드를 Builder pattern 을 사용해서 만들어 보겠습니다.

Builder.php <?php /** * Created by PhpStorm. * User: naya * Date: 2020/04/24 * Time: 9:17 AM */ namespace Naya\parse\site\test; class Builder { private $url; private $refer; private $agent; public function build(): Parsing { return new Parsing($this); } /** * @return mixed */ public function getAgent() { return $this->agent; } /** * @return mixed */ public function getRefer() { return $this->refer; } /** * @return mixed */ public function getUrl() { return $this->url; } /** * @param mixed $agent */ public function setAgent($agent) { $this->agent = $agent; return $this; } /** * @param mixed $refer */ public function setRefer($refer) { $this->refer = $refer; return $this; } /** * @param mixed $url */ public function setUrl($url) { $this->url = $url; return $this; } }
Parsing.php <?php /** * Created by PhpStorm. * User: naya * Date: 2020/04/24 * Time: 9:18 AM */ namespace Naya\parse\site\test; class Parsing { private $url; private $refer; private $agent; public function __construct(Builder $builder) { $this->url = $builder->getUrl(); $this->refer = $builder->getRefer(); $this->agent = $builder->getAgent(); } static public function createBuilder(): Builder { return new Builder(); } /** * @return mixed */ public function getUrl() { return $this->url; } /** * @return mixed */ public function getRefer() { return $this->refer; } /** * @return mixed */ public function getAgent() { return $this->agent; } }
<?php /** * Created by PhpStorm. * User: naya * Date: 2020/04/24 * Time: 9:18 AM */ require __DIR__ . '/../vendor/autoload.php'; use Naya\parse\site\test\Parsing; use Naya\parse\site\test\Builder; $config = Parsing::createBuilder() ->setUrl("url") ->setAgent("agent") ->setRefer("refer") ->build(); echo '<pre>'; print_r($config); <pre>Naya\parse\site\test\Parsing Object ( [url:Naya\parse\site\test\Parsing:private] => url [refer:Naya\parse\site\test\Parsing:private] => refer [agent:Naya\parse\site\test\Parsing:private] => agent )
이제 $config->get 메소드를 이용해서 실제 사용할 코드에서 사용하면 됩니다.
코드 내용이 많아지는것 같지만 사용하는 코드에서는 많은 부분에서 깔끔해집니다.
제가 사용하는 코드중에서 더 좋은 코드 있으시면 많은 조언 부탁드립니다.
'프로그래밍 > Php' 카테고리의 다른 글
고차원 함수 array_map 과 array_reduce 를 이용한 배열을 문자열로 변환 (0) | 2020.05.28 |
---|---|
array_walk 를 이용한 배열을 쿼리스트링으로 변경 (0) | 2020.05.28 |
[디자인패턴] php 로 알아보는 Builder pattern (주식 정보 가져오기, 주식 정보 API만들기- kospi, kosdaq, krx) (0) | 2020.04.23 |
php array_map / array_walk / array_filter 의 차이점 (0) | 2018.10.16 |
php 람다 클로저 익명함수 (0) | 2018.10.15 |