首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl中的数据封装?

Perl中的数据封装?
EN

Stack Overflow用户
提问于 2011-03-24 21:44:54
回答 4查看 2.7K关注 0票数 9

SO上的Perl社区好。我使用Perl已经有几年了,但由于我一直在这么做,所以我意识到我对Perl的了解还不够。

在过去的4年里,我写了相当大的脚本,并试图用面向对象的方式来完成。我知道Perl<6并不是真正的面向对象。

所以我不喜欢的一点是我没有数据封装,这意味着没有对包("class")真正私有的变量(或者我可能不知道怎么做)。

我有类似这样的东西(我的脚本只有一小部分)

代码语言:javascript
复制
package TAG;

sub new () {
    my $classname = shift;
    my $self      = {};

    bless( $self, $classname );
    $self->initialize();
    return $self;
}

sub initialize() {
    my $self = shift;

    # Only an example, I have a long list of items in this "class"
    $self->{ID}          = "NA"; 
}

sub setID() {
    ...
}

sub getID() {
    ...
}

在我的主脚本中,我使用它,然后这样:

代码语言:javascript
复制
my $CurrentItem;
$CurrentItem = new TAG();

$CurrentItem->getID()

代码语言:javascript
复制
$CurrentItem->{ID} = "Something";

也是有效的,但我更希望这是不可能的。

有没有办法对我在"class“中使用的数据进行更好的封装,这样我(或其他用户)就会被迫使用get和set方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-24 21:53:51

这是一个已经在多个地方讨论过的问题,有几种可能的解决方案,但没有一个是理想的。

This paper讨论了闭包、标量和使用Tie::SecureHash的有限访问散列等选项,更倾向于最后一种方法。

This blog认为,在Perl语言中,有时应该违反封装,尽管这样做会带来一些负面影响。

您还可以查看Perl5对象的moose。它是为了鼓励使用encapsulated objects而编写的。

票数 12
EN

Stack Overflow用户

发布于 2011-03-24 22:32:48

Perl支持部分封装:委托和信息隐藏。另外,封装的另一个部分就是我所说的“行为受限数据”,它将数据与行为关联起来。在维基百科关于"Encapsulation (object-oriented programming)“的文章中,它建议”封装是指两个相关但截然不同的概念之一“(斜体我的)。列出的第二个是

  • 便于将数据与对该数据进行操作的方法(或其他函数)捆绑在一起的语言构造。

文章的一个很好的部分是“信息隐藏”。Perl允许使用隐藏复杂性的OO类型,只要您不太注意它。在Perl中,我一直在使用封装。有这么多的问题,我一次解决了,一次又一次地使用,我的想法是,只要接口类不“到达”,行为就应该是预期的。

大多数动态语言都是通过安全封装来实现的,而这些方式是较重的语言实现的。但是,尽管如此,Perl允许您将行为分配给任何类型的引用,而Inside-Out objects在Perl中可能与任何其他形式的封装一样安全--尽管编写起来更加繁琐,但这只会给您一种情况,即您为需要它的类选择了从安全性到细节的折衷。

票数 6
EN

Stack Overflow用户

发布于 2011-03-25 01:02:09

Perl语言中最直接的解决方案就是在变量前加上一些东西(比如"_ID",或者"private_ID",或者你想要的任何东西),然后不记录下来,因为它不是接口的一部分。

还有其他方法,也可以做到,但你必须问谁会试图像这样破坏它,如果他们想滥用你的代码,那么无论发生什么,你都会遇到麻烦。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5420134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档