Javascript 代码整合与复杂性
我有一些处理用户操作的模块,它们是控制模块。有6个,现在有5个,我把2个合并成一个叫做控制的模块 我注意到,当我整合类似的代码时……效率会降低一点。例如,在控件中,我现在有一个额外的逻辑语句来确定程序流Javascript 代码整合与复杂性,javascript,Javascript,我有一些处理用户操作的模块,它们是控制模块。有6个,现在有5个,我把2个合并成一个叫做控制的模块 我注意到,当我整合类似的代码时……效率会降低一点。例如,在控件中,我现在有一个额外的逻辑语句来确定程序流 if( this.type === 'signup' && !this.text_object.checkPattern( 'name' ) ) 这个简单的行允许我将ControlSignIn和ControlSignUp结合起来,因为唯一的区别是在Signup中检查登录没有的名
if( this.type === 'signup' && !this.text_object.checkPattern( 'name' ) )
这个简单的行允许我将ControlSignIn和ControlSignUp结合起来,因为唯一的区别是在Signup中检查登录没有的名称
我可以以这种方式继续,得到更复杂的代码,但我的代码占用空间更小
复杂性和运行时与代码足迹之间存在权衡
我猜这没关系,但我只是想确定一下
作为一个例子,我把ControlTweet放进去,我也可以控制它
问题
我应该将ControlTweet与Control合并吗
总的来说,你的底线在哪里?或者这是一个偏好的问题
控制
控制推特
我最终使用的是:
代码应该产生您想要的结果,可读性、可测试性和所需的性能,而不考虑语言
你试图在主观可读性和不必要性之间找到一个平衡点。我想说的是,对你来说,任何可读的东西都是好的,除非你在满足要求的性能方面遇到问题,否则你必须先有衡量标准/目标……代码应该产生你想要的结果,可读、可测试,并具有要求的性能,而不考虑语言
你试图在主观可读性和不必要性之间找到一个平衡点。我想说-对你来说,任何可读的东西都是好的,除非你在满足要求的性能方面遇到问题,你必须首先有衡量标准/目标……这是一个相当主观的问题,因为每个人在整合代码时都有自己的个人偏好,而且它也是本地化的,因为它可能因项目而异。这就是说,显然有一条线要画,因为你不想把所有的东西都整合到一个庞大的主函数中,这个主函数处理所有的东西,然后再处理一些 有两条编程经验法则可以帮助您: 不要重复你自己 过早优化===邪恶 现在,DRY原则指出,在合理的情况下,应该将类似的代码组合到可重用的模块中。这里的关键字是类似的代码,因为有时,即使冒着重复代码的风险,您也可以使用多个单独的模块。原因是,您还必须考虑代码维护和可读性,当您以DRY的名义开始整合不同的模块时,这可能会成为可读性的噩梦 我还提到了过早优化,因为您提出了占用空间小而代码复杂的想法。我建议您忘记这一点,将代码占用留给压缩/gzip
为了最终回答你的问题,我个人会结合这些模块。然而,这最终应该是您的决定,因为您是维护代码的人。请记住对所有内容进行适当的注释和记录,以便在几个月后再次访问时不会迷失方向。这是一个非常主观的问题,因为每个人在整合代码时都会有自己的个人偏好,而且它也是本地化的,因为它可能因项目而异。这就是说,显然有一条线要画,因为你不想把所有的东西都整合到一个庞大的主函数中,这个主函数处理所有的东西,然后再处理一些 有两条编程经验法则可以帮助您: 不要重复你自己 过早优化===邪恶 现在,DRY原则指出,在合理的情况下,应该将类似的代码组合到可重用的模块中。这里的关键字是类似的代码,因为有时,即使冒着重复代码的风险,您也可以使用多个单独的模块。原因是,您还必须考虑代码维护和可读性,当您以DRY的名义开始整合不同的模块时,这可能会成为可读性的噩梦 我还提到了过早优化,因为您提出了占用空间小而代码复杂的想法。我建议您忘记这一点,将代码占用留给压缩/gzip
为了最终回答你的问题,我个人会结合这些模块。然而,这最终应该是您的决定,因为您是维护代码的人。请记住对所有内容进行适当的注释和记录,以便在几个月后再次访问时不会迷失方向。答案是继承。将公共部分放在父类中,然后在中继承它们。为不同的调用放入一组if语句是非常有用的
有点像继承黑客。一旦我学会了如何在JS中实现这一点,我将发布代码。答案是继承。将公共部分放在父类中,然后在中继承它们。为不同的调用放入一堆if语句有点像继承黑客。一旦我学会如何在JS中实现这一点,我将发布代码。对我来说,这是一个有趣的问题。不过,我的问题是,鉴于这更像是一个讨论话题,不太可能有一个“正确”的答案。因此,它用于堆栈溢出。也许会是一个更好的家?我会说正确的答案,它有一条线是主观的,由程序员和规格决定……将它定义为主观而不是客观对我来说是一个答案,因为它验证了我的想法。也就是说,没有人进来说,从某种意义上说,这是正确的答案。我有一个简单的规则。如果我想让代码更难修改。为什么我这样做比不这样做能赚更多的钱……对我来说,这是一个迷人的问题。不过,我的问题是,鉴于这更像是一个讨论话题,不太可能有一个“正确”的答案。因此,它用于堆栈溢出。也许会是一个更好的家?我会说正确的答案,它有一条线是主观的,由程序员和规格决定……将它定义为主观而不是客观对我来说是一个答案,因为它验证了我的想法。也就是说,没有人进来说,从某种意义上说,这是正确的答案。我有一个简单的规则。如果我想让代码更难修改。为什么我这样做比不这样做能赚更多的钱。。。。
/**
*Control - receives incoming requests for client use
*/
var Control = ( function ()
{
var Control = function ( type )
{
this.TIME = 4000;
this.type = type;
this.form_element = document.getElementById( type ),
this.response_element = document.getElementById( type + '_response' );
this.text_object = new TextValidator( this.form_element ),
this.message_object = new Message( this.response_element ),
this.effects_object= new Effects( this.response_element );
};
Control.prototype.invoke = function( )
{
if( Global.validate_input_on === 1 )
{
if( !this.text_object.checkEmpty() )
{
this.message_object.display( 'empty' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
if( this.type === 'signup' && !this.text_object.checkPattern( 'name' ) )
{
this.message_object.display( 'name' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
if( !this.text_object.checkPattern( 'email' ) )
{
this.message_object.display( 'email' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
if( !this.text_object.checkPattern( 'pass' ) )
{
this.message_object.display( 'pass' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
}
var response_element = this.response_element;
new Ajax().invoke( serializeArray( this.form_element ) + '&ajax_type=' + this.type + '_control', function( server_response_text ) { ajaxType( server_response_text, response_element, 'respond' ); } );
};
Control.in = function()
{
new Control( 'signin' ).invoke();
};
Control.up = function()
{
new Control( 'signup' ).invoke();
};
Control.out = function()
{
new Ajax().invoke( '&ajax_type=ControlSignOut', function( server_response_text ) { ajaxType( server_response_text, 0, 'simple' ); } );
};
Control.try = function()
{
new Ajax().invoke( '&ajax_type=ControlTryIt', function( server_response_text ) { ajaxType( server_response_text, 0, 'simple' ); } );
};
return Control;
} () );
/**
* ControlTweet
*/
function interfaceTweet()
{
var fill_element = document.getElementById( 'tweet_fill' ),
form_element = document.getElementById( 'tweet' ),
response_element = document.getElementById( 'tweet_response' );
var text_object = new TextValidator( form_element ),
message_object = new Message( response_element ),
effects_object = new Effects( response_element );
if( Global.validate_input_on === 1 )
{
if( !text_object.checkEmpty() )
{
message_object.display( 'empty' );
effects_object.fade( 'down', 4000 );
return;
}
if( !text_object.checkPattern( 'tweet' ) )
{
message_object.display( 'tweet' );
effects_object.fade( 'down', 4000 );
return;
}
}
new Ajax().invoke( serializeArray( form_element ) + '&ajax_type=ControlTweet_add', function( server_response_text ) { ajaxType( server_response_text, response_element, 'tweet', fill_element ); } );
}
/**
*Control - receives incoming requests for client use
*/
var Control = ( function ()
{
var Control = function ( type )
{
this.TIME = 4000;
this.type = type;
this.form_element = document.getElementById( type ),
this.response_element = document.getElementById( type + '_response' );
if( type === 'tweet' ) { this.fill_element = document.getElementById( type + '_fill' ); }
this.text_object = new TextValidator( this.form_element ),
this.message_object = new Message( this.response_element ),
this.effects_object= new Effects( this.response_element );
};
Control.prototype.invoke = function( )
{
if( Global.validate_input_on === 1 )
{
if( !this.text_object.checkEmpty() )
{
this.message_object.display( 'empty' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
switch( this.type )
{
case 'signin':
if( !this.text_object.checkPattern( 'email' ) )
{
this.message_object.display( 'email' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
if( !this.text_object.checkPattern( 'pass' ) )
{
this.message_object.display( 'pass' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
break;
case 'signup':
if( !this.text_object.checkPattern( 'email' ) )
{
this.message_object.display( 'email' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
if( !this.text_object.checkPattern( 'name' ) )
{
this.message_object.display( 'name' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
if( !this.text_object.checkPattern( 'pass' ) )
{
this.message_object.display( 'pass' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
break;
case 'tweet':
if( !this.text_object.checkPattern( 'tweet' ) )
{
this.message_object.display( 'tweet' );
this.effects_object.fade( 'down', this.TIME );
return false;
}
break;
default:
}
}
var response_element = this.response_element;
if( this.type === 'tweet' ) { var fill_element = this.fill_element; }
new Ajax().invoke( serializeArray( this.form_element ) + '&ajax_type=' + this.type + '_control', function( server_response_text ) { ajaxType( server_response_text, response_element, 'respond', fill_element ); } );
};
Control.tweet = function()
{
new Control( 'tweet' ).invoke();
}
Control.in = function()
{
new Control( 'signin' ).invoke();
};
Control.up = function()
{
new Control( 'signup' ).invoke();
};
Control.out = function()
{
new Ajax().invoke( '&ajax_type=ControlSignOut', function( server_response_text ) { ajaxType( server_response_text, 0, 'simple' ); } );
};
Control.try = function()
{
new Ajax().invoke( '&ajax_type=ControlTryIt', function( server_response_text ) { ajaxType( server_response_text, 0, 'simple' ); } );
};
Control.bookmarkDelete = function( event_pull )
{
event_pull.preventDefault();
domBookmarkDelete( this );
new Ajax().invoke( encodeURIComponent( this.name ) + "=" + encodeURIComponent( this.innerHTML ) + '&ajax_type=ControlBookmark_delete', function( ) { } );
}
return Control;
} () );