题
我有一个软件包(实际上只是一个子例程),我经常用来解析配置文件等。基本上看起来像这样:
sub get_settings {
my %config;
my $config = 'path...';
unless(-r $config) {
die("Couldn't read config");
}
open CONFIG, '<', $config or die $!;
while(<CONFIG>) {
next if (($_ eq "\n") or /^\;/);
chomp;
my($setting, $value) = split(/=/, $_);
$config{$setting} = $value;
}
return %config;
}
非常基本,但我想知道该如何(是否)可以/应该重新编写 哎呀?真的只是为了学习,从未见过何时以及为什么使用 保佑. =)
谢谢!
解决方案
问题的答案与您使用的程序包中的程序相比,与软件包本身更多有关。
如果这是一个相当大的基于OOP的应用程序/脚本,那么将其OOP肯定是有意义的,因为这是客户所期望的(应用程序和编写这些应用程序/脚本的人)。还具有命令式库库,就像拇指酸痛一样伸出并产生复杂性。
相反,如果包装在较短的命令脚本中使用,则OOP接口将与客户的期望发生冲突(即脚本 +人开发它们)。
也许您在方法之间迁移(例如,脚本变得大而笨拙,需要更好地组织起来,也许使用OOP)在这种情况下,设置/config的类别是一个很好的起点,因为它们往往是分开的,并且明确的责任感。
简而言之:做最有意义的包裹所在位置。
其他提示
这是(希望!)基于OO的配置抽象的简单示例:
NB。您可以使用其他模块,甚至可以自己滚动。以下是一般示例。
RoomConfig.pm
package RoomConfig;
use Moose;
with 'MooseX::SimpleConfig';
has doors => (is => 'rw', isa => 'Int', required => 1);
has windows => (is => 'rw', isa => 'Int', default => sub {0});
1;
因此,上面是我们的OO配置类。一切都整齐地声明了,因此您清楚地知道配置选项可用且有效,即。它的自我记录。
因此要创建一个 room
从配置文件将是:
use RoomConfig;
my $box_room = RoomConfig->new_with_config( configfile => 'box_room.yaml' );
因为它是一个课程,我也可以实例化 room
没有配置文件:
my $cupboard = RoomConfig->new( doors => 1 );
my $utility_room = RoomConfig->new( doors => 2 );
my $master_bedroom = RoomConfig->new(
doors => 1,
windows => 2, # dual aspect
);
而且,使用这些特定模块,我们获得了这样的额外功能:
# below throws exception because room must have a door!
my $room_with_no_door_or_window = RoomConfig->new;
因此,我的配置很容易来自配置文件或设置属性。
我们可以通过扩展不同类型的不同类型的配置来进一步发展 rooms
:
浴室Config.pm
package BathRoomConfig;
use Moose;
extends 'RoomConfig';
has loos => (is => 'rw', isa => 'Int', default => sub {0});
has sinks => (is => 'rw', isa => 'Int', default => sub {0});
has baths => (is => 'rw', isa => 'Int', default => sub {1});
1;
如果我们使用了此配置(浴室.yaml):
doors: 1
windows: 1
bath: 1
loos: 1
sinks: 2
然后,您可以这样做:
use BathRoomConfig;
my $upstairs_bathroom = BathRoomConfig->new_with_config(
configfile => 'bathroom.yaml'
);
my $closet_room = BathRoomConfig->new_with_config(
configfile => 'bathroom.yaml',
baths => 0,
sinks => 1,
windows => 0,
);
注意 $closet_room
使用配置文件和设置属性。
另请注意,如果我的配置文件没有 doors
(即所需属性)然后,它将在 new_with_config
.
最后,我们可能会发现我们定义的配置类方便的内省:
use RoomConfig;
say "RoomConfig provides the following options:";
for my $attr (RoomConfig->meta->get_attribute_list) {
next if $attr eq 'configfile';
say '-> ', $attr;
}
现在,没有什么可以阻止您在标准配置软件包中实现大部分的,因此在一天结束时,它只是课程的马匹!
但是,使用OO,管理所有这些的易用性非常容易,并且这些已经书面模块提供的功能是很大的优势,尤其是在更大的项目中。
您可以从CPAN上的模块中查看源代码。例如 config ::常规 应该回答你的问题...