这是我一直在努力找出最佳解决方案的东西。我在使用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方法。 (将在下一条评论中继续) –