2013-07-23 65 views
13

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

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

  • 已认证的学生上传了一个zip文件(什么包含渲染作业)
  • 解压缩文件和新的目录,并检查它的内容(应包含exatly一个文件commands.txt)和零个或多个图像
  • 如果内容为确定 - 移动到地方叫目录:JobRepository(另一个目录)
  • 如果用户决定运行渲染作业 - 从他自己的JobRepository发送工作全局渲染队列(再次,另一个目录)
  • 另一个进程从队列(FIFO - 设计与IPC::DirQueue)主罚工作和执行渲染过程
  • 完成后,把结果到用户JobRepository/result目录
  • 发送电子邮件给用户
  • 学生可以下载压缩结果

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

在这里开始我的问题。

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

enter image description here

发布的图像,因为它是 “短” 为:

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

正如你所看到的,这是非常简单的 - 但immediatelly面临一些决定问题,例如:

  • 什么对象应该执行unzip/zip/checkJob方法?它属于:JobRepository的作业“拉链”本身?
  • 什么对象应该发送电子邮件给用户? $user->send_email - 来我愚蠢,因为我们发送电子邮件给用户,而不是用户本身...
  • “谁”应该从用户的JobRepo发送作业到RenderQueue? JobRepo->SendJobToRenderQueue或我应该拨打RenderQueue->addJob方法?
  • 什么对象应该应该使用ISA IPC::DirQueue - (应该是RenderQueue的implememtation)
  • 循环定义用户已有 JobRepository,存储库很多Jobs,但Job 有?用户? (要知道向谁属于工作) - 等..

正如你所看到的,没有角色,在这里没有性状 - 什么 - 这是简单的... - 但充满问题:(

任何人都可以帮助清除混乱?什么应该是“好”包层次?

所以,我真的迷路了,我开始失望自己。但我必须问他们...

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

对不起,对文本的墙。我会很高兴得到任何指向好书或任何什么有什么帮助...

+1

+1为做好准备工作,并希望我可以给第二个+1关心好的对象设计。 – DVK

回答

5

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

JobRepository

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

RenderQueue

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

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

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

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

用户有权JobRepository

这是错误的,将其删除。

但是Job有?用户?

正确。


为您设计的最后两分,将有极大的帮助,如果你画了UML前ER diagram

8

东西@daxim没有回答:

  • 如何学习好对象设计的Perl /驼鹿? (我可能永远不会使用另一种语言)
  • 先学习一般的面向对象设计(你似乎对基础知识掌握好)
  • 然后了解角色。它们有助于在许多情况下简化您的设计,而不是Java OO的一部分,因此通常不包含在基本的OO文献中。
  • 对于Perl特定的东西,我会强烈推荐cromatic的“Modern Perl”一书以及他的Modern Perl博客的全部内容。这本书可以买到,但IIRC也可以免费获得。
  • 此外,要查看哪里不需要使用OO,但使用Perl的其他功能,强烈建议您阅读免费的“Higher Order Perl”一书。
  • 确保对于实际编码,您了解高级设计的事情,您可以考虑Moose(Moo)而不是Perl 5的本地OO。 Google针对初学者的“驼鹿演示文稿perl”。
  • 搜索有关对象的设计谷歌(和太#2)很多次,都引用了“四甘德”一书(和其他一些)。但通常用于Java。 perl/Moose是值得购买的吗?或者,这里还有一些perl/Moose的好书吗?
  • 是一些很好的技术,如何检查正确的对象设计?

坦率地说,检查的最佳方法是:(1)与第二一双眼睛和(2)看你怎么屈尊最多可维护和重用设计评审。每次更新都不需要改变很多设计。我不知道有任何特定的技术/程序方法来检查。

一个很好的经验法则是:如果您需要改变某种行为的方式,或许是大幅度的,那么您的代码需要改变多少?最好的设计是使变化最小化的设计。

  • 简单 - 你如何掌握你的对象层次结构/角色/性状等..?虽然我读的例子 - 我明白$ CAT->饮食:) - 但掌握一些新的东西 - 是对我不好...

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


循环定义。用户有JobRepository,仓库有很多工作,但工作有?用户? (需要知道谁属于这份工作) - 等等。

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

简短版本:在真实的代码中,如果没有用户,你不可能从头开始工作 - 当你开始工作的时候,你很可能已经开始使用已知的用户并从那里获得作业存储库用户。您无需再重新找到用户。

+0

+1对于一个难题,真的很好。 – jm666