幼稚園時代「何組」でしたか?

Perl、オブジェクト指向での初期設定ファイルについて。

最近、Perlでのオブジェクト指向を勉強中です。
今までのプログラムをオブジェクト指向に書き直そうと思っています。
クラスを作成して呼び出す程度までは理解できたのですが、
今まで、サーバの絶対パスや、データベースの名称などを、
config.pl というファイルを作って、グローバル変数で宣言していました。
例 $local_parh = "/virtual/xxx/bbb/public_html";
$dbname = "testdb";
$dbuser = "username";

でも、オブジェクト指向では、グローバル変数を使わないようにするということで、
このあたりをふつうはどんなふうに作成するのかとおもったのですが、
なかなか検索しても見つかりません。(検索の仕方が悪いのかもしれませんが)

今思いつく方法は、config.pm などを作って
--------------------------------------------------
package Config;

sub new{
my $class = shift;
my $self= {
local_path => '/virtual/aaa/bbb/public_html',
dbname => 'testdb',
dbuser => 'username'
};
return bless ($self,$class);
}

sub get_local_path {
my ($self, $name) = @_;
return $self->{'local_path'};
}

--------------------------------------------------
use Config;

$obj=new Config();

$local_path = $obj->get_local_path();
--------------------------------------------------

とするような感じなのですが、なんだかスマートじゃない気がするので
普通ははどんなふうに書くのか教えてもらえますか?

A 回答 (3件)

>今まで、サーバの絶対パスや、データベースの名称などを、


>config.pl というファイルを作って、グローバル変数で宣言していました。

定数を使いたいのであれば型グロブが良いかと思います。
型グロブを使えばget_local_pathの様なアクセサを使う必要はありません。


>でも、オブジェクト指向では、グローバル変数を使わないようにするということで、

『oop=全てパッケージ化しなくてはいけない』ということでは無いと思いますので、私であれば下記のようにします。


init.pm
--------------------------------------------------
*LOCAL_PATH = \"/virtual/aaa/bbb/public_html";


main.cgi
--------------------------------------------------
#!/usr/bin/perl

require "init.pm";

print "Content-type: text/html;\n\n";
print <<"HTML";
<html>
<body>
<img src="$main::LOCAL_PATH/images/abc.gif">
</body>
</html>
HTML
exit;
    • good
    • 0
この回答へのお礼

ありがとうございます。
簡単でいいですね。
型グロブに関してもやはり今までなじみが無いので、
使いこんでみようと思います。

お礼日時:2010/02/08 14:54

えぇっと.... あなたが何を期待しているのかが今一つ見えないのですが....


とりあえず
「定数だと埋め込めない」というのは, 「文字列中でその値に展開してくれる」ということだと理解しました.
「get_local_path()などを用意しなくてもいいやり方」については何を期待しているのかよくわかりません.
また, 初期化の方法とか「プログラム中で随時変更できるのかどうか」あたりも作り方に影響することがありえるので, これもあなたがどう期待しているのか書いてもらえるとありがたいかな.
おっと, 「スマートかどうか」の判断基準も欲しいか.
ことによっては tie かなぁ (ぼそっ).
ちなみに最も頭を使わない方法は
package Config;
our $local_parh = "/virtual/xxx/bbb/public_html";
our $dbname = "testdb";
our $dbuser = "username";
1;
と「パッケージの中にグローバルな変数を作る」だったりする.
    • good
    • 0
この回答へのお礼

>「定数だと埋め込めない」というのは, 「文字列中でその値に展開してくれる」ということだと理解しました.
はい。ご理解いただきありがとうございます。

使い道としては、プログラム中では変更の必要はありません。
定数と考えていいのですが、上記の、展開できないことから変数にしたいだけです。
変更が必要ないので、初期化は最初に行われればOKです。

スマートというあいまいな表現をしてしまってすみません。

今までの使い方としては、前述のpathなどのほか、
$toiawasesaki = 'info@example.com';
@seibetu = ("","男性","女性");
@todoufuken = ("北海道","青森","秋田", …);
のような感じです。
簡単なアンケートの項目などもこのように作成していました。

で、このような作り方を多様してるので、一つ一つget_local_path()のような
メソッドを作るのがめんどくさいなぁ~、という感じです。

ただ、現時点ではオブジェクト指向の感覚も分かってないし、
もしかしたら他の人はこのくらいは全然気にならないことなのか、
またはもっと楽な書き方があるのかと思って質問させていただきました。

お礼日時:2010/02/08 14:51

「オブジェクト指向では、グローバル変数を使わないようにする」というのも, なんだか的を外しているような気がするけど....


その設定が「読み込んだら変更されることはない」というものであれば, 例えば
package Config;
{
my $local_path = ....;
sub get_local_path {
$local_path;
}
}
1;
のようにすることもできます. 使う方では
use Config;
$local_path = Config::get_local_path();
とする. 要は Config の中に隠しているだけですが.
もちろんこの方法が「スマート」かどうかは知りません.
    • good
    • 0
この回答へのお礼

ありがとうございます。

今まで良く使う項目をグローバル変数でたくさん定義していたのですが、
get_local_path()などを用意しなくてもいいやり方とかありましたら
よろしくお願いいたします。

他のサイトで
TestConst.pm
use constant HOGE => ’定数値’;

a.pl
use TestConst;
print ’HOGE=’ . TestConst::HOGE;

と、定数の例が出てましたが、結構普通の事でしょうか?

定数だと
<img src="$local_url/images/abc.gif">
のように埋め込めないのであんまり使いたくないのですが、
そういう問題ではないですか?

お礼日時:2010/02/08 02:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!