使用Perl的OO设计模式

时间:2013-07-02 06:54:07

标签: perl model-view-controller composition moose catalyst

我目前正计划设计一个新系统,我需要编写与后端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 ?

OR

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

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

我将使用MVCPerl Catalyst在此系统中实施Moose设计模式。

先谢谢你们所有人的贡献。

1 个答案:

答案 0 :(得分:11)

你要问自己一个问题。一只猫或一个盒子所属的猫是否重要?

例如,当你有猫对象时,你甚至需要了解它的拥有者吗?是否有一个以猫为开头的功能,并且具有所有者特定的功能 - 在您知道猫对象之前不知道所有者?

E.g。典型的功能总是从用户开始:

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

继续寻找它的猫

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

然后对其中一只猫做点什么:

$cats[0]->CheckHealth();

请注意一个重要的事实:当你到达特定的猫时 - 你已经知道了这个组织,因为那是你如何得到猫对象的第一个地方。无需在$org对象中存储$cat

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

如果该功能模式成立(几乎总是如此),那么你就拥有了一个非常直接的对象模型:

  • 用户:属性是“org”和其他一些东西
  • 组织:属性是“UnboxedCatList”和“BoxList” - 一个是尚未分配给盒子的猫的数组;一个是盒子对象的数组
    • 其中一种方法是PlaceUnboxedCatIntoBox()
  • Box:属性为“CatList”(cat对象数组)
  • Cat:属性 cat specific - cat不拥有盒子或组织。