著作一覧 |
ほぼ、風のためにって何かと思ったら、3行くらいを一度に見ていたということだったり。
import java.util.Iterator; public class Each { public interface Block { void call(Object o); } public static void call(Iterator i, Block b) { for (;i.hasNext(); ) { b.call(i.next()); } } } ---------------- Each.call(list.iterator(), new Each.Block() { public void call(Object o) { bar((Foo)o); } });というような感じで、テンプレートとして利用可能なスタティックメソッドを持つクラスと無名インナークラス(である必要はないが、位置的な可読性は無名インナークラスが上だと思う)を組み合わせると、単純なテンプレートメソッドは必要なくなる。スペシフィックなテンプレートメソッドについても継承関係といくらかは無関係に作成できる。
public class SafeExecution { public interface Block { void prepare() throws Exception; void call(Object ... args) throws Exception; void finish() throws Exception; } // Varargsってこんな使い方で受け渡しできるのかな? public static void execute(Block b, Object ... args) { log(args); try { log("start"); b.prepare(); log("prepared"); b.call(args); log("success"); } catch (Exception e) { log(e); } finally { try { b.finish(); } catch (Exception e) { log(e); } } } }いろいろ能書きも浮かんだりもするが、実装があるから後はいいや。
上のみたいなのって、OOPならではの面はあるけどOOAとかOOD(は微妙か)とはある点において無関係だから(有関係な点ってなんだ?)UMLで記述するとかそういうのってほとんど意味ない。って言うかuse関係を使うくらいしか書きようがないだろうし、そんなもの書いても意味がない(と思う)。なぜなら実装の役にしか立たないからだ。
では無価値かというとそれは多分違う。テンプレートだから型に嵌める役に立つ。たとえばログの強制もそうだし。
ものは言いようだからこれをマクロと言うこともできるしテンプレートと言う事もできるように、アスペクトと言うこともできなくは無い。AOPと180度異なるのは、機構はOOの枠内のものを利用しているから後ざしにはできず、関心事を利用するための積極的な介入がコード側に必要となる点で、その意味ではフィルターに近い。が、もちろんフィルターではない。コードによる積極的な関心事への自分挿し込みとか。
ドメインロジックを制御するけどコントローラでもない。コントローラはドメインロジックを呼び出すが、こちらはドメインロジックが呼び出す。で、その結果としてドメインロジックが制御される。なんじゃらほい。
イディオムをそのままテンプレートとしたとも言えなくもない。イディオムを抽象化するとデザインパターンとなるが(相当怪しい見方)、イディオムからパターンとなる実装だけを抜き出したと言えなくも無い。
上のほうではstaticメソッドにしているから動的な変更はできないが、どちらかというと呼ばれるブロック群をインターフェイスとして抽出させることを主と見れば、動的に替えられるようにもできる。つまりテンプレート自体をインターフェイスとすることも可能だ。
subjectが『納品予定のご連絡』のメールが来たら、まあspamだと思うかも。で、差出人がsexorder@……と見た瞬間に削除するわな。でも良くみたらsxorder@sun.co.jpじゃん。
・頭の中がsexでいっぱいなので見間違えた
・spmaズレしてsとxで自然にそう読み取った
っていうかsxorderってどういう意味だ?
さらに、文字数の問題なんだろうが
Sun Java Studio Creator 2004Q2、1 ユーザ・スリムキ SDSI9-4Q2-T99MC x 1
「スリムキ」……妙過ぎる。(もちろんslimkitだとはわかるが)
ジェズイットを見習え |
本題と関係ないけど、やりすぎると<br>Object foo(Object arg) throws Exception<br>とかなって、わざわざJavaを使う意味がないなとか思ったりします。
最後はコード片をパラメータとして埋め込んでおいて実行時にevalしてくような方法(JavaだとJSPみたくやれば良いかも)となって、なんのための強型付けコンパイル言語だかわかんなくなる、と。