0

DRY-繰り返さないでください

ControlSignUpとControSignInはほぼ同じです。異なる4行だけに「ここ」とコメントしました。この一般的な機能をどのように組み合わせることができますか?

実際、それは明らかなようです..コンストラクターを介して単一の変数を渡すことができます...ほんの数秒。

答え:

 /**
 *      ControlSign
 */

var ControlSign = function( type ) 
{
    var form_element = document.getElementById( type ); 
    var response_element = document.getElementById( type + '_response' ); 
    var text_object = new Text( form_element );
    var message_object = new Message( response_element );

    this.invoke = function( ) 
    {
        if( Global.validate_input_on === 1 )
        {
            if( !text_object.checkEmpty() ) 
            {
                message_object.display( 'empty' );
                return false;
            }
            if( type === 'signup' && !text_object.checkPattern( 'name' ) ) 
            {
                message_object.display( 'name' );
                return false;
            }
            if( !text_object.checkPattern( 'email' ) ) 
            {
                message_object.display( 'email' );
                return false;
            }
            if( !text_object.checkPattern( 'pass' ) ) 
            {
                message_object.display( 'pass' );
                return false;
           }
        }
        AjaxNew.repeatUse( ajaxSerialize( form_element ) + '&ajax_type=' + type + '_control', function( server_response_text ) { ajaxType( server_response_text, response_element, 'respond' ); } );
    }
};

ControlSign.in = function()
{
    new ControlSignIn( 'signin' ).invoke();
};
ControlSign.up = function()
{
    new ControlSignUp( 'signup' ).invoke();
};
4

1 に答える 1

2

簡単な解決策:またはControlSignで呼び出されるパラメーターを使用して関数にします。これを「ファクトリパターン」と呼ぶことができます。"in""up"

複雑な解決策:ファクトリ関数を使用して2つのコンストラクターを作成します。OK、私が意味したのは、コンストラクターを作成するためのクロージャーの使用です。

function makeControlSign(type) {
    function constructor(...) {
        this.invoke = function(){...};
        // use the variable "type" where needed
        ...
     }
     constructor[type] = function(){...};
     return constructor;
}
var ControlSignUp = makeControlSign("up");
var ControlSignIn = makeControlSign("in");

これを「ファクトリパターン」や「アブストラクトファクトリパターン」と呼ぶべきではないと思います。

于 2012-04-10T21:43:15.520 に答える