2012-05-12 2 views
3

좋아, 내가 작은 PHP 응용 프로그램을 만들고있어. 현재 구조는 다음과 같습니다.개체 및 종속성을 공유하는 잘못된 OO 아키텍처가 있습니까? 어쩌면 나는 여기에 디자인 패턴을 놓친거야?

$client = new AppName\Client; 
$model = $client->getModel(); 
$model->getNode(); 

모든 것이 여기 아름답습니다. 클라이언트는 Socket을 통해 명령을 연결하고 실행하는 작은 C 응용 프로그램을 담당합니다. 나는 여기서 건축으로 놀고있다. Client :: getModel은 Model의 인스턴스를 반환합니다. getModel 동안 나는 생성자를 통해 Model 내부에 Client를 삽입한다. 이런 식으로 뭔가 :

public function getModel() 
{ 
    return new Model('parameter', $this); 
} 

가 어느 차례로 ...

// Model 
public function __construct($param, Client $client) 
{ 
    $this->setClient($client); 
    // ... 
} 

그러나, 모델 ::는 getNode 동안, 난 노드의 인스턴스를 반환합니다. 그러나 getModel과 달리 Client를 다시 삽입하고 싶지는 않습니다. 하지만 내가해야 해. 지금 당장이 작업을하고 있습니다.

public function getNode() 
{ 
    return new Node('parameter', $this->getClient()); 
} 

나는 이것이 틀린 것 같습니다. 내가 빠뜨린 뭔가가 있어야합니다 ... 나는 Dependency Injection을 이해하고 사용하지만, Dependency Injection Container가 내 문제를 해결하지 못할 것이라고 확신합니다.

+0

하나의 간단한 방법은 모달을 확장하고 노드를 만드는 것입니다. 즉. 다음과 비슷한 : class node modal {}이 방법을 사용하면 노드의 공용/보호 된 모달 모드에 액세스 할 수 있습니다. – KoolKabin

+0

무엇이 당신의 질문입니까? 디자인은 나를 위해 괜찮아 보이는 – ivowiblo

+0

클래스 계층 구조는 종속성과 아무 관련이 없어야합니다. – vinnylinux

답변

0

대부분의 내용을 게시하지 않았기 때문에 전체 디자인을 말할 수는 없지만 누락 된 패턴이 있다고 생각합니다. 핵심 OO 설계 원칙 중 하나는 객체에 데이터/객체를 요청하지 않고 해당 데이터/객체에 대해 작업을 수행하지 않고 객체에 대해 무언가를 수행하도록 요청하는 것입니다. "Getting"를 줄이는 것이 좋습니다.

내 자신의 디자인에서 이것을 강요하기 위해 나는 결코 세터와 게터를 첫 번째 패스에서 만들지 않습니다. (글쎄, 저는 거의 세터를 전혀 만들지 않습니다). 나중에 내가 들어가서 게터를 피할 수 없을 때만 게터를 추가 할 것이다. (당신은 여전히 ​​내가 생각하기를 필요로한다.)

또 다른 한가지는 당신이 절대적으로 상속을 피할 때까지 완전히 상속을 피하는 것이다. 코드를 복제하거나 혼동시키지 않고 문제를 해결할 수 있습니다. 문제는 제 모국어로 질문을 코딩하지 않았기 때문에 당신이하는 일을 정말로 말할 수 없다는 것입니다.

0
당신이 setClient (내부 모델에서 클라이언트를 저장하는 것을 잊었다) 또는 내가 할 수있는) setClient()와 getClient (대한 코드를 게시 할 경우 getClient()

에서 반환되지 않는 것 같습니다

그것을 확인하십시오.

+0

게시물 크기로 인해 생략 된 이유는 ... – vinnylinux

0

클라이언트를 얻는 것은 모델의 직업이 아닙니다 (또는 그 반대입니다!). 그것은 공장의 문제입니다! 방법은 다음과 같아야합니다.

$client = new AppName\Client($model); 

테스트를 수행 할 수 없기 때문에 공장 논리를 비즈니스 논리와 함께 사용하지 마십시오.

+0

클라이언트를 사방에 배치하는 것은 잘못입니다. 이것이 DI가 원하는 것입니다. – vinnylinux

+0

@vinnylinux : 나의 요점. 'Client :: getModel()'이하는 일을해서는 안된다. –

+0

내 모델을 MVC 모델과 혼동하고 있다고 생각합니까? 그것은 할 일이 없으며 단지 예일뿐입니다. – vinnylinux