2013-09-30 3 views
1

다음은 최선의 해결 방법을 찾는 데 어려움을 겪고있는 항목입니다. PHP와 Java로 작업하는 동안이 문제가 발생 했으므로 OOP 문제를 근본적으로 이해할 수 있습니다. 예제는 PHP에 있습니다.OOP 개체, 중첩 개체 및 DAO의

여기에 몇 가지 객체가 있습니다. 노래, 아티스트, ArtistProfile, 사용자.

예를 들어 아티스트 (예 : 아티스트의 프로필 페이지)를 호출하면 ArtistProfile과 사용자 개체 (구독자)의 배열을 원하고, 다른 인스턴스에서는 노래.

하나의 객체를 다른 객체의 일부로 중첩해야합니까? 아니면 다른 용도로 더 구체적인 객체를 만들어야합니까?

옵션 1 : 중첩 된

Class Song { 
    private $songId; 
    private $songName; 
    private $year; 
    private $Artist; //Artist object 
} 

Class Artist { 
    private $artistId; 
    private $name; 
    private $age; 
    private $subscriberArr; //Array of User objects which then have more nested objects such as a Role object, Profile object 
    private $profile; //Profile object which could also have more nested objects 
} 

Class User { 
    private $userId; 
    private $name; 
    private $age; 
    private $role; //Role object 
    private $profile; //UserProfile object 
} 

옵션 2 : 빌드 더 많은 개체

Class Song { 
    private $songId; 
    private $songName; 
    private $year; 
    private $artistId; 
} 

Class Artist { 
    private $artistId; 
    private $age; 
    private $name; 
} 

Class User { 
    private $userId; 
    private $name; 
    private $age; 
    private $roleId; 
} 

Class SongWithArtist { 
    private $song; //Basic Song object 
    private $artist; //Basic Artist object 
} 

Class ArtistWithProfile { 
    private $artist; //Basic artist object 
    private $profile; //Profile object 
    private $subscriberArr; //UserDisplay object containing basic User object 
} 

Class UserWithProfile {} 

옵션 내가 그 페이지 만 쉽게에 대한 필요하지 않을 수 있습니다 정보를 잡는 시간/많은 자원을 낭비하는 한 수단 꾸리다. 옵션 2는 지저분하고 어떤 객체가 무엇보다 빠르고 더 적은 db 호출인지 추적해야합니다. '올바른'옵션 및/또는 3 번째의 올바른 옵션이 있습니까?

+0

필요할 때 DB에서로드하는 속성에 대한 getter 메서드를 간단하게 만들 수 있습니까? 대안으로/이뿐 아니라 생성자에 대한 비트 벡터로 필요한 필드를 전달할 수 있습니다. –

+0

MVC를 사용하고 있다면 가능합니까? 컨트롤러에 모두로드 할 필요가 없습니까? 또한 내가 좋아하는 아티스트를로드하는 중이라면 여전히 그 안의 모든 중첩 된 객체 (프로필, 구독자 사용자, 프로필 등)를로드하려고하지 않겠습니까? – user103555

+0

어떤 프레임 워크를 사용하고 있습니까? 모든 모델의 기본 동작은 지정한 클래스를 제외한 모든 클래스를로드하는 것입니다. 예를 들어 Yii에서는로드 할 관련 클래스를 지정하는'relationships()'메서드가 있습니다. 거기에 아직로드 할 수 없도록 지정하지 마십시오. 컨트롤러에서이 작업을 수행 할 필요가 없습니다. 모델 코드 자체에서이를 수행 할 수 있습니다. PHP에서'__get '을 찾아보십시오. 개인/비 존재 변수에 대한 getter 메소드를 지정할 수있는 마법 메소드입니다. (다음 댓글에서 계속됩니다.) –

답변

0

두 가지 : 노년에

  1. 스틱 대 콤포지션 대 상속 사이 결정하는 규칙의 "있다" "는이다".

  2. 특정 성능 요구 사항이 충족되지 않는 것으로 확인하지 않는 한 쿼리 최적화에 대해 걱정할 필요가 없습니다 (특히 ). 애플리케이션을 프로파일 링하여 결정한 경우가 아니면 병목 현상이있는 부분입니다. "OOP"는 정보를 구성하고 표현하는 개념적 방법입니다. 의도와 정보를 정확하고 정확하게 나타낼 수 있도록 개체를 디자인하십시오. 조기에 최적화하지 마십시오. 어쨌든 괜찮은 ORM (특히 Java로 Hibernate와 같은 지연로드 지원이있는 것)과 제대로 설계되고 적절하게 표준화 된 데이터베이스 (비즈니스 객체를 처음부터 자연스럽게 디자인해야하는 경우가 많음)는 일반적으로 대부분의 정상적인 설계 접근법으로 잘 수행됩니다 .