4

我目前正在规划一个新系统的设计,我需要编写与后端 API 交互的代码。我正在考虑对象组合和继承,并决定在我的情况下最正确的过程是组合而不是继承,因为我的对象彼此之间具有“具有”关系,而不是“是”。

我现在发现,由于某些对象依赖于其他对象,因此可能存在“对象 A”具有“对象 B”属性和“对象 C”属性的情况 - 但是“对象 B”也具有“对象”属性C”。

希望这个类比更有意义:

假设我有一家公司出售装有猫和放射性物质的盒子,这些盒子可能会或可能永远不会做出反应:

我把我的产品卖给组织。用户通过指定他们所属的组织向我注册。一个组织可能有很多用户,也可能没有。用户必须拥有其所属的组织。我跟踪我的产品(盒子作为一个实体,猫作为一个实体)以及它们属于哪个组织。我还跟踪猫以及它们在哪些盒子中。一个组织可能有很多盒子,其中任何一个都有很多猫。盒子可能是空的。一些用户被允许购买新盒子,而其他用户只被允许查看它们。

身份验证和授权都由我与之交互的 API 管理。

就对象关系而言:

$user has a => $organization that it belongs to

$user has a => $role that dictates what it may or may not do.

$box has a => $organization that it belongs to

现在:

$cat has a => $box that it belongs to 

$cat has a => $organization that it belongs to ?

或者

$cat has a => $box that it belongs to WHICH has a => $organization that it belongs to

这里正确的设计决策是什么?有没有我没有考虑的其他方面可能使一种选择比另一种更可行?

我将在这个系统中使用和实现一个MVC设计模式。Perl CatalystMoose

提前感谢大家的贡献。

4

1 回答 1

11

你要问自己一个问题。猫或盒子属于哪个组织对猫有影响吗?

例如,当你有一个猫对象时,你甚至需要知道它的主人吗?是否有以猫开头的功能,并且在不知道猫对象之前就知道所有者特定于所有者的功能吗?

例如,典型的功能总是从用户开始:

my $org = $user->org();

继续寻找它的猫

my @cats = $org->listOwnedCats();

然后对其中一只猫做一些事情:

$cats[0]->CheckHealth();

请注意一个重要的事实:当您找到特定的猫时 - 您已经知道该组织,因为这就是您首先获得猫对象的方式。零需要存储$org$cat对象内部。

盒子里的猫也是如此。除了知道有些猫还没有装箱外,您是否还需要找到猫的物品箱?

如果该功能模式成立(几乎总是如此),那么您将拥有一个非常严格的对象模型:

  • 用户:属性是“org”和其他一些东西
  • Org:属性是“UnboxedCatList”和“BoxList” - 一个是尚未分配到盒子的猫数组;一个是盒子对象的数组
    • 其中一种方法是PlaceUnboxedCatIntoBox()
  • Box:属性是“CatList”(猫对象数组)
  • 猫:属性是特定于猫的——猫不拥有盒子或组织。
于 2013-07-02T07:33:05.710 回答