Perl / Moose OO设计,包层次结构

时间:2013-07-23 12:04:38

标签: perl moose

我是一名普通的perl程序员。我对语言本身没有问题,但使用“良好”对象设计。虽然我能够理解(大多数)CPAN模块,但没有严重的问题,我甚至无法设计自己的简单对象层次结构。

示例 - 现在面对一个非常简单的应用程序(Web和命令行界面):

  • 已经过身份验证的学生上传了一个zip文件(包含渲染作业的内容)
  • 将文件解压缩到新目录并检查其内容(应该包含一个文件commands.txt)和零个或多个图像
  • 如果内容正常 - 将目录移动到名为JobRepository(另一个目录)的位置
  • 如果用户决定运行渲染作业 - 将作业从他自己的JobRepository发送到全局渲染队列(再次,另一个目录)
  • 另一个进程从队列中获取作业(fifo - 使用IPC::DirQueue设计)并执行渲染过程
  • 完成后,将结果放入用户JobRepository/result目录
  • 向用户发送电子邮件
  • 学生可以下载压缩结果

bash中,只有少数“不复杂的”bash脚本是可行的 - 但我想在Perl中做(因为Web界面) - 并且想要练习perlish(Moose)对象设计...

这里开始我的问题。

尝试“视觉”名词分析方法并制作下一张图片。

enter image description here

发布图片,因为它“更短”为:

package Iren::JobRepo;
use Moose;
use warnings;
has 'Jobs' => (is => 'rw', isa=>ArrayRef[Iren::Job]);
…
method AddJob {
...
}

正如您所看到的,它非常简单 - 但是立即面临一些决策问题,例如:

  • 什么对象应该做unzip / zip / checkJob方法?它属于:JobRepository ot Job“zips”本身?
  • 哪个对象应该向用户发送电子邮件? $user->send_email - 让我很傻,因为我们向用户而不是用户发送电子邮件给自己...
  • “who”应该将作业从用户的JobRepo发送到RenderQueue? JobRepo->SendJobToRenderQueue或我应该调用一些RenderQueue->addJob方法?
  • 哪个对象应该使用ISA IPC::DirQueue - (应该是RenderQueue的实现)
  • 循环定义 用户 JobRepository,存储库多个作业,但作业有?用户? (需要知道属于谁的工作) - 等等..

正如你所看到的,没有角色,没有特征 - 没什么 - 这很简单...... - 但充满了问题:(

任何人都可以帮忙清除这些烂摊子吗?什么应该是“好”的包层次结构?

所以,我真的迷失了,我开始对自己感到失望。其他问题(我知道,这些是基于意见的) - 但我必须问他们......

  • 如何学习perl / Moose的良好对象设计? (我可能永远不会使用其他语言)
  • 多次搜索谷歌关于对象设计(以及Stackoverflow)被引用为“ Gand of Four ”一书(以及其他几本)。但通常用于Java。值得为perl / Moose购买?或者这里是perl / Moose的另一本好书?
  • 是如何检查正确的对象设计的一些好方法?
  • 来自UML的
  • 代码生成器可能不存在于Moose中 - 或者这里是否可以使用和推荐?
  • 简单 - 你如何掌握你的对象层次/角色/特征等......?虽然我正在阅读这些例子 - 我理解$cat->diets :) - 但掌握了一些新东西 - 对我不好......

对不起文字墙。我会很高兴得到任何指向好书或任何有帮助的东西......

2 个答案:

答案 0 :(得分:8)

东西@daxim没有回答:

  
      
  • 如何学习perl / Moose的好对象设计? (我可能永远不会使用其他语言)
  •   
  • 首先学习一般的OO设计(你似乎对基础知识有很好的把握)
  • 然后了解角色。它们有助于在很多情况下简化您的设计,而不是Java OO的一部分,因此通常不会涵盖在基本的OO文献中。
  • 对于Perl特定的东西,我强烈推荐 cromatic 的“Modern Perl”一书以及他的Modern Perl博客的全部内容。这本书可以买到,但IIRC也是免费提供的。
  • 此外,要了解您不需要使用OO但Perl的其他功能,强烈建议您阅读免费的“高阶Perl”一书。
  • 确保对于实际编码,你了解高级设计的东西,你会看到Moose(Moo)而不是Perl 5的原生OO。谷歌为初学者提供“moose presentation perl”。
  
      
  • 多次搜索google关于对象设计(以及Stackoverflow)被引用为“Gand of Four”一书(以及其他几本)。但通常用于Java。值得为perl / Moose购买?或者是perl / Moose的其他好书?
  •   
  
      
  • 是一种很好的技巧,如何检查正确的对象设计?
  •   

坦率地说,最好的检查方法是:(1)用第二双眼睛进行设计审查;(2)看看你的设计如何保持和重复使用。每次更新都不需要改变好设计。我不知道有任何具体的技术/程序方法可以检查。

一个好的经验法则是:如果你需要改变某些行为的方式,或许需要改变,你需要改变多少代码?最好的设计是最小化变化的设计。

  
      
  • 简单 - 你如何掌握你的对象层次/角色/特征等......?虽然我正在阅读这些例子 - 我理解$ cat->饮食:) - 但掌握一些新东西 - 对我不好......
  •   

实践。理想情况下,找到教程/书籍解决的问题,首先解决自己,然后看看他们如何解决它。然后将最佳组合解决方案发布到codereview.SE并询问是否可以改进:)


  

循环定义。用户有JobRepository,Repository有很多Jobs,但是Job有吗?用户? (需要知道属于谁的工作) - 等等..

不,你不需要知道这份工作属于谁。我在几周前解释了为什么 - 我在这里提出并回答了一个非常类似的问题:OO Design Patterns with Perl

简短版本:在实际代码中,您不太可能在没有用户的情况下开始工作 - 当您完成工作时,您很可能已经从已知用户开始并从该用户获得了作业存储库。您无需再重新找到该用户。

答案 1 :(得分:5)

  

unzip / zip / checkJob方法应该做什么对象?

JobRepository

  

哪个对象应该向用户发送电子邮件?

RenderQueue

  

我应该调用一些RenderQueue-> addJob方法?

是的,这样做。责任属于RenderQueue,因为它可以决定是否接受工作。

  

什么对象应该使用ISA IPC :: DirQueue

亩。不要继承,只需委托。

  

用户有JobRepository

这是错误的,将其删除。

  

但约伯有?用户?

正确。


对于你设计的最后两点,如果你在UML之前画了一个ER diagram,那将会有很大的帮助。