矢崎です。
(太郎さん)
え、次郎くん、何?あ、花子さんが何かやってたって?
ああ、戻ってきてコードみてくれてたんだね。うん、サンキュー。
じゃあ、ちょっと見てみますか。
コンストラクタをリファクタリングしてくれたんだ。だいぶ見通し
がよくなったぞ。ところでコンパイル、テストはしてくれたのかな。
ちょっと、確認でやっておこう。
コンパイルはOK。次はテスト実行っと。
ありゃ、testConstructor1は通らないのは、これは
getMemberListFileName()をまだちゃんと書いてないからだけれ
ど、testConstructor2も通らなくなっているぞ。Why?
あ、Config.javaのコンストラクタの
> } catch (FileNotFoundException e) {
> // What is exception handling carried out?
で何もやってないからか。。ははあ、これは例外処理について、き
ちんとつめましょう、っていう花子さんからのメッセージだな。
うーん。例外処理って結構なやむところなんだけれど、何か
いいイデオムとか、どなたかご存知じゃないかな?
例えば自分なら次のように考えるけど、、、
FileNotFoundException とかIOExceptionとかをそのまま
投げるとすると、受け取ったほうでは何が起きたか直接
的な情報が得られるし、ユーザ定義(つまり自分達で新
たに作る)の例外クラスがやたらと増えないので、楽といえば
楽。でも、太郎としては、Configがファイルに書いてあると
いうことは、これはいくつかある実現手段の1つにしかす
ぎず、もしかしたら将来(この将来とは次のイテレーション
かもしれない)、別の方法をとるべきときがくるかもしれな
いと考える。ConfigがRDBに書いてあってもいいし、別のサーバ
からソケット通信で受け取るという手段も(現実には考え
づらいが)あるかもしれない。
と考えると、Config自身は、責務としてConfigの取得につい
て、生に近い処理(ファイル OR RDB OR ソケット etc)をす
るのはやむを得ないとしても、Configを利用するほうに、その
生の姿が見えないほうがいいんじゃないかな?これは投げら
れる(受け取る)例外についてもしかり、どんな生処理の結果
の例外かを予想させない例外を投げたほうがいいような気も
する。そのためにはVXPとして独自のExceptionを用意したほ
うがいいのだろうか?
と、とりとめもないことを考えてみたけど、本当、よくわからな
いんだ、例外って。ちょっと他の人にも意見聞いてみたいの
でタスクカードを起こすね。
・・・
(タスクカード)
VXPとして例外をどうするか、方針を決める。(教えて^^!
・・・
(太郎さん)
まあ、とはいってもここはテストを通さなきゃいけないから、
一時的に、次のようにしておきます。
> } catch (FileNotFoundException e) {
> // What is exception handling carried out?
throw new IllegalArgumentException();
では、Config.javaをコンパイルしてテスト実行します。
はい、testConstructor2はとおりました。1は、もちろん、まだ
通りません。
えー、後はどこが変わったのかな。ここに走り書きのメモが
あるぞ。これによると、、
Tetsuya Kuriharaさん wrote:
>
> なるほど。すべてのコンフィギュレーションをこのクラスでやるつもりかしら。
太郎としてはそのつもりなんだけど、まずいかな?もちろん
処理が複雑になってくれば、別のクラスに委譲するのは
やぶさかではありません。
> カウンタなどは、必ず並列処理となるところだから、同期処理を考慮したク
> ラスにしなければならないんだけど、、、、、
確かに!まあ、これは別のタスクで処理するとして([XP-jp00884]
参照)同期についてもそのとき考えるってことにしたいんだけど、、
花子さんは、それについてどう思うかな。今やっとかなきゃ
だめかな?
>
> ま、それはおいておいて、ずいぶんとコンストラクタ中で初期化処理をやっ
> ているわね。
> ファイルは、、、、、一応ちゃんとクローズされるみたいだけど、なんか複雑
> ね。太郎さんがいないうちにちょっとリファクタリングしちゃいましょ。
サンキュー。とても見通しがよくなりました。
>
> こんなところかな。投げられた例外はどうするのかは相談しないと。。。
> それとフィールドにアクセス指定子が記述されていなかったわ。
例外については先に延べたとおり、花子さんや皆さんの意見が
聞きたいなあ、と思う今日このごろ。
アクセス指定子は、うっかりミスでした。サンキュー。花子さん。
>
> 他にも、コンフィグファイルに「X-ML-Name」がなかったことが、「getName」
> メソッドを呼び出すまで分からないのは、困るわね。
> とりあえずは、太郎さんが帰ってくるのを待ってみましょう。
確かに。では、これは今のgetMemberListFileName()の
ところが終わったら、やりましょう。忘れないようにタスクカード
・・・
(タスクカード)
「X-ML-Name」がなかったことを、Configのコンストラクタで
検出する。
・・・
(太郎さん)
テスト、コーディング中に気づいたこととかを、新しいタスクカード
に起こすというのは、正しい方法なのかな(ちょっと不安になる
太郎さん)。
(気を取り直して)では、Config.javaを直します。
まずコンストラクタの以下の部分を修正
while (true) {
fileLine = bufIn.readLine();
if (fileLine == null)
break;
if (fileLine.startsWith("X-ML-Name:"))
name = fileLine.substring("X-ML-Name:".length()).trim();
/*追加*/ if (fileLine.startsWith("$-MemberList:"))
/*追加*/ nameOfMemberListFile
/*追加*/ = fileLine.substring("$-MemberList:".length()).trim();
if (fileLine.startsWith("X-"))
xList.add(fileLine.trim());
}
それと、getMemberListFileName()も修正
public String getMemberListFileName(){
/*修正*/ return nameOfMemberListFile;
}
最後にインスタンス変数を追加
private String nameOfMemberListFile;
で、Config.javaをコンパイルして、ConigTestを実行します。
はい、テストとおりました。
メンバリストについても、X-ML-Nameと同じく、それが
Configに定義されていなかった場合にコンストラクタで
検出しないとだめだよね。
じゃあ、花子さんも戻ってきそうだし、引き続き、このへん
をやりましょうか。
#太郎さんの代役も募集中です(^^/
#最後に現時点のConfig.java全体を載せておきます。
/*
* @(#)Config.java
*/
package XP.jp.co.esm.wiki.extremedomo;
import java.util.*;
import java.io.*;
public class Config {
public Config(String nameOfConfigFile) {
BufferedReader bufIn = null;
try {
bufIn = new BufferedReader(new FileReader(nameOfConfigFile));
String fileLine;
while (true) {
fileLine = bufIn.readLine();
if (fileLine == null)
break;
if (fileLine.startsWith("X-ML-Name:"))
name = fileLine.substring("X-ML-Name:".length()).trim();
if (fileLine.startsWith("$-MemberList:"))
nameOfMemberListFile = fileLine.substring("$-MemberList:".length()).trim();
if (fileLine.startsWith("X-"))
xList.add(fileLine.trim());
}
} catch (FileNotFoundException e) {
// What is exception handling carried out?
throw new IllegalArgumentException();
} catch (IOException e) {
// What is exception handling carried out?
} finally {
try {
if (bufIn != null)
bufIn.close();
} catch (Exception e) {
}
}
}
public String getName() {
if (name == null) throw new IllegalArgumentException();
if (name.length() == 0) throw new IllegalArgumentException();
return name;
}
public Iterator getXInfo() {
return xList.iterator();
}
public String getMemberListFileName(){
return nameOfMemberListFile;
}
private String name;
private List xList = new ArrayList();
private String nameOfMemberListFile;
}
--
矢崎 博英 <firo@....jp>