何时组合通用功能?-带有初始化的公共静态对象

When to combine common functionality? - A public static object w/ initialization

本文关键字:初始化 对象 静态 组合 功能 何时      更新时间:2023-09-26

当我编码。。。我看到一些代码看起来有点像。。我知道在我的代码中有多余的功能显然是不好的。

然而,这是绝对的吗?0冗余?我下面有两个函数,看起来有点像。ViewH.书签和ViewH.推特.

我正试图决定是否应该将通用功能提取到一个名为ViewH.mark().的函数中

编辑

var ViewH = {
    MARK: 
    {
        FIELD:      '|',
        ROW:        '||',
        PASS:       '<xx_p>',
        FAIL:       '<xx_f>'
    },
    return_string:  '',
    mark: function(passed_function, embeddedAml)
    {
        var return_string,
            first_split, 
            element_count, 
            second_split;
        return_string = '';
        first_split = embeddedAml.split( ViewH.MARK.ROW );
        for( element_count=0; element_count < first_split.length; element_count++)
        {
            second_split = first_split[element_count].split( ViewH.MARK.FIELD );
            passed_function(second_split);
        }
        return ViewH.return_string;
    },
    bookmark: function ( embeddedAml ) 
    {
        ViewH.return_string='';
        return ViewH.mark(ViewH.bookmark_inner, embeddedAml);
    },
    tweet: function ( embeddedAml ) 
    {
        ViewH.return_string='';
        return ViewH.mark(ViewH.tweet_inner, embeddedAml);
    },
    portfolio: function ( embeddedAml ) 
    {
        ViewH.return_string='';
        return ViewH.mark(ViewH.portfolio_inner, embeddedAml);
    },
    bookmark_inner: function ( second_split )
    {
        ViewH.return_string = ViewH.return_string 
        + '<img name="bo_im" class="c" src="'
        + 'http://www.google.com/s2/favicons?domain=' 
        + second_split[0] 
        + '" onerror="Arc.BookmarkError(this)"><a target="_blank" name="bookmark_link" class="b" href = "' 
        + second_split[1] 
        + '">' 
        + second_split[2] 
        + '</a>';
    },
    tweet_inner: function ( second_split )
    {
        ViewH.return_string = ViewH.return_string 
        + '<div class="Bb2b"><img class="a" src="' 
        + Constant.PICTURES + second_split[ 0 ] 
        + '.jpg" alt=""/><a class="a" href="javascript:void(0)'">' 
        + second_split[ 1 ]  
        + ' posted ' 
        + ViewH.pretty( second_split[ 2 ],second_split[ 3 ] ) 
        + '</a><br/><p class="c">' 
        + second_split[ 4 ] 
        + '</p></div>';
    },
    portfolio_inner: function ( second_split )
    {
        if( ( second_split[ 1 ] === 'docx' ) || ( second_split[ 1 ] === 'xlsx' ) )
        {   
            ViewH.return_string = ViewH.return_string 
            + '<img name="bo_im" class="c" src="' 
            + Constant.IMAGES + second_split[1] 
            + '.ico"><a target="_blank" name="bookmark_link" class="b" href = "/' 
            + Constant.ROOT 
            + second_split[1] 
            + '/' 
            + second_split[0] 
            + '.' 
            + second_split[1] 
            + '">' 
            + second_split[0] 
            + '.' 
            + second_split[1] 
            + '</a>';
        }
        else
        {
            ViewH.return_string=ViewH.return_string 
            + '<simg name="bo_im" class="c" src="' 
            + Constant.IMAGES 
            + 'generic' 
            + '.ico"><a target="_blank" name="bookmark_link" class="b" href = "' 
            + Constant.TEXT 
            + second_split[0] 
            + '.txt">' 
            + second_split[0] 
            + '.' 
            + second_split[1] 
            + '</a>';
        }
    },

这是一个很好的问题,但没有适用于所有情况的答案。这将真正取决于你的代码是什么样子的。冗余通常是要避免的,但有时更糟糕的是过度设计代码,并试图将其放入一个并不真正适合的盒子中。

在您的情况下,您肯定可以从获取通用代码并将其引入通用方法中受益。看起来方法之间的唯一区别是渲染部分,将渲染函数传递到"标记"方法中很简单。

你的"标记"方法看起来有点像这样:

mark: function(embeddedAml, renderer) {
    var return_string,
        first_split, 
        element_count, 
        second_split;
    return_string = '';
    first_split = embeddedAml.split( ViewH.MARK.ROW );
    for( element_count=0; element_count < first_split.length; element_count++)
    {
        second_split = first_split[element_count].split( ViewH.MARK.FIELD );
        return_string = return_string + renderer(second_split);
    }
    return return_string;
}

你会保留你的书签和推特方法,但它们也会改变:

bookmark: function (embeddedAml) {
    return this.mark(embeddedAml, function(data) {
        return '<img name="bo_im" class="c" src="' + 
        'http://www.google.com/s2/favicons?domain=' +
        data[0] + 
        '" onerror="Arc.BookmarkError(this)"><a target="_blank" name="bookmark_link" class="b" href = "' +
        data[1] + '">' + 
        data[2] + '</a>'
    });
}

现在,您的渲染代码(唯一不同的代码)是独立控制的,但重叠的代码在一个公共位置,如果它发生更改,您只需在一个位置更新它。

一般来说,是的。

一个决定因素是代码是否是巧合地相似,或者是因为它执行了类似的任务。如果后者是真的,那么你将来是否应该更改其中一个的功能(特别是共享的那部分功能),你是否也想更改另一个中的功能?如果是这样,那么您的决定就很容易了——尽可能合并代码。

即使代码是相似的,创建一个通用库函数来清理代码仍然是有意义的。

我肯定会尝试将它们组合起来。您会注意到for循环的主体是两者之间唯一不同的部分。这里有一种方法(大部分ViewH被忽略):

var ViewH = {
    bookmark: function(embeddedAml) {
        return ViewH.combinedFunc(embeddedAml, function(parts) {
            return '<img name="bo_im" class="c" src="' + 
                   'http://www.google.com/s2/favicons?domain=' +
                   parts[0] + 
                   '" onerror="Arc.BookmarkError(this)"><a target="_blank" name="bookmark_link" class="b" href = "' +
                   parts[1] + '">' + 
                   parts[2] + '</a>';
        });
    },
    combinedFunc: function (embeddedAml, handler) {
        var return_string,
            first_split, 
            element_count, 
            second_split;
        return_string = '';
        first_split = embeddedAml.split(ViewH.MARK.ROW);
        for(element_count=0; element_count < first_split.length; element_count++) {
            second_split = first_split[element_count].split(ViewH.MARK.FIELD);
            return_string = return_string + handler(second_split);
        }
        return return_string;
    },
}

您可以很容易地为tweet做同样的事情。很明显,您希望将函数命名为比combinedFunc更好的名称,但您需要根据上下文选择该名称。