【问题标题】:Blessing a JSON into a perl class vs private properties将 JSON 祝福到 perl 类与私有属性
【发布时间】:2015-11-25 00:04:11
【问题描述】:

我有一个 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 等,但我不确定其中任何一个是否符合要求或只是引入更多复杂性。

【问题讨论】:

  • 常见的解释是 Perl 很好地要求你不要离开它的院子。它不会拿着霰弹枪站在门口。甚至 Moose 通常也会在后台使用祝福哈希。一个由内而外的解决方案可以变得更加防弹,但代价是更难以进入 Perl 的类所期望的典型结构(例如,继承变得更加棘手)。
  • 是的,有:不要这样做$result->{field1} = "anythingIwant";。我不是在开玩笑。最佳实践就是不要从类外部访问对象的内部。
  • 你真的声称有人可能会不小心写$result->{field1} = "anythingIwant"吗?或者您在问如何保护您的数据免受恶意攻击?
  • @DavidO/ikegami - 我开始接受 perl 只是以不同的方式处理这些类型的事情 (oop),实际上它更多的是关于对对象的期望管理。

标签: json perl oop private-members bless


【解决方案1】:

是的,答案是祝福结束。

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

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的介绍

【讨论】:

  • 感谢@cdlane - 我将不得不花一些时间来了解这些结构并对其进行测试。
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 2014-07-29
  • 2011-05-04
  • 2011-10-29
  • 2010-09-28
  • 2014-01-17
  • 2011-07-26
  • 2010-09-05
相关资源
最近更新 更多