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

改めてみてみると logging と大差ない気がするけどまぁいいか。フラグブレイクとか実装してみてもおもしろいかもしれない。…いやあんまおもしろくないか。あと別のアプローチとしてマーフィーの法則とかでもいいと思う。とりあえず思いついたことはやるだけやってしまったのでこれ以上深く掘るつもりはない。 Ruby はぼちぼちやるかもしれない。

というか AspectR は普通に wrap してるだけのような気がするんだがこれでいいんかな…。まぁあとから選択的にふるまいを付加できるっていう利点は確保されてるからこれでいいのか。