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 のベスト プラクティス アプローチはありますか? つまり、Json の出力をクラスに bless してデシリアライズできるのは非常に便利ですが、危険にも思えます。私は、bless を引き続き使用できると同時に、クライアント コードが上記の anyIwant シナリオを実行できないようにする、両方の長所を探しています。私は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 に答える