2011-07-26 8 views
1

나는 이것을 위해 모범 사례가 무엇인지 모른다. 의 내가 어떤 계층 개체가 있다고 가정 해 봅시다 : 개체 간 통신

Neighborhood 
Family 

그래서 각 가족은 이웃에 살고있다. 개체는 다음과 같이 매핑됩니다 :

class Neighborhood { 
    public $id; 
    public $name; 

    public $nr_families; 
} 

class Family { 
    public $id; 
    public $name; 
    public $neighborhood_id; 
} 

각 개체 모델은 자신의 데이터베이스 테이블입니다. 타입의 모든 객체는 전역 포맷의 배열에 보관되므로 배열이 2 개 있습니다.

Neighborhood 개체 내부에서 작성 날짜에 데이터베이스를 다시 쿼리하거나 Families의 전역 배열에 액세스하지 않고 해당 Neighborhood에있는 패밀리의 수를 알 수 있습니까? 패밀리 배열이 먼저 생성되었고 이미 존재한다고 가정 해 봅시다. 이제 네이버 후드 배열을 생성 할 때이 객체는 각각에 패밀리의 총 개수가있는 속성이 있어야합니다. 이 속성은 데이터베이스 필드와 일치하지 않으므로 즉시 계산해야합니다.

디자인 패턴이 있습니까? 어떤 종류의 세 번째 객체를 사용해야합니까?

답변

1

추가 쿼리를 사용하지 않으려면 패밀리 목록을 반복하여 패밀리의 이웃 ID를 확인해야합니다. 전역 변수를 사용하는 것은 권장하지 않기 때문에, 일부 의존성 주입을 사용하여 이웃에게 가족에 대해 알릴 수 있습니다.

네이버 후드 개체에 패밀리 목록이 포함 된 정적 변수가 있다고 가정 해보십시오. 개체 외부에서 해당 변수를 설정 :

Neighborhood::$families = $families; 

이웃 수있는 목록을 통해 현재 루프, 가족의 이웃 ID 확인 :

class Neighborhood { 
    function getNumberOfFamilies() { 
     $myFamilies = array(); 
     foreach(self::$families as $family) { 
      if($family->neighborhood_id === $this->id) { 
       $myFamilies[] = $family 
      } 
     } 
     $this->nr_families = count($myFamilies); 
     return $families; 
    } 
} 

것이라고 작업을?

1

멋진 개체 - 관계형 매핑 세계에 오신 것을 환영합니다.

개체는 그 자체에 대해서만 "알고 있어야"합니다. 왜 이런 일을하지 :

class Neighborhood { 
    public $id; 
    public $name; 
    private $num_families; 

    public function getNumFamilies() { 
     if (!is_int($this->num_families)) { 
      // do a database query 
      $this->num_families = $result; 
     } 
     return $this->num_families; 
    } 

}

+0

그러나 가족의 수가 너무 그 지역의 특성이 될 수없는 이유는 무엇입니까? 나는 Family 객체에 대한 정보를 저장하지 않는다. – Dan

+0

물론, 게으른로드가 가능합니다. 편집 된 답변을 참조하십시오. 이웃의 가족 수에 속성이나 접근 자 (게터)를 통해 액세스 할 수 있는지 여부는 누가 중요합니까? 접근자는 더 유연합니다. – alexantd