OperaとVimとHHKを愛してる

Operaが大好きでVimが大好きでHappyHackingKeyboardが大好きな変人のブログです。

ももんがともふもふと地震と

癒しは必要

ももんが Advent Calendar 2012の七日目Arc Cosineです。

ちなみに、多くの人が僕のHNをArcCosineと認識していますが、正式にはArc Cosineです。ArcとCosineの間に半角スペースが入ります。試験に出ないので、きちんと覚えてメモしておくように。

さて、ももんがと言えば、頭から血を流したあの画像を誰もが想像しますね。


cc licensed ( BY NC ND ) flickr photo shared by southarmstudio

そう、こんな感じ。もっふもふしてメチャクチャ可愛いですね。

もっふもふと言えば、最近僕が気にしているライブラリがあります。それはmofmof.jsです。uupaa.jsと関連しまくってるあのライブラリですね。

mofmof.jsを使えば、JavaScriptOOPっぽい事が簡単に表現できます。実際にコードに書いてみましょう。

今回は、よくあるvalidatorを作ってみます。

mm.Class('ValidateHandler',{
    init: function(){
        this._next_handler = null;
    },
    setNext: function(handler){ //ValidateHandler handler
        this._next_handler = handler;
        return this;
    },
    getNextHandler:function(){
        return this._next_handler;
    },
    validate: function(input){
        var result = this.execValidate(input);

        if( result ){
            return this.getErrorMessage();
        } else if( this.getNextHandler() !== null ){
            return this.getNextHandler().validate(input);
        } else {
            return true;
        }
    },
    execValidate: function(){       //abstruct
    },
    getErrorMessage: function(){    //abstruct
    }
});

// Number Validate
mm.Class('NumberValidateHandler:ValidateHandler' ,{
    execValidate: function(input){
        return isNaN(Number(input));
    },
    getErrorMessage: function(){
        return '数値を入力してください';
    }
});

// Undefined Valida
mm.Class('UndefinedValidateHandler:ValidateHandler', {
    execValidate: function(input){
        return ( typeof input === 'undefined' );
    },
    getErrorMessage: function(){
        return '入力が正しくありません';
    }
});

// Blank Valida
mm.Class('BlankValidateHandler:ValidateHandler', {
    execValidate: function(input){
        return ( input === '' );
    },
    getErrorMessage: function(){
        return '入力が正しくありません';
    }
});

function validate(input){
    var nh = new mm.NumberValidateHandler(),
        bh = new mm.BlankValidateHandler(),
        uh = new mm.UndefinedValidateHandler(),
        message = "",
        ret = false;

    uh.setNext(bh.setNext(nh));

    ret = uh.validate(input);
    if( ret !== true){
        message = ret;
        mm.log(message);    //debug
        return false;
    }
    return true;
}

[
    [validate(123), true],
    [validate(""),  false],
    [validate("abc"),   false]
].test("Validate");

Chain of Responsibility パターンですね。

jsdoitに同じコードをアップしました。参考にしてください。

このコードを書いている最中に地震が来ました

びっくりしました。また、地震で大変ですね。

僕に出来ることはひたすらコードを書いて世の中を変えていく事だけなので、本当にこういう時は無力である事を実感します。

本当に地震は怖いです。お気をつけて。

明日のももんが Advent Calendar 2012は、@attokunnです。