编码DRY如何结合这两个对象的常用功能?

时间:2012-04-10 21:37:50

标签: javascript

干 - 不要重复自己

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();
};

1 个答案:

答案 0 :(得分:2)

简单解决方案:使用ControlSign"in"调用的参数使其成为"up"函数。你可以称之为“工厂模式”。

复杂解决方案:使用 factory 函数创建两个构造函数。好吧,我的意思是使用闭包来创建构造函数:

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");

我想这不应该被称为“工厂模式”或“抽象工厂模式”。