管理和加载属性的最佳实践

rpg*_*rpg 6 java oop perl design-patterns properties

我期待了解一些管理属性文件的最佳方法.

我们有一套设备(比如说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.
Run Code Online (Sandbox Code Playgroud)

随着设备数量的不断增加,以这种方式管理设备变得有点困难.

所以我期待着一些其他最好的方法来管理这些属性.

dao*_*oad 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;
Run Code Online (Sandbox Code Playgroud)

现在我有一个名为 的角色Device::ActLikeA,我该怎么办?

好吧,我可以将角色应用到一个类中,并且定义的代码和属性ActLikeA将在该类中可用:

package Device::USBButterChurn;
use Moose;

does 'Device::ActLikeA';

# now has an attribute 'attribute' and a method 'an_a_like_method'
1;
Run Code Online (Sandbox Code Playgroud)

您还可以将角色应用于类的各个实例。

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;
Run Code Online (Sandbox Code Playgroud)

然后是查看该部分并应用适当角色的主要代码:

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/;
    }

}
Run Code Online (Sandbox Code Playgroud)