다음은 최선의 해결 방법을 찾는 데 어려움을 겪고있는 항목입니다. 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 번째의 올바른 옵션이 있습니까?
필요할 때 DB에서로드하는 속성에 대한 getter 메서드를 간단하게 만들 수 있습니까? 대안으로/이뿐 아니라 생성자에 대한 비트 벡터로 필요한 필드를 전달할 수 있습니다. –
MVC를 사용하고 있다면 가능합니까? 컨트롤러에 모두로드 할 필요가 없습니까? 또한 내가 좋아하는 아티스트를로드하는 중이라면 여전히 그 안의 모든 중첩 된 객체 (프로필, 구독자 사용자, 프로필 등)를로드하려고하지 않겠습니까? – user103555
어떤 프레임 워크를 사용하고 있습니까? 모든 모델의 기본 동작은 지정한 클래스를 제외한 모든 클래스를로드하는 것입니다. 예를 들어 Yii에서는로드 할 관련 클래스를 지정하는'relationships()'메서드가 있습니다. 거기에 아직로드 할 수 없도록 지정하지 마십시오. 컨트롤러에서이 작업을 수행 할 필요가 없습니다. 모델 코드 자체에서이를 수행 할 수 있습니다. PHP에서'__get '을 찾아보십시오. 개인/비 존재 변수에 대한 getter 메소드를 지정할 수있는 마법 메소드입니다. (다음 댓글에서 계속됩니다.) –