首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码合并与复杂性

代码合并与复杂性
EN

Stack Overflow用户
提问于 2012-04-13 22:07:11
回答 3查看 470关注 0票数 2

我有一些处理用户操作的模块--它们是控制模块。有6个,现在有5个,因为我合并了2个,它们非常类似于一个叫做Control的模块

我注意到的是,当我合并类似的code....it时,效率会有所下降。例如,在Control中,我现在有一个额外的逻辑语句来确定程序流。

代码语言:javascript
复制
if( this.type === 'signup' && !this.text_object.checkPattern( 'name' ) )

这个简单的行允许我将ControlSignIn和ControlSignUp结合起来,因为唯一的区别是检查注册中的名称,哪个签名没有。

我可以以这种方式继续,得到更复杂的代码,但是我的代码占用空间更小。

在(复杂性和运行时间)与(代码脚打印)之间有一种权衡。

我猜这不重要,但我只是想确认一下。

作为一个例子,我输入了ControlTweet,我也可以适应Control.

有问题吗?

我应该把ControlTweet和控制系统合并吗?

一般来说,你在哪里划线,或者这是一个优先考虑的问题?

控制

代码语言:javascript
复制
/**
 *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

代码语言:javascript
复制
/**
 *    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 ); } );
}

我最后使用的东西:

代码语言:javascript
复制
/**
 *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;
} () );
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-13 22:24:54

这是一个相当主观的问题,因为当涉及到合并代码时,每个人都会有自己的偏好,而且它也是本地化的,因为它可能因项目而异。尽管如此,显然还有一条线要画,因为您不希望将所有内容合并到一个处理所有事情的大规模main()函数中,然后再进行一些处理。

有两个编程经验规则可以帮助您:

Yourself)

  • Premature

  • DRY(不要重复优化=== )

现在,DRY原则规定--如果合理的话--您应该将类似的代码合并到可重用的模块中。这里的关键字是类似的代码,因为有时即使冒重复代码的风险,也有可能有多个单独的模块。原因是,您还必须考虑代码的维护和可读性,当您以DRY的名义开始合并不同的模块时,它可能会成为可读性的噩梦。

我还提到了过早的优化,因为您提出了小占用空间与代码复杂性的概念。我建议您忘记这一点,将代码占用留给压缩/压缩。

为了最终回答你的问题,我会亲自组合模块。但是,这最终应该是您的决定,因为您是必须维护该代码的人。只需记住正确地评论和记录每件事,这样你才不会在黑暗中迷失,当你在几个月后再次访问时。

票数 2
EN

Stack Overflow用户

发布于 2012-04-13 22:22:51

代码应该产生您想要的、可读的、可测试的结果,并且不管语言如何,都应该具有所需的性能

你试图在主观的“可读性”和不必要的“绝对最快的”之间找到一个平衡点。我想说的是--对来说,任何可读的都是好的,除非您在满足要求的性能方面遇到问题(必须首先有度量/目标.)。

票数 1
EN

Stack Overflow用户

发布于 2012-04-14 00:34:35

答案是继承。获取公共部分,并将它们放在父类中,然后在其中继承它们。为不同的调用添加一组if语句有点像一种继承攻击。一旦我学会了如何在JS中这样做,我就会发布代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10148924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档