2006 年 3 月 18 日 23 時 59 分

モジュールによる分岐


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


さて、モジュールのフォールバックは実装できた。
では、肝心な変換部分をどのように呼び出すか。

まず考えられるのが、読み込まれたモジュールを調べ、
それにより分岐する方法だ。

use は内部で require を呼び出している。
require で読み込まれたファイルは、
パッケージ変数 %INC に格納されている。

なので、Encode モジュールが読み込まれているかどうかは、
exists $INC{'Encode.pm'} が真を返すかどうかで分かる。
これを使えば、WRITE メソッド内で分岐させることができる。

sub WRITE {
    ...
    if (exists $INC{'Encode.pm'}) {
        $length = Encode::from_to( ... );
    } else if (exists $INC{'Jcode.pm'}) {
        $encoding = Jcode::convert( ... );
    } else {
        $encoding = jcode::convert( ... );
    }
    ...
}

しかし、これはあまり美しいものではない。
まずは関数が読みにくくなること。
そして、何度も呼ばれる可能性のあるメソッドに、
冗長な分岐命令が入ってしまう。

ではどうすればいいか。

分岐方向は、モジュール読み込み時に決まってるはずだ。
その際に、文字コード変換サブルーチンへの
リファレンスを変数に格納しておけばいいのだ。

そうすれば、WRITE メソッド内で、
コードリファレンスを呼び出すだけで変換できるようになる。

ただし、Encode, Jcode, jcode.pl はそれぞれ、
呼び出し規則が異なる。それを吸収する仕組みが必要だ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.