perl read_config sub、ooopかどうか?
質問
私はパッケージを持っています(本当に1つのサブルーチンだけ)私は頻繁に構成ファイルなどを解析するために使用します。基本的には次のようになります。
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インターフェイスは顧客の期待と競合します(つまり、スクリプト +人々が開発している人)。
たぶん、あなたはアプローチ間で移行しています(たとえば、スクリプトは大きくて扱いにくくなり、よりよく整理される必要があります。おそらくOOPで)。応答性のクリアライン。
要するに、パッケージが使用されている場所で最も意味があることを行います。
他のヒント
以下は(できれば!)を使用した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構成クラスです。すべてがきちんと宣言されているため、構成オプションが利用可能で有効であることを明確に知っています。その自己文書化。
したがって、aを作成します 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 ::一般 あなたの質問に答えるべきです...