2012-11-09 2 views
2

임 MVC를 구축하고, 밖으로 정렬하고자하는 몇 가지 의구심을 가지고.다른 클래스 내부에서 PHP 클래스를 호출 하시겠습니까?

Dispatcher 클래스가 있고이 클래스에는 HTTP 요청, HTTP 응답 및 라우터 클래스가 필요합니다.

class Dispatcher() 
{ 
    protected $request; 
    protected $response; 
    protected $router; 

    public function __construct() 
    { 
     $this->request = new Request(); 
     $this->response = new Response(); 
     $this->router = new Router(); 
    } 
} 

뭔가 거기 : 지금은이 방법처럼 해달라고과 같은 디스패처 클래스의 내부 클래스를 사용하고 싶습니다 말할 수

$dispatcher = new Dispatcher($request, $response, $router); 

:

내가 좋아하는이 사용 종속성 주입을 할 수 2 접근 방식에 문제가 있습니까? OOP 원칙을 제동하고 있습니까? 아니면이 방법으로 사용하는 것이 좋습니까?

답변

1

이 잘못된 것일 수도 있습니다. 하나의 접근 방식이나 다른 접근 방식을 사용하면입니다. 필수 사양을 충족시키지 못한다면 잘못된 것입니다.

두 번째 방법보다 첫 번째 방법을 선호하는 이유는 주입 할 수있는 것에 유연성을 줄 수 있기 때문입니다. 예를 들면 :

class Dispatcher { 
    private $req; 
    public function __construct(IRequest $req) { 
     $this->req = $req; 
    } 
} 
interface IRequest {} 
class Request implements IRequest {} 
class MockRequest implements IRequest {} 

//PRODUCTION 
new Dispatcher(new Request); 
//TESTING 
new Dispatcher(new MockRequest); 
+0

'클래스 CRequest는 IRequest {}'를 구현하면 안됩니까? 그리고'private $ oReq;'? 일관된 코딩 스타일을 만들 수 있습니다. –

+0

@ tereško는 인터페이스 심볼의 시작 부분에 'I'를 포함하는 공통 관용구이지만 다른 정의로 ​​넘어 가지 않습니다. –

+0

아니요, 실제로 이것은 일반적으로 나쁜 습관입니다. 인터페이스는 ** 실제로는 추상적 인 클래스가 아닙니다 **. 인터페이스는 계약의 정의이며 인터페이스의 이름은 계약의 성격을 설명해야합니다. 구체적인 구현을위한 클래스 이름을 설명하는 대신. –

0

당신이 이상이기는거야 당신이 DI를 사용해야하는 이유가있다 : 의존성 주입 는 코드에서 종속성을 제거하고 호출자에게 추상화합니다. 이렇게하면 본질적으로 기능에 외부 종속성이 필요하지 않으므로 코드를 단위 테스트하는 것이 더 쉬워집니다.

이것은 예제에서 가장 잘 보여줍니다. 귀하의 클래스가 데이터베이스 연결을 필요로한다고 상상해보십시오 :

class Dispatcher() 
{ 
    protected $db 

    public function __construct() { 
     $this->db = new MysqlDB(); 
    } 
} 

이제 모든 사람들이 MySQL 데이터베이스를 사용해야했습니다.

class Dispatcher() 
{ 
    protected $db 

    public function __construct(Database $db) { 
     $this->db = $db; 
    } 
} 

그리고, 서로 다른 데이터베이스 연결을 나타내는 일부 개체를 정의 :

그러나, 당신은 할 수 있습니다 추상적 멀리 데이터베이스의 세부 사항 및 데이터베이스 개체를 나타내는 몇 가지 클래스에 의존 단지 DI를 사용했다
interface Database { 
    public function query($sql); 
} 

class MySQLDB implements Database { 
    public function query($sql) { // Stuff for MySQL 
    } 
} 

class OracleDB implements Database { 
    public function query($sql) { // Stuff for Oracle 
    } 
} 

이제 사용자가 수행 여부 :

$dispatcher = new Dispatcher(new MysqlDB()); 

또는 :

$dispatcher = new Dispatcher(new OracleDB()); 

두 클래스 모두 동일한 클래스를 재사용 할 수 있습니다.

+0

'Dispatcher'가 데이터베이스 인스턴스를 필요로하는 이유는 무엇입니까? 그것은 강아지에게 다리를 못 박는 것과 "낙지"라고 부르는 것과 같습니다. –

0

두 번째 예제는 Dispatcher 클래스와이 클래스가 사용하는 모든 클래스 간의 긴밀한 결합을 유발합니다. 당신이 특정 법이나 원칙을 찾고 있다면, 이것에 의해 위반됩니다, 그것은 open/closed principle 것입니다.

P.S : 당신은 확실히 당신은 이벤트 기반 아키텍처를 사용하는 taht를입니까? 그게 유일한 context이기 때문에 Dispatcher이 언급되어 있습니다.그것은 다른 객체를 생성 이후

0

번째 예하는 공장 접미사로 호출되어야한다. 두 예에서

, 당신은 다른 개체가 등록/구현하는 것이, Dispatcher가 단지 인터페이스 나 서비스를 요청 할 수 있어야한다

높은 결합 디스패처 객체 (Dependancy inversion)와 끝까지.

관련 문제