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;
的介绍
我有一个 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;
的介绍