1

各レベルが個別のクラスで表される次のツリーのような構造があります。

Book ------ Page ------ Line
     1    n      1    n

Book::pages各クラスには、すべてのメンバーを保持するプロパティ (祝福された参照の配列としての/g/など)、レベルに固有のプロパティ ( などBook::author)、およびメンバーを追加/削除するためのメソッドがあります。

ここで、すべてのデータを単一のファイルに保存/ロードしたいと考えています。リレーショナル DB にはならない (ほとんどの場合 YAML が使用される) ため、基本的にある時点で取得する必要があるのは次のようなものです。

my $book = {
    author  => "Fred Flinstone",
    name    => "My Favorite Stones",
    pages   => [
        {
            number  => 1,
            footer  => "Dedicated to Wilma",
            lines   => [ ],
        },
        {
            number  => 2,
            lines   => [
                { text => "Preface", style => "h1" },
                { text => "This book is about my favorite stones:" },
                { text => "Marble" },
                # ...
            ]
        },
        # ...
    ]
};

Book には、すべてのメンバー クラスを認識できるスマートなメソッドのペアが 1 つあるべきでしょうか? または、各クラスはその一部を実装して、たとえばLine::save次のようなものを返す必要があり{ text => "Marble" }ますか?

これを実装する正しい方法は何ですか? 可能な限り実際のデータに限定されたソリューションが必要です。明日追加することに決め、 s もPage::bookmarks保存したい場合はどうすればBookmarkよいですか?

ああ、私は Moose を使用していますが、大きな違いはありません。

4

1 に答える 1

1

Moose を使用している場合は、これを処理するためにMooseX::Storageを参照することをお勧めします。このモジュールをパッケージ内で使用してから、with Storage('format' => 'YAML', 'io' => 'File');.

この簡単な例で始めることができます:

package Book;
use Moose;
use MooseX::Storage;

with Storage('format' => 'YAML', 'io' => 'File');

...

1;

my $book = Book->new();

...

# to store object
$book->store('book.yml');

# to get object back
my $book2 = Book->load('book.yml');
于 2013-02-27T23:05:36.920 に答える