Blessing a JSON into a perl class vs 私有属性

Blessing a JSON into a perl class vs private properties

我有一个 Json 结构,例如:

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

我用的是perl Json模块,我可以祝福Json return给我编成class,比如: my $result = bless($json->{output},'MyClass')

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

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

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

是的,答案是祝福闭包

这可以让您 read-only 访问数据(一旦您放下原始指针)或读写访问,但只能通过您的访问器方法,永远不会直接访问数据:

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;

下面是Objects with Private Variables

的介绍