这是我一直在努力寻找最佳解决方案的东西。我在使用PHP和Java时遇到了这个问题,因此它是对OOP问题的基本理解。示例在PHP中。
假设我在这里有一些对象。歌曲,艺术家,ArtistProfile,用户。
因此,在某些情况下,当我调用艺术家时(例如艺术家的个人资料页面),我想要ArtistProfile和一组User对象(订阅者),在其他情况下,我只需要艺术家信息,就像查看页面的曲。
我应该将一个对象嵌套为另一个对象的一部分,还是应该为不同的用法创建更具体的对象。
选项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很混乱,需要跟踪哪个对象是什么,但更快,更少的db调用。哪个是'正确'选项和/或是否有第3个正确选项?
答案 0 :(得分:0)
两件事:
坚持使用古老的“是一种”与“有一条”规则来决定继承与构成之间的关系。
不要担心优化查询(特别是如果它涉及对象设计的基本更改),除非您已确定未满足您的特定性能要求和 you'我们描述了您的应用程序,并确定这是您的瓶颈所在。 “OOP”是组织和表示信息的概念方式;设计您的对象,准确,准确地表达您的意图和信息。不要过早优化。在任何情况下,一个体面的ORM(特别是一个具有延迟加载支持的ORM,例如带有Java的Hibernate)和一个设计良好,正确规范化的数据库(通常自然地首先设计业务对象)通常会在大多数理智的设计方法中表现良好