2013-09-30 226 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 {} 

選項1種手段浪費了大量的時間/資源的搶奪我可能不需要該頁面,但更容易信息管理。選項2很混亂,需要跟蹤哪些對象是什麼,但更快,更少的數據庫調用。哪個是「正確的」選項和/或是否有第三個正確的選項?

+0

您可以簡單地創建一個getter方法的屬性,它從數據庫中加載它時,它是必需的?或者/也可以這樣,你可以傳遞哪些字段作爲位向量傳遞給構造函數。 –

+0

如果我使用MVC,這是可能的嗎?我不需要全部加載在控制器中嗎?另外,如果我像你建議的那樣加載Artist,是不是還會嘗試加載其中的所有嵌套對象(配置文件,訂戶用戶,他們的配置文件等)? – user103555

+0

你在使用什麼框架?我不認爲任何模型的默認動作是加載相關類中的所有東西,除非你指定了它,例如在Yii中,你有一個'relationships()'方法,在那裏指定要加載的相關類 - 如果你不指定那裏你仍然可以加載。不,您不需要在控制器中執行此操作 - 您可以在模型代碼本身中執行此操作 - 在PHP中查找__get',這是一種神奇的方法,允許您爲私有/非現有變量指定getter方法。 (將在下一條評論中繼續) –

回答

0

兩件事情:

  1. 固守古老的「是」與「有」爲繼承之間決定與組成規則。

  2. 不要擔心優化查詢(尤其是如果它涉及到根本性的變化爲對象設計),除非你已經都確定你的具體的性能要求沒有得到滿足你異型您的應用程序,並確定這是你的瓶頸所在。 「面向對象」是一種組織和表示信息的概念方式;設計你的對象來精確準確地表達你的意圖和信息。不要過早優化。在任何情況下,一個體面的ORM(特別是具有惰性負載支持的應用程序,例如Hibernate with Java)以及設計良好,規範正確的數據庫(通常首先設計業務對象通常會自然出現)通常會在大多數健全的設計方法。