這是我一直在努力找出最佳解決方案的東西。我在使用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 {}
選項1種手段浪費了大量的時間/資源的搶奪我可能不需要該頁面,但更容易信息管理。選項2很混亂,需要跟蹤哪些對象是什麼,但更快,更少的數據庫調用。哪個是「正確的」選項和/或是否有第三個正確的選項?
您可以簡單地創建一個getter方法的屬性,它從數據庫中加載它時,它是必需的?或者/也可以這樣,你可以傳遞哪些字段作爲位向量傳遞給構造函數。 –
如果我使用MVC,這是可能的嗎?我不需要全部加載在控制器中嗎?另外,如果我像你建議的那樣加載Artist,是不是還會嘗試加載其中的所有嵌套對象(配置文件,訂戶用戶,他們的配置文件等)? – user103555
你在使用什麼框架?我不認爲任何模型的默認動作是加載相關類中的所有東西,除非你指定了它,例如在Yii中,你有一個'relationships()'方法,在那裏指定要加載的相關類 - 如果你不指定那裏你仍然可以加載。不,您不需要在控制器中執行此操作 - 您可以在模型代碼本身中執行此操作 - 在PHP中查找__get',這是一種神奇的方法,允許您爲私有/非現有變量指定getter方法。 (將在下一條評論中繼續) –