mark for death on aspect oriented programming
twitter でアスペクト指向なんて言葉を見かけてしまったのでそういえばそんなもんもあったなぁという感じで、今になって時間もあるし調べてみるかというノリ。概念は http://www.csg.is.titech.ac.jp/~chiba/notes/aop03/index.html で、実装は AspectR ( http://aspectr.sourceforge.net/ ) でちょちょっと。
それと今回はじめて Ruby 触ったんだけど思いっきり失敗した。いやー Perl に似てると思ったんだけど別モノだった。言語がどうこうはそんなに触ってないからよくわからんけど Windows へのインストールがめんどくさかったり文字エンコードの扱いが旧式だったり公式ドキュメントで言葉の定義してなかったりして「んー」ってなってしまった。慣れると使いやすいとは聞いてるんだけどね。
でまぁ Aspect Oriented Programming の例はどこ見ても logging なのでよくわかんなかったんだけど要はうまくまとめられない偏在する概念ってことなんだから、よくゲームやアニメで言われるフラグってそのままなんじゃないかと思って以下のを書いてみた。死亡フラグを選んだ理由は一番確立・認知されてる気がしたので。
require 'aspectr' include AspectR class Life def say(line) print line; end end class MarkForDeath < Aspect def initialize @flags = ['戦争.*終わったら.*結婚', 'ねんがんの\s*アイスソードを\s*てにいれたぞ']; end def post(method, object, exitstatus, *args) for regex in @flags if Regexp.new(regex) =~ args[0] print "死 亡\n"; break; end end end end MarkForDeath.new.wrap(Life, nil, :post, :say); l = Life.new; l.say("ゆっくりしていってね!\n"); l.say("俺、この戦争が終わったら結婚するんだ…\n"); l.say("ねんがんの アイスソードを てにいれたぞ!\n"); =begin result: ゆっくりしていってね! 俺、この戦争が終わったら結婚するんだ… 死 亡 ねんがんの アイスソードを てにいれたぞ! 死 亡 =end
- refer
改めてみてみると logging と大差ない気がするけどまぁいいか。フラグブレイクとか実装してみてもおもしろいかもしれない。…いやあんまおもしろくないか。あと別のアプローチとしてマーフィーの法則とかでもいいと思う。とりあえず思いついたことはやるだけやってしまったのでこれ以上深く掘るつもりはない。 Ruby はぼちぼちやるかもしれない。
というか AspectR は普通に wrap してるだけのような気がするんだがこれでいいんかな…。まぁあとから選択的にふるまいを付加できるっていう利点は確保されてるからこれでいいのか。