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

标签 java perl oop design-patterns properties

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

我们有一组设备(比如 N)。这些设备中的每一个都具有某些属性。 例如 设备A有属性

A.a11=valuea11

A.a12=valuea12

.

设备B有属性

B.b11=值b11

B.b12=值b12 .

除此之外,它们还有一些适用于所有设备的通用属性。

X.x11=值x11

X.x12=值x12

我正在编写用于在这些设备上运行一些测试套件的自动化程序。一次,在单个设备上运行测试脚本。设备名称将作为参数传递。根据设备名称,代码将获取各自的属性和公共(public)属性,并使用这些属性更新设备。例如对于设备 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.

随着设备数量的不断增加,以这种方式管理设备变得越来越困难。

因此,我期待其他一些最佳方法来管理这些属性。

最佳答案

这是一个很好的案例,其中 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 的角色,我该如何处理它?<​​/p>

好吧,我可以将角色应用到一个类中,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/;
    }

}

关于java - 管理和加载属性的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7074924/

相关文章:

c++ - 在 C++ 中意外调用析构函数

Java:静态类?

java - 我在 Java 中得到不同的冒泡排序运行时间

linux - 在 OPEN 管道命令中重定向 STDERR。 Linux 操作系统

python - 你能推荐一些关于面向对象软件设计的扩展例子吗?

regex - 限制perl中的for循环

perl - 根据范围在 Perl 中查找值

java - 在连接池中获取 SQLException 错误

java - 如何在 Selenium Webdriver 中比较数组列表与列表 Web 元素

java - 调用过程默认值而不将值绑定(bind)到 Jdbc 中的参数