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

Nem*_*emo 13 perl moose

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

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

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

bash它是可行的少数" 不复杂 " bash脚本-但我想这样做在Perl(因为网络接口) -并希望实践Perlish的(麋鹿)对象设计...

这里开始我的问题.

尝试"视觉" 名词分析方法,并制作下一个图像.

在此输入图像描述

发布图片,因为它"更短"为:

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

等等

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

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

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

任何人都可以帮助清除混乱吗?什么应该是"好"的包层次结构?

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

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

抱歉,文字墙.我会很高兴得到任何指向好书或任何有帮助的东西......

DVK*_*DVK 8

东西@daxim没回答:

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

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

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

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

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


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

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

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


dax*_*xim 5

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

JobRepository

什么对象应该向用户发送电子邮件?

RenderQueue

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

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

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

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

用户有JobRepository

这是错误的,删除它.

但约伯呢?用户?

正确.


对于设计的最后两点,如果你在UML之前绘制了ER图,那将会有很大的帮助.