2013-07-02 46 views
4

我目前正在计划一个新系统的设计,我需要编写与后端API交互的代码。我正在考虑对象的组成和继承,并决定在我的情况下最正确的过程将是与继承的构图一起去,因为我的对象彼此具有“有”关系而不是“是”。使用Perl的OO设计模式

我现在发现虽然由于某些对象依赖于其他对象,因此可能存在“对象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 ? 

OR

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

这里正确的设计决定是什么?有没有其他方面我不考虑哪一个可能使一个选项比另一个更可行?

我将在此系统中使用Perl CatalystMoose实施MVC设计模式。

谢谢大家的贡献。

回答

11

你得问自己一个问题。一只猫或一只箱子属于哪个组织对猫有影响吗?例如,当你有猫对象时,你甚至需要知道它的主人吗?是否有一个以猫开始的功能,并且做一些特定于业主的功能 - 在你不知道猫对象之前不知道拥有者?

E.g.一个典型的功能将始终与用户启动:

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

继续找到自己的猫

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

然后做一些与猫科动物之一:

$cats[0]->CheckHealth(); 

注意的重要事实:当你到达特定的猫 - 你已经知道该组织,因为那是你如何得到猫对象。在$cat对象内部不需要存储$org

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

如果功能模式,持有(因为它几乎总是如此),你有一个非常两岸转发的对象模型:

  • 用户:属性是“组织”和一些其他的东西
  • 组织:属性是“UnboxedCatList”和“BoxList” - 一个是尚未分配给框的猫的数组;一个是框对象的数组
    • 其中一种方法是PlaceUnboxedCatIntoBox()
  • 框:属性是“CatList”(猫对象的数组)
  • 猫:属性是猫特定 - 猫的唐自己的盒子或组织。
+0

嗨有。首先谢谢你的回复。你的说法是有道理的 - 这将使我能够在整个系统中保持一个整洁的设计模式。我只会设计对象来关心直接影响他们的东西,并丢弃它不需要的链条上的任何东西。如果我在这里有足够的街道信贷,我会给你一个投票。一旦我达到了15的信誉标记要求,我会回来投票:) – nmap911

+0

@ nmap911 - 如果答案有帮助,你可以(也应该:)也标记为“接受”(checbox左边)。很高兴我能提供有用的反馈意见 – DVK

+0

非常好,感谢您的支持。有标记 - 我现在也获得了街头的信誉,所以有了投票权 – nmap911