2

我有一个 Json 结构,例如:

{
  "field1" => "one",
  "field2" => "two",
  ...
}

我用的是perl的Json模块,我可以祝福返回给我的Json变成一个类,比如: my $result = bless($json->{output},'MyClass')

到目前为止一切顺利 - 现在我可以在 MyClass.pm 中创建方法来返回 field1、field2 等的值。所以似乎通过 bless,我可以直接访问设置对象的属性。但危险是我也可以在代码的后面做一些事情,比如: $result->{field1} = "anythingIwant";

......这不太好。我知道我可以将属性设置_field1为表示隐私,但这并不妨碍我这样做$result->{_field1} = "anythingIwant";

那么 perl 中是否有最佳实践方法来处理这种情况?换句话说,能够bless Json输出成一个类进行反序列化是超级方便的,但也显得很危险。我正在寻找两全其美的方法,我仍然可以使用 bless 但也可以防止任何客户端代码执行上述anythingIwant 场景。我已经研究过 Moose、InsideOut 等,但我不确定其中任何一个是否符合要求或只是引入更多复杂性。

4

1 回答 1

0

是的,答案是祝福关闭。

这可以为您提供对数据的只读访问权限(一旦您放下原始指针)或读写访问权限,但只能通过您的访问器方法,从不直接访问数据:

package MyClass;

sub new {
    my $type = shift;
    my $class = ref $type || $type;

    my $self = shift;

    my $closure = sub {
              $self->{$_[0]};
        };

     return bless $closure, $class;
}

package main;

use strict;

my $json_snippet = {
  "field1" => "one",
  "field2" => "two",
};

my $object = MyClass->new($json_snippet);

print($object->("field2"), "\n");

1;

这是对带有私有变量的对象的介绍

于 2016-01-14T20:25:07.987 回答