2013-09-30 282 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)以及设计良好,规范正确的数据库(通常首先设计业务对象通常会自然出现)通常会在大多数健全的设计方法。