лучшие практики для управления и загрузки свойств - PullRequest
6 голосов
/ 16 августа 2011

Я с нетерпением жду, чтобы узнать некоторые лучшие подходы к управлению файлами свойств.

У нас есть набор устройств (скажем, N). Каждое из этих устройств обладает определенными свойствами. например Устройство А имеет свойства

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 ]

3 голосов
/ 16 августа 2011

Это хороший случай, когда v (он же черты в обобщенной литературе ООП) будет полезен.

Вместо классического объекта - это класс , сРоли объект * выполняет роль *.

Проверьте соответствующие документы 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 голосов
/ 16 августа 2011

Вы можете исключить большую цепочку if-else, сохранив свойства устройства в хэше. Тогда вам нужно только убедиться, что конкретное устройство $ отображается в этом хэше.

#!/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";
}
0 голосов
/ 16 августа 2011

Вот очень прямой подход.

Прежде всего вам нужен способ указать, что A "is-a" X и B "is-a" 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);
  }
}

Одна реализация:

Укажите отношение "is-a" со строкой в ​​вашем файле конфигурации, например:

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'} );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...