Featured image of post 第1回-設定を管理するクラスを作ろう — 設定ファイルマネージャーを作ってみよう

第1回-設定を管理するクラスを作ろう — 設定ファイルマネージャーを作ってみよう

Perl/Mooで設定を管理するクラスを作成します。ハードコードされた設定値をクラスで管理する方法を、初心者向けにステップバイステップで解説します。

@nqounetです。

「設定ファイルマネージャーを作ってみよう」シリーズの第1回です。

シリーズの概要

このシリーズでは、アプリケーションの設定を管理する「設定ファイルマネージャー」を作りながら、オブジェクト指向プログラミングの実践的なテクニックを学んでいきます。

全5回の連載を通じて、設定管理の基本から、複数の場所で設定を共有する際の課題とその解決策までを体験します。

想定読者

このシリーズは以下の方を対象としています。

  • Perl入学式を卒業したばかりの方
  • モダンなPerlでオブジェクト指向設計を実践したい方

まだMooの基本を学んでいない方は、「Mooで覚えるオブジェクト指向プログラミング」シリーズを先にご覧ください。

前提知識

このシリーズでは以下の知識を前提としています。

項目内容
Mooの基本hasnew の使い方
メソッド定義サブルーチンとしてのメソッド
Perl v5.36use v5.36; による signatures

本記事のゴール

今回のゴールは、ハードコードされた設定値をクラスで管理できるようにすることです。

ミキさんからの相談

ある日、友人のミキさんから相談を受けました。

「アプリの設定をうまく管理したいんだけど、いい方法ないかな?今は設定値をスクリプトに直接書いてるんだけど…」

なるほど、設定管理ですね。よくある悩みです。まずは現状を確認してみましょう。

設定値を直接書いたスクリプト

ミキさんが見せてくれたスクリプトは、こんな感じでした。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
use v5.36;

# 設定値がハードコードされている
my $app_name = 'MyApp';
my $version  = '1.0.0';
my $debug    = 1;

say "アプリ名: $app_name";
say "バージョン: $version";
say "デバッグモード: " . ($debug ? 'ON' : 'OFF');

実行すると、以下のように表示されます。

1
2
3
アプリ名: MyApp
バージョン: 1.0.0
デバッグモード: ON

動いてはいますが、設定値がスクリプト内にバラバラに散らばっています。これでは、設定を変更したいときに大変です。

設定をクラスで管理しよう

設定値を1つのクラスにまとめてみましょう。Mooを使えば、シンプルに設定クラスを定義できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
use v5.36;
use Moo;

package Config {
    use Moo;

    has app_name => (is => 'ro', default => sub { 'MyApp' });
    has version  => (is => 'ro', default => sub { '1.0.0' });
    has debug    => (is => 'ro', default => sub { 1 });
};

package main;

my $config = Config->new();

say "アプリ名: " . $config->app_name;
say "バージョン: " . $config->version;
say "デバッグモード: " . ($config->debug ? 'ON' : 'OFF');

実行結果は同じです。

1
2
3
アプリ名: MyApp
バージョン: 1.0.0
デバッグモード: ON

何が変わったのでしょうか?

Configクラスのポイント

作成したConfigクラスのポイントを見てみましょう。

設定値の集約

1
2
3
has app_name => (is => 'ro', default => sub { 'MyApp' });
has version  => (is => 'ro', default => sub { '1.0.0' });
has debug    => (is => 'ro', default => sub { 1 });

設定値がConfigクラスの中に集約されました。どんな設定があるのか一目でわかります。

読み取り専用(ro)

is => 'ro'で読み取り専用にしています。設定値は一度決めたら変更しないことが多いので、ro(read-only)が適切です。

デフォルト値

default => sub { ... }でデフォルト値を設定しています。newするときに値を指定しなければ、このデフォルト値が使われます。

設定の上書き

デフォルト値は、newするときに上書きできます。

1
2
3
my $config = Config->new(debug => 0);
say "デバッグモード: " . ($config->debug ? 'ON' : 'OFF');
# => デバッグモード: OFF

第1回 完成コード

今回の完成コードは以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
use v5.36;
use Moo;

package Config {
    use Moo;

    has app_name => (is => 'ro', default => sub { 'MyApp' });
    has version  => (is => 'ro', default => sub { '1.0.0' });
    has debug    => (is => 'ro', default => sub { 1 });
};

package main;

my $config = Config->new();

say "アプリ名: " . $config->app_name;
say "バージョン: " . $config->version;
say "デバッグモード: " . ($config->debug ? 'ON' : 'OFF');

まとめ

  • ハードコードされた設定値をConfigクラスで管理するようにした
  • Mooのhasでアトリビュート(設定項目)を定義した
  • is => 'ro'で読み取り専用にした
  • defaultでデフォルト値を設定した

次回予告

ミキさんから次の相談がありました。

「設定値をコードに書くんじゃなくて、外部ファイルから読み込みたいんだけど…」

次回は、外部の設定ファイルを読み込む機能を追加します。INI形式のファイルを読み込むload_configメソッドを実装しましょう。

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。