我是一名普通的perl程序员。我对语言本身没有问题,但使用“良好”对象设计。虽然我能够理解(大多数)CPAN模块,但没有严重的问题,我甚至无法设计自己的简单对象层次结构。
示例 - 现在面对一个非常简单的应用程序(Web和命令行界面):
commands.txt
)和零个或多个图像JobRepository
(另一个目录)的位置JobRepository
发送到全局渲染队列(再次,另一个目录)JobRepository/result
目录在bash
中,只有少数“不复杂的”bash脚本是可行的 - 但我想在Perl中做(因为Web界面) - 并且想要练习perlish(Moose)对象设计...
这里开始我的问题。
尝试“视觉”名词分析方法并制作下一张图片。
发布图片,因为它“更短”为:
package Iren::JobRepo;
use Moose;
use warnings;
has 'Jobs' => (is => 'rw', isa=>ArrayRef[Iren::Job]);
…
method AddJob {
...
}
等
正如您所看到的,它非常简单 - 但是立即面临一些决策问题,例如:
$user->send_email
- 让我很傻,因为我们向用户而不是用户发送电子邮件给自己... JobRepo->SendJobToRenderQueue
或我应该调用一些RenderQueue->addJob
方法? IPC::DirQueue
- (应该是RenderQueue的实现) 正如你所看到的,没有角色,没有特征 - 没什么 - 这很简单...... - 但充满了问题:(
任何人都可以帮忙清除这些烂摊子吗?什么应该是“好”的包层次结构?
所以,我真的迷失了,我开始对自己感到失望。其他问题(我知道,这些是基于意见的) - 但我必须问他们......
$cat->diets
:) - 但掌握了一些新东西 - 对我不好...... 对不起文字墙。我会很高兴得到任何指向好书或任何有帮助的东西......
答案 0 :(得分:8)
东西@daxim没有回答:
- 如何学习perl / Moose的好对象设计? (我可能永远不会使用其他语言)
- 多次搜索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,那将会有很大的帮助。