読者です 読者をやめる 読者になる 読者になる

あるおっさんの一日

みなさまお元気ですか。私は元気です。私はと言えば今の会社にお世話になり始めてからすっかり1年以上経ち、かなり当たり前顔をして歩き回っていますが毎日が大変恐縮となっております。
何が一番恐縮かと言えば、天才若手エンジニアのみなさまと一緒に JavaScript をがんばる会というものの仲間に入れていただき、知ったような顔をしていることが至極恐縮となっております。

思い起こせば10年以上前、JScript で Office のいるか君を動かすだけでウン万円がぽーんと手に入ったITバブルという夢のような時代に始まり、行き着いた先は ECMAScript の終着点、ActionScript3。
そんな人生のおかげで、前職の最後の方で Dojo ライブラリに出会って以来 JavaScript でも型をコメントで書いてしまう私。つまりこんな感じ。

var test = Class.create({
    testFunction: function(/*String*/name, /*ISortable*/links)/*Boolean*/ {
        var /*Number*/index = 0;
        //....
    }
});

とまあこういうやつです。今も Dojo はこうやってるかはわかりませんが、まあこういうやつです。

先日来こういう JavaScript を特に何の感慨もなく量産していたら、切れ味鋭い若手天才エンジニアたちから

「コメント自重wwwww」
「型仙人wwwww」

といった貴重なご意見をいただき、大変に傷ついた私。あやうく保健室に駆け込みたくなった。駆け込みたくなったので、とりあえず大人の保健室であるところのキャバレークラブになどに入り浸たり、保母さんになるための勉強をしているという女の子に慰めてもらうなどした。

確かに、実はすさまじい柔軟性を秘めた何でもできるすごい言語くんであるところの JavaScript を使いながらなぜこうも自分を縛り付けねばならないのかと自分を問い詰め、イマイチ会社に行きたくなくなった時期もありましたが、私の根っこの反骨精神が泣き寝入りを許さないわけであり、「コメントじゃなくて実コードとして有効な形でできないすかwwww」というw付きだが貴重な意見があったのを思い出し考えてみた。とりあえず関数の precondition と postcondition だけ宣言したい。assert したい。でも eval は使いたくない。プログラムの師であるところの大きい人にも相談した結果、まあ次のどっちかであろう。

その1。JSっぽくいく。

var testFunction = function(list, name) {
    return true;
}
.preCondition(ISortable, String)
.postCondition(Boolean)

JavaScriptAOP っていったらこんな感じすかね。チェーンすよね。

その2。カッチコチでいく。

var testFunction = createFunction(
    {
        'list'      : ISortable,
        'name!' : String /* ! は not null とかね */
    },
    function(list,name) {
        return true;
    },
    Boolean
);

これはやばい。えっふぇるえっふぇる。

ほんとうは Object/Class Invariant みたいなことやれたらいいなとか思いますが、そうなると四則演算含めすべての演算子を新たな関数として定義することに。クールすぎる。どこへ行きたいのかわからない感じが。どっかで eval に行き着くしねえ…。eval を解き放つと、

var testFunction = createFunction(
    {
        'list.size() > 0'      : ISortable,
        'name!; name.length > 0; name.length < 10' : String
    },
    function(list,name) {
        list.concat([1,2]);
        name.add('oogatta');
        name.multiply(5);
        name.assign(null); // ここで例外
        return true;
    },
    'true<Boolean>'
);

とか無茶苦茶できるわけですが。果たして。あ、やべこれじゃ Object Invariants じゃなくて Function Invariants だ。ここまでのものは不要であります。

あと大きい人から指摘があったのが、pre/postCondition を上記の通り定義できるのは良いが、その型と値との比較をどうするか。ただの instanceof チェックでいいのか。あるいはすべての型と値は IConditionComparable とか実装させて比較ロジックを書くか。ちなみに Interface とその周りの仕組みはこないだ、prototype.js を拡張する感じで書きました。結構便利です。

var ISortable = Class.create(Interface,{});
var test = Class.create({});
test.implements(ISortable);

って使うようなやつ。

僕としては上記の後者のようなものをさらに量産し、関数型で天才っぽいプログラムをする若手たちに年寄りの邪魔臭さを存分に味合わせてやりたいと思う次第であります。