为什么只将PerlOO用作数据封装技术?

为什么只将PerlOO用作数据封装技术?,perl,oop,encapsulation,moose,Perl,Oop,Encapsulation,Moose,我试图使用一个PerlAPI,它是为使用MooseOO系统而编写的,但是对象之间绝对没有继承、聚合或组合 而且,除了一个用于调试的可选角色外,还不涉及任何角色或混合 就我目前所见,使用Moose似乎只是增加了大量的复杂性和编译时开销,但几乎没有什么好处 为什么要使用Moose或OO作为简单的封装方法,而不是使用更简单的技术将代码打包到Perl模块中 我只是想澄清一下,我完全相信使用Moose在Perl中正确、完整地实现OO的许多优点。我只是不明白为什么要使用OO作为一种简单的封装技术我不是为了支

我试图使用一个PerlAPI,它是为使用MooseOO系统而编写的,但是对象之间绝对没有继承、聚合或组合

而且,除了一个用于调试的可选角色外,还不涉及任何角色或混合

就我目前所见,使用Moose似乎只是增加了大量的复杂性和编译时开销,但几乎没有什么好处

为什么要使用Moose或OO作为简单的封装方法,而不是使用更简单的技术将代码打包到Perl模块中

我只是想澄清一下,我完全相信使用Moose在Perl中正确、完整地实现OO的许多优点。我只是不明白为什么要使用OO作为一种简单的封装技术我不是为了支持或不支持Perl OO而进行主观论证。我希望在这里使用OO范例会失去一些优势,因为我根本没有看到atm

有一系列关于Perl中数据封装的优秀观点。注意:我不是说系统阻止你去寻找不应该去的地方的强制封装,更多的是只在一个包中公开操作你想要处理的数据的方法

在这里使用OO是否有我所缺少的一些优势

编辑1:在做了一些调查工作之后,我刚刚看到Perl API的作者也大量参与了Moose框架的维护和支持

编辑2:我刚刚看到,它从稍微不同的角度提出了类似的问题。看起来我的答案实际上是“为什么你首先要增加复杂性?”特别是考虑到上面编辑2中的信息

可能的答案

所讨论的API似乎只使用Moose OO系统来防止名称空间污染


这也可以通过使用Perl包来完成,不过正如@amon在下面的评论中指出的那样,使用标准包机制很快就会变得很麻烦。顺便说一句,非常感谢所有的评论,以帮助澄清我的问题。

每种情况都是不同的,您是否选择使用Moose或其他对象框架(或根本不使用)实际上取决于您计划做什么以及您的需求是什么

也许没有任何直接的好处来写与麋鹿有关的系统,但考虑这些:

  • 您可以自由访问Moose的元对象系统,因此您可以以定义良好的方式查询对象以获取有用的信息
  • 您可以使用Moose的继承系统扩展提供的类;因此,即使他们自己不使用继承,如果需要的话,框架已经准备好了
  • 您可以放心,因为您知道该系统是基于部署最广泛、测试最完善的Perl对象框架构建的
  • 人们知道驼鹿,这意味着如果有什么东西坏了,有更高的概率得到问题的答案

总之,使用流行工具有其固有的价值。

不确定它是否与所讨论的API相关,但似乎还没有人提到数据类型——这是Moose或Moo的一大好处,它易于定义和理解(并且可重用)属性的类型验证和强制。

我完全同意您关于Moose对于OO的优势的看法。我不明白的是,为什么仅仅将OO作为一种数据封装技术来使用。@RobWells:你能澄清这个问题吗?在发表关于数据的评论之前,我一直认为您只是在谈论代码封装(例如,一个只实例化一个单例的模块),这主要是因为您“没有使用更简单的技术将代码打包到Perl模块中”@ysth现在希望澄清这一点。顺便说一句,代码封装也包括在内,因为Perl模块的成员函数也是封装的一部分。如果将这个问题重新表述为“什么时候使用Moose之类的OO框架,什么时候不使用;简单对象的优缺点是什么”,那么这个问题就不太可能被认为是非建设性的?@ysth我同意你提出的问题,但那不是我想要问的。在Perl(尤其是Moose)中使用OO框架的优点是众所周知的。我想知道为什么在Perl模块提供数据封装的情况下,您会使用OO来进行数据封装。也许每个人都误读您的问题的原因是,他们(和我一样)很难看到非OO Perl模块如何提供数据封装。你能提供一个我们在这里讨论的例子吗?我对这个问题的理解是“如果你的对象只不过是一个受祝福的引用——没有继承,没有简单访问器以外的方法,没有角色等等——那么让它们成为对象而不只是使用普通引用有什么意义呢?”这是否合理准确,@Rob Wells?在这种情况下,OOP提供了名称空间。多个不相关的类可以有同名的方法。如果所有函数都导入到当前包中,则会出现冲突(当然,可以始终使用完全限定名,但这会让人厌烦)。从某种意义上说,每个Perl包都是一个单例对象,因此单例的所有问题都适用于这里(全局状态、可测试性!)。使用适当的对象可以避免这种情况。