2011-08-16 10 views
6

プロパティファイルを管理するための最良の方法をお楽しみにしています。プロパティの管理と読み込みに関するベストプラクティス

私たちは一連のデバイス(たとえばN)を持っています。これらのデバイスのそれぞれは、特定の特性を有する。例: デバイスAは、特性

A.a11 = valuea11

A.a12 = valuea12

を有しています。

デバイスBは

B.b11 = valueb11

B.b12 = valueb12 特性を有します。

これ以外にも、すべてのデバイスに共通のプロパティがいくつかあります。

X.x11 = valuex11

X.x12 = valuex12

私は、これらのデバイス上でいくつかのテストスイートを実行するための自動化を書いています。一度に、単一のデバイスで実行されているスクリプトをテストします。デバイス名は引数として渡されます。デバイス名に基づいて、コードはそれぞれのプロパティと共通プロパティを取得し、これらのプロパティでデバイスを更新します。例えばデバイスAの場合、コードはA.a11、A.a12(デバイスA固有)とX.x11、X.x12(共通)プロパティを取得し、テストスクリプトを実行する前にデバイスにアップロードします。

コードでは、これらのプロパティを管理して、デバイス特有の共通のプロパティのみをデバイスにアップロードし、残りのものは無視します。私はこのように管理しています

if ($device eq 'A') then 
    upload A's properties 
elsif ($device eq 'B') then 
    upload B's properties 
endif 

upload Common (X) properties. 

このようにデバイスを管理することは、デバイスの数が増え続けるにつれて少し難しくなってきています。

私は、これらのプロパティを管理するための他の最善のアプローチを楽しみにしています。

答えて

3

これは、v(一般的なOOP文献の形質とも呼ばれる)が有用な良いケースです。

古典的オブジェクトの代わりに、クラスです。ロールはオブジェクト* にあり、ロールは*です。

詳細については、適切なMooseドキュメントを参照してください。

例:

package Device::ActLikeA; 
use Moose::Role; 

has 'attribute' => (
    isa => string, 
    is => 'rw', 
    default => 'Apple', 
); 

sub an_a_like_method { 
    my $self = shift; 

    # foo 
} 

1; 

だから今、私はそれで何をしますか、Device::ActLikeAと呼ばれる役割を持っていますか?

まあ、私はクラスに役割を適用することができ、かつActLikeAで定義されたコードと属性は、クラスで利用できるようになります:

package Device::USBButterChurn; 
use Moose; 

does 'Device::ActLikeA'; 

# now has an attribute 'attribute' and a method 'an_a_like_method' 
1; 

あなたは、クラスの個々のインスタンスにロールを適用することができます。

package Device; 
use Moose; 

has 'part_no' => (
    isa => 'Str', 
    is => 'ro', 
    required => 1, 
); 

has 'serial' => { 
    isa => 'Str', 
    is => 'ro', 
    lazy => 1, 
    build => '_build_serial', 
); 

1; 

一部を見て、適切なロールを適用し、その後、メインコード:ここで

my @PART_MATCH = (
    [ qr/Foo/,    'Device::MetaSyntacticVariable' ], 
    [ qr/^...-[^_]*[A][^-], 'Device::ActLikeA; ], 
    [ qr/^...-[^_]*[B][^-], 'Device::ActLikeB; ], 
# etc 
); 

my $parts = load_parts($config_file); 

for my $part (@$parts) { 

    my $part_no = $part->part_number(); 

    for my $_ (@PART_MATCH) { 
     my ($match, $role) = @$_; 
     $part->apply_role($role) 
      if $part_no =~ /$match/; 
    } 

} 
0

は非常に直接的なアプローチです。すべての

まずあなたはXとB「され、」X、すなわちXはAとB

両方の親

次に、あなたのupload_device日常的意志である「-である」ことを示すための方法が必要ですこのような何かを見て:

sub upload_properties { 
    my $device = shift; 
    ... upload the "specific" properties of $device ... 
    for my $parent (parent's of $device) { 
    upload_properties($parent); 
    } 
} 

一実施:

A.isa = X 

「は、」あなたのような設定ファイルの行との関係を示し

(他のいくつかの構文を使用する自由を感じる - あなたが使用することは、あなたがファイルを解析する方法に依存します。)

を設定ファイルから、次のようになり、すべてのデバイスのハッシュ作成:

$all_devices = { 
    A => { a11 => valuea11, a12 => valuea12, isa => [ 'X' ]}, 
    B => { b11 => valueb11, b12 => valueb12, isa => [ 'X' ] }, 
    X => { x11 => valuex11, x12 => valuex12, isa => [] }, 
} 

upload_propertiesルーチン:

sub upload_properties { 
    my ($device) = @_; 
    for my $key (keys %$device) { 
    next if $key eq "isa"; 
    ... upload property $key => $device->{$key} ... 
    } 
    my $isa = $device->{isa}; # this should be an array ref 
    for my $parent_name (@$isa) { 
    my $parent = $all_devices->{$parent_name}; 
    upload_properties($parent); 
    } 
} 

# e.g. to upload device 'A': 

upload_properties($all_devices->{'A'}); 
0

あなたは、ハッシュでデバイスのプロパティを格納することにより、大規模な場合は、他のチェーンを排除することができます。 次に、特定の$デバイスがそのハッシュに現れることを確認するだけで済みます。

#!/usr/bin/perl 
use warnings; 
use strict; 

my %vals = (
    A => { 
     a11 => 'valuea11', 
     a12 => 'valuea12', 
    }, 
    B => { 
     b11 => 'valueb11', 
     b12 => 'valueb12', 
    }, 
); 

foreach my $device qw(A B C) { 
    if (exists $vals{$device}) { 
     upload_properties($vals{$device}); 
    } 
    else { 
     warn "'$device' is not a valid device\n"; 
    } 
} 

sub upload_properties { 
    my($h) = @_; 
    print "setting $_=$h->{$_}\n" for sort keys %$h; # simulate upload 
    print "\n"; 
} 
関連する問題