Readonlyモジュールを遊んでみる

Perl Best Practicesを読んでて、
Readonlyモジュールなるものを知った。
http://search.cpan.org/~roode/Readonly-1.03/Readonly.pm

簡単に言えばuse constantの便利版かな。
Perl Best Practicesでは
use constantよりも
use Readonlyすることを推奨してます。

以下、理由&簡単なソース

Readonlyモジュール使用時


#! /usr/bin/perl
use strict;
use warnings;
use Readonly;
Readonly my $name => q[nekokak];
Readonly my $age => q[27];
print <<"__EOD__";
Hi!
My name is $name.
My age is $age.
Bye.
__EOD__

こんな感じで書けます。
結果


Hi!
My name is nekokak.
My age is 27.
Bye.

こんなのが出力されます。

use constantの場合


#! /usr/bin/perl
use strict;
use warnings;
use constant name => q[nekokak];
use constant age => q[27];
print <<"__EOD__";
Hi!
My name is name.
My age is age.
Bye.
__EOD__

こう書くと、


Hi!
My name is name.
My age is age.
Bye.

こんな出力になります。

なので、以下のように書く必要があります。


#! /usr/bin/perl
use strict;
use warnings;
use constant name => q[nekokak];
use constant age => q[27];
print 'Hi',"\n\n";
print 'My name is ',name,".\n";
print 'My age is ',age,".\n\n";
print 'Bye.';

結果


Hi
My name is nekokak.
My age is 27.
Bye.

書き方にもよりますが、なんて醜いのでしょうかねぇ。

どうです?Readonlyの方がよいですよね?

ちなみに、


Readonly my $name => q[nekokak];

としているものに、値を入れようとすると、、、


Modification of a read-only value attempted at readonly.pl line 9

こんな感じで実行時にエラーになります。
perl -c は通りますね。
まあ、プラグマではないのでしかたないのですが。


Perl Best Practices

Seasar2導入

業務でJava開発をやる(?)ので、フレームワークを探してみた。
やっぱり日本人ですからSeasarですよね!!

で、ちょっくら導入ガイドを。
ちなみに、JavaEclipseは入っているものとします。

まずは、なにはともあれ、Seasar2のダウンロードから。

http://sourceforge.jp/projects/seasar

ここから落とします。

で、ダウンロードしたものをZipを解凍します。

Eclipseを起動させて、
[ファイル(F)]→[インポート(I)]→既存プロジェクトをワークスペース
を選択して、さっき解凍したもののなかからseasarディレクトリを選択します。

で、CLASSPATHを追加しまふ。

以下追加したCLASSPATH


D:\S2.2.10\seasar2\lib\javassist.jar;
D:\S2.2.10\seasar2\lib\commons-logging.jar;
D:\S2.2.10\seasar2\lib\log4j-1.2.8.jar;
D:\S2.2.10\seasar2\lib\ognl-2.6.5.jar;
D:\S2.2.10\seasar2\lib\aopalliance.jar;
D:\S2.2.10\seasar2\lib\servlet-api.jar;
D:\S2.2.10\seasar2\lib\s2-framework-2.x.x.jar;
D:\S2.2.10\seasar2\src\log4j.properties

こんな感じで。

実際これだけ。

で、サンプルソースのお披露目です。
チョー簡単HelloWorldで。

HelloWordlS2.java


package com.hoge.s2.helloWorld;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
public class HelloWordlS2 {
private static final String PATH =
"com/hoge/helloWorld/Speaker.dicon";
public static void main(String[] args) {
S2Container container = S2ContainerFactory.create(PATH);
Speaker speaker = (Speaker) container.getComponent("Speaker");
System.out.println(speaker.getMessage());
}
}

Speaker.java


package com.hoge.s2.helloWorld;
public interface Speaker {
public String getMessage();
public void setMessage(String string);
}

SpeakerImpl.java


package com.hoge.s2.helloWorld;
public class SpeakerImpl implements Speaker {
private String message = "Hello World !!";
public String getMessage() {
return message;
}
public void setMessage(String string) {
message = string;
}
}

Speaker.dicon


<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
<component name="Speaker" class="com.hoge.s2.helloWorld.SpeakerImpl">
</component>
</components>

こんなのです、
で、Eclipse上で実行すると見事、Hello World !!が表示されました。

まあ、DBとかつかってないんでなんじゃこれはと思われるかもしれませんが、
フレームワークつかいませう。

以上、個人的覚え書き。