【问题标题】:OOP Objects, nested objects, and DAO'sOOP 对象、嵌套对象和 DAO
【发布时间】:2013-09-30 00:18:42
【问题描述】:

我一直在努力寻找最佳解决方案。我在使用 PHP 和 Java 时遇到了这个问题,所以这是对 OOP 问题的基本理解。示例在 PHP 中。

假设我在这里有一些对象。歌曲、艺术家、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 很混乱,需要跟踪哪个对象是什么,但更快且更少的 db 调用。哪个是“正确”选项和/或是否有第三个正确选项?

【问题讨论】:

  • 您能否简单地为需要时从数据库加载它的属性创建一个 getter 方法?或者/除此之外,您可以将需要哪些字段作为位向量传递给构造函数。
  • 如果我使用 MVC 可以吗?我不需要将它全部加载到控制器中吗?另外,如果我按照您的建议加载 Artist,它是否仍会尝试加载其中的所有嵌套对象(个人资料、订阅用户、他们的个人资料等)?
  • 你用的是什么框架?我不认为任何模型的默认操作是加载相关类中的所有内容,除非您指定它,例如在 Yii 中,您有一个 relationships() 方法,您可以在其中指定要加载的相关类 - 如果您不指定在那里你仍然可以加载。不,您不需要在控制器中执行此操作 - 您可以在模型代码本身中执行此操作 - 在 PHP 中查找 __get,这是一种神奇的方法,允许您为私有/不存在的变量指定 getter 方法。 (将在下一条评论中继续)
  • 关于加载子类(例如用户->艺术家->歌曲)的问题,如果艺术家生活在用户中,并且默认情况下不加载,那么当您加载它时,您可以默认情况下它也不会加载歌曲。
  • 我正在使用 Laravel。我一直编写自己的查询,我只是发现我可以编写更优化的查询来让我的应用程序运行得更快。我应该信任框架的内置数据访问库吗?从阅读不同框架文档页面上的示例来看,它们似乎总是运行多个小查询而不是一个更有效的查询。

标签: oop nested-class


【解决方案1】:

两件事:

  1. 坚持古老的“是”与“有”规则来决定继承与组合。

  2. 不要担心优化查询(尤其是当它涉及对对象设计的根本更改时),除非您确定您的特定性能要求没有得到满足并且您已经分析了您的应用程序并确定这是您的瓶颈所在。 “OOP”是一种组织和表示信息的概念方式;设计您的对象以准确和准确地代表您的意图和信息。不要过早优化。在任何情况下,一个体面的 ORM(尤其是支持延迟加载的 ORM,例如带有 Java 的 Hibernate)和一个设计良好、适当规范化的数据库(通常首先自然地来自于设计业务对象)通常会在大多数理智的设计方法中表现良好.

【讨论】:

    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 2011-01-26
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多