派遣228日目久しぶりの素敵な週末


久しぶりに停電かつ水が出ないという素敵な週末であった。

  • 水を大量に使う洗濯&床掃除ができない
  • 扇風機がつかないため部屋にいると暑い
  • 仕事をするにしてももPCのバッテリーが切れる

という何もさせてくれない条件がそろったので、外に椅子を出してボーっとしていた。


しかし、それにしても今週は雨が2日ほど降ったので、水が止まる事態は起こらないだろうとタカをくくっていたけど、水は出なくなった。とりあえず、水源はペンバ市内からは遠いのだと予想できる。しかし、大きな河川もないしどこから取水しているのかは疑問だけれども、追求することはしない。なぜなら、モザンビークにそんなに興味がないから。



やるべきことができないので、この時間を利用してまだ読み終えていなかった先月Amazon.co.jpで購入したJava本を読み切る。


コールバックパターンについての解説が秀逸。そこの章ではJavaプログラミングというかオブジェクト指向言語でのプログラミングの本質を語っていた。その本質とはクラスを変化しない部分と変化しやすい部分にわけて、変化しやすい部分に依存させない設計にすること。デザインパターンを適用する/適用しない以前のことであるが、なかなか理解するのが難しいところ。しかし、こう勇気づけてくれる

クラスの設計に王道はありません。(中略)分割を気にして手が動かないぐらいであれば、まず書くべきです。


ジェネリックアノテーション、列挙型など他のJava本(特に初心者向けの)では手薄になりがちなところを読むだけでも価値がある。特に個人的に興味深かったのはリフレクションとDIの関係

import java.util.*;

class StringList {
    private List<String> list

    private String(List<String> list) {
        this.list = list;
    }
    
    public void append(String s) {
        list.add(s);
    }
    
    public void dump() {
        for (String s : list) {
            System.out.println(s);
        }
    }
}

上記のようなクラスを使う場合には、あらかじめListをオブジェクトを生成しておいてつぎのように宣言する必要がある。

List<String> list = new ArrayList<String>();
StringList sl = new StringList(list);


Javaのようなオブジェクト指向言語では各クラスを分割していく結果、オブジェクトが増える。そして上記のようなコードが増殖して可読性が下がる。ファクトリパターンは個々のクラスごとにオブジェクト生成を引き受けるけれども、DIエンジンはそれらを一括で行えるところにメリットがある。


リフレクションはクラスを操作する機能なので、それを利用して簡易的なDIエンジンを作成することができる。サンプルは以下の通り。

import java.util.*
import java.lang.reflect.*;

Public class SimpleDI {
    public Object resolv(String targetType, String argType, String argObjectType) throws Exception {
        Class<?> targetClass = Class.forName(targetType)

        Class<?> argClass = Class.forName(argObjectType)
        Object arg = argClass.newInstance();

        Constructor<?> constructor = targetClass.getConstructor(Class.forName(argType));
        return constructor.newInstance(arg);


    }

    public static void main(String[] args) throws Exception {
        SimpleDI sd = new SimpleDI();
        StringList sl = (StringList)sd.resolv("StringList", "java.util.List", ""java.util.ArrayList");
        sl.append("foo");
        sl.append("baz");
        sl.dump();
    }
}


Classの依存関係をXMLファイルにごちゃごちゃ書いていた際、SpringFramework等のDIエンジンはブラックボックスにしか見えず、何をやっているのか全く分からなかった。しかし、この本の説明で内部で何をやっているかについて足がかりがつかめる気がした。



リフレクションに限らず、新たに知ることが多い。読むたびにやられた感じを受ける。あらためて著者であり友人のIさんの凄さを認識させられた。Iさんの知識や理解の深さを100とすれば自分は3くらいしかないだろう。